51单片机+DS1302+数码管制作时钟

使用51单片机、DS1302时钟芯片和7段数码管构建时钟,因IO口不足引入74HC164移位寄存器,但串口速度导致数码管显示闪烁。作者计划改用液晶屏重做项目,目前的实现作为初步尝试。

实验目的:

用51单片机+时钟芯片DS1302+7段数码管制作时钟。

6个7段数码管,单片机IO口不够用,增加移位74HC164,串口驱动。

这个带来了个问题,串口速度太慢,6个数码管,移位的时间已经长到肉眼可见,所以显示效果是一闪一闪的。

准备换液晶屏重新做一个,这个算是初稿,仅当记录一下吧。

proteus原理图:

代码:

#include <reg51.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int

sbit DAT=P3^0;
sbit CLK=P3^1;
sbit CLR=P3^2;
sbit LED_ON=P3^3;

sbit RTC_DAT=P1^0;
sbit RTC_CLK=P1^1;
sbit RTC_RST=P1^2;

uchar code num[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar yy,mm,dd,hh,mm,ss;

//延时10ms
void delay10ms(uint n)
 {
   uchar i,j;
   for(;n>0;n--)
   {
      for(i=0;i<18;i++)
      {
	 for(j=0;j<184;j++){;}
      }
   }
 }
 
//DS1302写8位地址和数据 
void RTC_wcom(uchar addr,uchar wdata)
{
   uchar i,j;
   RTC_RST=0;
   RTC_CLK=1;
   RTC_RST=1;
   for(i=0;i<8;i++)
   {
      RTC_DAT=addr >> i & 0x01;
      RTC_CLK=0;
      RTC_CLK=1;
   }
   for(j=0;j<8;j++)
   {
      RTC_DAT=wdata >> j & 0x01;
      RTC_CLK=0;
      RTC_CLK=1;
   }
   RTC_CLK=1;
   RTC_RST=0;
}

//DS1302读数据
int RTC_rcom(uchar addr)
{
   uchar i,rdata=0;
   RTC_RST=1;
   for(i=0;i<8;i++)
   {
      RTC_CLK=0;
      RTC_DAT=addr>>i & 0x01;
      RTC_CLK=1;
   }
   for(i=0;i<8;i++)
   {
      RTC_CLK=1;
      RTC_CLK=0;
      if(RTC_DAT)
      rdata |= (0x01<<i);
   }
   RTC_DAT=0;
   RTC_CLK=1;
   RTC_RST=0;
   return rdata;
}

//DS1302初始化
void RTC_init(void)
{
   RTC_wcom(0x8e,0x00);	//00允许写,80写保护
   RTC_wcom(0x8c,0x00);	//年,00~99,初始00
   RTC_wcom(0x88,0x01);	//月,01~12,初始01    
   RTC_wcom(0x86,0x01);	//日,01~31,初始01   
   RTC_wcom(0x84,0x12);	//时,00~23,初始12
   RTC_wcom(0x82,0x00);	//分,00~59,初始00
   RTC_wcom(0x80,0x00);	//秒,00~59,初始00
}

//装载数据
void num_wr(uchar n)
{
   uchar i;
   for(i=0;i<8;i++)
   {
      CLK=0;
      DAT=(num[n]>>(7-i)) & 0x01;
      CLK=1;
   }
}

void display(void)
{
   CLR=1;
   LED_ON=1;
   num_wr(ss%16);	//寄存器的数据都是0~9的,16进制与10进制相同
   num_wr(ss/16);	//所以可以不转化为10进制,直接取高位低位
   num_wr(mm%16);
   num_wr(mm/16);
   num_wr(hh%16);
   num_wr(hh/16);
   LED_ON=0;
   delay10ms(100);
}


void main(void)
 { 
   RTC_init();
   while (1)
   {
      yy=RTC_rcom(0x8d);
      mm=RTC_rcom(0x89);
      dd=RTC_rcom(0x87);
      hh=RTC_rcom(0x85);
      mm=RTC_rcom(0x83);
      ss=RTC_rcom(0x81);
      display();
   }
 }

 

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值