找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3661|回复: 0
收起左侧

单片机实时时钟DS1302串口发送数据源码

[复制链接]
ID:207313 发表于 2018-5-6 10:30 | 显示全部楼层 |阅读模式
这是我根据开发手册和自己的开发板编写的使用DS1302的一些实用程序
0.png

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

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

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

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

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

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

  210.         Send_char('-');

  211.     Send_char(readtime[4]+'0');//月
  212.         Send_char(readtime[5]+'0');

  213.         Send_char('-');

  214.     Send_char(readtime[6]+'0');//日
  215.         Send_char(readtime[7]+'0');

  216.         Send_char(' ');

  217.         Send_char(readtime[8]+'0');//时
  218.         Send_char(readtime[9]+'0');

  219.         Send_char(':');

  220.         Send_char(readtime[10]+'0');//分
  221.         Send_char(readtime[11]+'0');

  222.         Send_char(':');

  223. ……………………

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

所有资料51hei提供下载:
实时时钟模块 DS1302模块 带电池CR2032 掉电走时.rar (476.05 KB, 下载次数: 74)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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