久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3930|回復: 0
打印 上一主題 下一主題
收起左側

單片機實時時鐘DS1302串口發送數據源碼

[復制鏈接]
跳轉到指定樓層
樓主
這是我根據開發手冊和自己的開發板編寫的使用DS1302的一些實用程序


單片機源程序如下:
  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)




分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

無效樓層,該帖已經被刪除
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 在线成人 | 国产乱码久久久 | 久久www免费人成看片高清 | 久久精品国产一区二区电影 | 欧美美女爱爱视频 | 九九亚洲 | 国产精品久久久久久久免费观看 | 91亚洲精选 | 久久69精品久久久久久国产越南 | 999久久久 | 婷婷丁香综合网 | 九九在线精品视频 | 91传媒在线观看 | 日本一二三区高清 | 黄色精品 | 欧美一级片中文字幕 | 色综合99 | 五月网婷婷| 欧美精品电影一区 | 亚洲 欧美 日韩在线 | 亚洲免费久久久 | 欧美综合一区二区三区 | 成人在线观看免费视频 | 久久亚洲欧美日韩精品专区 | 国产精品揄拍一区二区 | 国产综合久久 | 国产欧美日韩一区 | 一区二区三区欧美 | 欧洲亚洲视频 | 国产激情视频网址 | 欧美一区二区三区高清视频 | 黄色av网站免费看 | 欧美乱码精品一区二区三区 | 日韩不卡视频在线 | 日朝毛片| 亚洲欧美精品 | 亚洲综合在线一区 | 亚洲精品久久久蜜桃 | 黄色网址免费在线观看 | 欧美成人一区二区三区 | 成人精品一区二区三区中文字幕 |