找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4140|回复: 4
打印 上一主题 下一主题
收起左侧

DS1302实时时钟 串口和LCD显示程序及DS1302中文数据手册

[复制链接]
跳转到指定楼层
楼主
DS1302资料包:


DS1302中文数据手册内容截图如下:


DS1302实时时钟串口显示的单片机源程序如下:
  1. /*******************说明:**************************
  2. 将实时时钟数据通过串口发送
  3. **************************************************/
  4. #include <reg52.h>
  5. #define uchar unsigned char
  6. #define uint  unsigned int
  7. //DS1302引脚定义,可根据实际情况自行修改端口定义
  8. sbit RST=P3^7;
  9. sbit IO=P3^5;
  10. sbit SCK=P3^6;
  11. //DS1302地址定义
  12. #define ds1302_sec_add                        0x80                //秒数据地址
  13. #define ds1302_min_add                        0x82                //分数据地址
  14. #define ds1302_hr_add                        0x84                //时数据地址
  15. #define ds1302_date_add                        0x86                //日数据地址
  16. #define ds1302_month_add                0x88                //月数据地址
  17. #define ds1302_day_add                        0x8a                //星期数据地址
  18. #define ds1302_year_add                        0x8c                //年数据地址
  19. #define ds1302_control_add                0x8e                //控制数据地址
  20. #define ds1302_charger_add                0x90                                          
  21. #define ds1302_clkburst_add                0xbe
  22. //初始时间定义
  23. uchar time_buf[8] = {0x20,0x12,0x02,0x29,0x12,0x03,0x00,0x02};//初始时间
  24. uchar readtime[14];//当前时间
  25. uchar sec_buf=0;  //秒缓存
  26. uchar sec_flag=0; //秒标志位
  27. uchar writetime_flag=0;
  28. //功能:延时1毫秒
  29. //入口参数:x
  30. //出口参数:无
  31. //说明:晶振为12M
  32. void Delay_xms(uint x)
  33. {
  34.   uint i,j;
  35.   for(i=0;i<x;i++)
  36.     for(j=0;j<112;j++);
  37. }
  38. //DS1302初始化函数
  39. void ds1302_init(void)
  40. {
  41.         RST=0;                        //RST脚置低
  42.         SCK=0;                        //SCK脚置低
  43. }
  44. //向DS1302写入一字节数据
  45. void ds1302_write_byte(uchar addr, uchar d)
  46. {
  47.         uchar i;
  48.         RST=1;                                        //启动DS1302总线       
  49.         //写入目标地址:addr
  50.         addr = addr & 0xFE;   //最低位置零,寄存器0位为0时写,为1时读
  51.         for (i = 0; i < 8; i ++) {
  52.                 if (addr & 0x01) {
  53.                         IO=1;
  54.                         }
  55.                 else {
  56.                         IO=0;
  57.                         }
  58.                 SCK=1;      //产生时钟
  59.                 SCK=0;
  60.                 addr = addr >> 1;
  61.                 }       
  62.         //写入数据:d
  63.         for (i = 0; i < 8; i ++) {
  64.                 if (d & 0x01) {
  65.                         IO=1;
  66.                         }
  67.                 else {
  68.                         IO=0;
  69.                         }
  70.                 SCK=1;    //产生时钟
  71.                 SCK=0;
  72.                 d = d >> 1;
  73.                 }
  74.         RST=0;                //停止DS1302总线
  75. }

  76. //从DS1302读出一字节数据
  77. uchar ds1302_read_byte(uchar addr) {

  78.         uchar i,temp;       
  79.         RST=1;                                        //启动DS1302总线
  80.         //写入目标地址:addr
  81.         addr = addr | 0x01;    //最低位置高,寄存器0位为0时写,为1时读
  82.         for (i = 0; i < 8; i ++) {
  83.                 if (addr & 0x01) {
  84.                         IO=1;
  85.                         }
  86.                 else {
  87.                         IO=0;
  88.                         }
  89.                 SCK=1;
  90.                 SCK=0;
  91.                 addr = addr >> 1;
  92.                 }       
  93.         //输出数据:temp
  94.         for (i = 0; i < 8; i ++) {
  95.                 temp = temp >> 1;
  96.                 if (IO) {
  97.                         temp |= 0x80;
  98.                         }
  99.                 else {
  100.                         temp &= 0x7F;
  101.                         }
  102.                 SCK=1;
  103.                 SCK=0;
  104.                 }       
  105.         RST=0;                                        //停止DS1302总线
  106.         return temp;
  107. }
  108. //向DS302写入时钟数据
  109. void ds1302_write_time(void)
  110. {
  111.     writetime_flag=ds1302_read_byte(0x80);
  112.         if(writetime_flag&0x80)
  113.         {
  114.         ds1302_write_byte(ds1302_control_add,0x00);                        //关闭写保护
  115.         ds1302_write_byte(ds1302_sec_add,0x80);                                //暂停时钟
  116.         //ds1302_write_byte(ds1302_charger_add,0xa9);            //涓流充电
  117.         ds1302_write_byte(ds1302_year_add,time_buf[1]);                //年
  118.         ds1302_write_byte(ds1302_month_add,time_buf[2]);        //月
  119.         ds1302_write_byte(ds1302_date_add,time_buf[3]);                //日
  120.         ds1302_write_byte(ds1302_hr_add,time_buf[4]);                //时
  121.         ds1302_write_byte(ds1302_min_add,time_buf[5]);                //分
  122.         ds1302_write_byte(ds1302_sec_add,time_buf[6]);                //秒
  123.         ds1302_write_byte(ds1302_day_add,time_buf[7]);                //周
  124.         ds1302_write_byte(ds1302_control_add,0x80);                        //打开写保护     
  125.     }
  126. }
  127. //从DS302读出时钟数据
  128. void ds1302_read_time(void)  
  129. {
  130.         time_buf[1]=ds1302_read_byte(ds1302_year_add);                //年
  131.         time_buf[2]=ds1302_read_byte(ds1302_month_add);                //月
  132.         time_buf[3]=ds1302_read_byte(ds1302_date_add);                //日
  133.         time_buf[4]=ds1302_read_byte(ds1302_hr_add);                //时
  134.         time_buf[5]=ds1302_read_byte(ds1302_min_add);                //分
  135.         time_buf[6]=(ds1302_read_byte(ds1302_sec_add))&0x7f;//秒,屏蔽秒的第7位,避免超出59
  136.         time_buf[7]=ds1302_read_byte(ds1302_day_add);                //周        
  137. }
  138. //串口初始化(系统晶振为12MHz)
  139. void Uart_init(uchar Baud_flag)
  140. {
  141.    TMOD = 0x20;       //T1 2
  142.    PCON = 0x00;       //SMOD = 0
  143.    SCON = 0x50;              //串口1 8
  144.    switch(Baud_flag)
  145.    {          
  146.     case 0x00:        //2400 11.0592M:0xf4
  147.           TH1=0xf3;
  148.           TL1=0xf3;
  149.         break;
  150.         case 0x01:        //4800 11.0592M:0xfa
  151.           TH1=0xf9;
  152.           TL1=0xf9;
  153.         break;
  154.     case 0x02:        //9600 11.0592M:0xfd
  155.           TH1=0xfd;
  156.           TL1=0xfd;
  157.         break;
  158.     case 0x03:        //19200 11.0592M:0xfe
  159.       TH1=0xfd;
  160.           TL1=0xfd;
  161.     break;
  162.         default:          //默认为2400
  163.           TH1=0xf3;
  164.           TL1=0xf3;
  165.         break;
  166.    }
  167.    TR1 = 1;                  //启动定时器1                                                               
  168.    ES=1;              //开串口中断
  169.    EA=1;              //开总中断      
  170. }
  171. //串口发送
  172. void Send_char(uchar ch)
  173. {
  174. SBUF=ch;
  175. while(!TI);      //等待发送完毕
  176. TI=0;           //清中断
  177. }
  178. //主函数
  179. void main(void)
  180. {
  181. Delay_xms(50);//等待系统稳定
  182. ds1302_init(); //DS1302初始化
  183. Uart_init(0); //波特率初始化为2400
  184. Delay_xms(10);
  185. ds1302_write_time(); //写入初始值
  186. while(1)
  187.   {
  188.   ds1302_read_time();  //读取时间
  189.   readtime[0]=(time_buf[0]>>4);   //分离出年千位
  190.   readtime[1]=(time_buf[0]&0x0F); //分离出年百位
  191.   readtime[2]=(time_buf[1]>>4);   //分离出年十位
  192.   readtime[3]=(time_buf[1]&0x0F); //分离出年个位

  193.   readtime[4]=(time_buf[2]>>4);   //分离出月十位
  194.   readtime[5]=(time_buf[2]&0x0F); //分离出月个位

  195.   readtime[6]=(time_buf[3]>>4);   //分离出日十位
  196.   readtime[7]=(time_buf[3]&0x0F); //分离出日个位

  197.   readtime[8]=(time_buf[4]>>4);   //分离出小时十位
  198.   readtime[9]=(time_buf[4]&0x0F); //分离出小时个位
  199.   readtime[10]=(time_buf[5]>>4);   //分离出分钟十位
  200.   readtime[11]=(time_buf[5]&0x0F); //分离出分钟个位
  201.   readtime[12]=(time_buf[6]>>4);   //分离出秒钟十位
  202.   readtime[13]=(time_buf[6]&0x0F); //分离出秒钟个位   
  203.   if(readtime[13]!=sec_buf)      
  204.    {
  205.     EA=0;
  206.     sec_flag=0;   
  207.         sec_buf=readtime[13];          
  208.     Send_char(readtime[0]+'0');//年
  209.         Send_char(readtime[1]+'0');     
  210.     Send_char(readtime[2]+'0');
  211.         Send_char(readtime[3]+'0');   

  212.         Send_char('-');

  213.     Send_char(readtime[4]+'0');//月
  214.         Send_char(readtime[5]+'0');

  215.         Send_char('-');
  216. ……………………

  217. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
_DS1302实时时钟模块.rar (477.46 KB, 下载次数: 69)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2017-5-31 03:53 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

板凳
ID:206228 发表于 2017-5-31 08:37 | 只看该作者
very good
回复

使用道具 举报

地板
ID:206532 发表于 2017-5-31 22:47 | 只看该作者
很棒???!!!!
回复

使用道具 举报

5#
ID:726581 发表于 2020-4-12 14:30 | 只看该作者
正在学习1302的使用,好东西
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表