基于DS1302芯片---使用51单片机C语言编制的电子时钟(液晶1602显示)

来源:互联网 发布:上淘宝组装电脑可靠吗 编辑:程序博客网 时间:2024/04/20 08:14

这可以当做学习单片机之后的第一套作品

  做单片机这块确实非常有趣,比原来单纯的编程要好多了,即动脑又动手,而且很容易入门。跟着网上down的郭天翔视频教程学完了理论之后开始动手制作电子时钟,电路就是一般的电路:一块洞洞板,几个芯片座,杜邦线就OK了,至于排针用不用都行,可以直接把杜邦线焊在芯片座上。

     电路搞定之后就是连线,根据DS1302芯片说明书(pdf等)里面的引脚介绍来考虑把这些引脚连到单片机的相关引脚上。Vcc2引脚就接Vcc,Vcc1接3V纽扣电池,GND接地,X1 X2 32.768KHz 晶振管脚,此外就是  3个信号线啦!
RST 复位脚
I/O 数据输入/输出引脚
SCLK 串行时钟

我们还可以焊上串口母头,外加一片Max232,这样就可以直接和板子上的单片机(我用的是STC89C52RC)串口通讯

Lcd1602用的是P0口,要焊上8个10K的上拉电阻;

还有一个温度传感器18b20,实现代码如下

uint rd_temperature()  //读取温度值

 uchar a=0,b=0;
 uint t=0;
 float tt=0;
 rst_18b20();  //复位
 wr_18b20(0xcc);  //跳过ROM
 wr_18b20(0x44);  //启动温度转换
 rst_18b20();  //再次对18B20操作时,需要重新复位一次
 wr_18b20(0xcc);  //跳过ROM
 wr_18b20(0xbe);  //读取内部RAM的内容
 a=rd_18b20();  //读温度值低位(内部RAM的第0个字节)
 b=rd_18b20();  //读温度值高位(内部RAM的第1个字节)
 t=b;
 t<<=8;    //温度值的高8位放在t的高8位
 t=t|a;    //温度值的低8位放在t的低8位
 if(t<0x0fff)  //判断温度值得正负值
     tflag=0;  //tflag=0温度值为正
    else
   {
  t=~t+1;   //温度值为负,负值以补码形式存放,这里要将其还原成原码
  tflag=1;  //tflag=1温度值为负
   }
 tt=t*0.0625;
 t = tt*100 ;   
 return(t);
 
}

//***********************************************//

 

void tem_conv()   //温度转换
   {  
    uchar flagdat ;//定义温度值符号
    if(tflag==0)
    temdata[4]=flagdat=0x20;//温度为正不显示符号
       else
     temdata[4]=flagdat=0x2d;//负温度显示负号:-
     temdata[0]=tdat/1000+0x30;//温度十位
        temdata[1]=tdat%1000/100+0x30;//温度个位
        temdata[2]=tdat%100/10+0x30;//小数十位
        temdata[3]=tdat%10+0x30;//小数百位
    /*if(temdata[0]==0x30)
        {temdata[0]=0x20;//

         if(temdata[1]==0x30)
         {
       temdata[1]=0x20;//
         }
        }*/
    
     }

再者就是一些开关了,可以用杜邦线相连。

   一切就绪之后就是编程,这里面要注意一点就是这个芯片第一次使用的时候需要一系列初始化设置,最重要的就是晶振起振:
DS1302_write_byte(0x8e,0x00) ;//允许写操作
DS1302_write_byte(0xc8,0xf0) ; //写入初始化标志 ,系统上电
。   


   接着就是年到秒的初始化如:

DS1302_write_byte(0x8c,0x10) ;//年

读时间为:

timedata[0] = DS1302_read_byte(0x8d) ; //年

 

 

 

定时闹铃蜂鸣器方法:void alarm_check(void)

秒表功能STOPWATCH

 

 

/****************************************************************
底层驱动函数(指定地址写一个字节的数据)
*****************************************************************/
 void DS1302_write_byte(uchar cmd , uchar dat)
{
 DS1302_SCLK = 0 ;
 DS1302_RST = 0 ;
 DS1302_RST = 1 ;
 DS1302_input(cmd) ;
 DS1302_input(dat) ;
 DS1302_RST = 0 ;
 DS1302_SCLK = 1 ;
}

/****************************************************************
底层驱动函数(指定地址读取一字节的数据)
*****************************************************************/
 uchar DS1302_read_byte(uchar cmd)
{
 uchar receivedata = 0 ;
 DS1302_SCLK = 0 ;
 DS1302_RST = 0 ;
 DS1302_RST = 1 ;
 DS1302_input(cmd) ;
 receivedata = DS1302_output() ;
 DS1302_RST = 0 ;
 DS1302_SCLK = 1 ;
 return(receivedata) ;
}

 

 

定时器T0,T1,T2都要使用;

 

 

 

接着就是串口中断实现串口通讯:

void Serial_Int() interrupt 4

 

uchar data Txddate[23];//电脑读单片机时间
uchar Rxddate[13];//电脑写单片机时间(同步调时)

 

 

 

再者就是刷新时间显示的方法及扫描按键控制调时的方法

void key_scan(void);

 

 

给出的void main(void)
{
 
  T2CON=0x04;           //设置T2CON寄存器 
 TMOD=0x21;
 TL2=0x00;
 TH2=0xdc;
 TL1=0xfd;
 TH1=0xfd;
 SCON=0x50;
 TR1=1;
 ET2=1;
 ES=1;
 EA=1;
 TH0 = 0xd8 ;
 TL0 = 0xf0 ;
 ET0 = 1 ;
 TR0 = 0 ;

///////////读者自己借鉴

 

这是电脑读单片机时间和电脑同步调时的VB程序,

为简单Text最后的1指MONDAY

 

参考资料:http://www.ctdisk.com/u/665442

 

!!!!!!!!!!!!!!!!!!!!!!!!!!

!!!!!!!!!!!!!!!!!!!!!!!!!!

这就是简单的电子时钟程序

 

 

 

 

 

原创粉丝点击