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

標題: 搭棚焊了一個高精度時鐘送小姑娘(DS3231+89c52單片機) [打印本頁]

作者: lxinq    時間: 2018-12-27 11:26
標題: 搭棚焊了一個高精度時鐘送小姑娘(DS3231+89c52單片機)
前幾天在網上閑逛發現有人搭棚焊了一個時鐘,一時心動想自己也做一個送小姑娘。

說干咱就干,從萬能的X寶上下單,幾天貨到!

先簡單畫了個草圖
開焊,過程就不發圖了,看成品。89c52+ds1302+18b20+共陽時鐘數碼管
串口線直接焊在10、11腳上,寫程序。成了。!




拷了幾天機,發現時間不準,平均每天慢十幾分鐘,查了一下說是晶振沒選好,電容沒匹配。哎!調了幾次沒搞好,也不想再調試了。



有人說DS3231好用,于是換方案。

同樣草圖



為了焊的好看一點,數碼管自定義。
早晨上班,等紅燈時發現一女司機抱著狗兒開車。

過程不多,看成品。還是串口線直接下載。底座是電池盒,用三節5號電池。不知能用多久,沒測過電工作電流。沒有萬用表。你信嗎,試驗室里竟然沒有萬用表!
后來焊了一個USB接口可以手機充電器供電。




拷機一個月快了55秒!哎!勉強接授吧!



最后附上電路圖和程序,這是我做完以后畫的,各實際的不太一樣,特別是單片機和數碼管之間的連接不一樣,所以才用了自定義的顯示字庫,其它的也不知有沒有錯誤。
程序奉上一部分,其它的請下載吧!賺點積分!

單片機源碼:
  1. #include <reg52.h>
  2. #include<intrins.h>[/color][/align][align=left][color=#000000]#define uchar unsigned char
  3. #define uint  unsigned int[/color][/align][align=left][color=#000000]
  4. sbit SDA=P2^7;     //數據傳送位SDA        
  5. sbit SCL=P2^6;     //時鐘控制位SCL
  6. sbit INT=P3^3;     //中斷位
  7. sbit RESET=P3^2;   //復位
  8. sbit smg4=P1^1;    //位碼1聲明 分個位
  9. sbit smg3=P1^3;    //位碼2聲明 分十位
  10. sbit smg2=P1^5;    //位碼3聲明 時個位
  11. sbit smg1=P1^7;    //位碼4聲明 時十位
  12. sbit k1=P1^4;      //按鍵k1的聲明
  13. sbit k2=P1^6;      //按鍵k2的聲明
  14. sbit k3=P3^7;      //按鍵k3的聲明
  15. sbit bell=P3^5;    //蜂鳴器聲明
  16. sbit gm=P2^1;      //測光聲明,黑暗時等于1[/color][/align]
  17. bit gm_en=0;       //光敏使能信號;
  18. bit  ack;          //應答標志位
  19. char code dis_code[]={0X28,0XEE,0X32,0XA2,0XE4,0XA1,0X21,0XEA,0X20,0XA0,0X60,0X25,0X37,0X26,0X31,0X71};//數碼管沒有按a-h的順序連接,自定義的顯示字庫,0-9,A-F
  20. uchar bell_en=0,x=1;//鬧鐘使能信號,任意鍵關閉鈴聲標志位
  21. uchar tabtime[]={0x00,0x00,0x07,0x02,0x23,0x10,0x18};                //首次上電時默認的時間2018年 星期二 10月23日 07:00:00
  22. uchar year,month,day,week,hour,minute,second,temperature;             //從1302讀出的實時時間數據
  23. uchar gm_time=60,temp_en=0,n=0,a=0,b=0;       //gm_time光敏控制亮度值,n是按鍵標志位,a產生一個1秒的計時,b控制字符閃爍,temp_en溫度顯示標志
  24. uint  t=0;      //用來產生30秒的計時
  25. uint  TtempH,TtempL;    //定義溫度高位,低位
  26. char shi,fen,miao,b_shi=7,b_fen=0; //必須使用符號型:數據暫存單元shi/fen/miao,鬧鈴時間b_shi,b_fen,
  27. void baojing();               //報警函數
  28. void delay_50us(uint t);      //延時50*T微妙函數的聲明
  29. void Start_I2C();             //I2C總線產生起始信號函數
  30. void Stop_I2C();              //I2C總線產生停止信號函數
  31. void Ack_I2C(bit a);          //接收應答信號函數;
  32. void SendByte(uchar c);       //向I2C總線寫入一個字節的數據函數
  33. uchar RcvByte();              //字節數據接收函數
  34. uchar write_byte(uchar addr, uchar write_data);//將一個字節寫入DS3231指定地址
  35. uchar read_byte(uchar addr);  //從DS3231指定地址讀一個字節
  36. void Set_Time();              //設置時間
  37. void get_time(void);          //讀取時間
  38. void get_Temperature();       //讀取溫度
  39. void show_Temperature();      //顯示溫度
  40. void init();                  //初始化函數
  41. void timer0();                //定時器0中斷服務程序
  42. void display(uchar s,f);      //顯示子程序
  43. void key();                   //按鍵控制函數

  44. void baojing()//報警函數
  45. {
  46.    uint j=10,i=10;
  47.    bell=0;
  48.    while(i--)display(shi,fen);
  49.    bell=1;
  50.    while(j--)display(shi,fen);
  51. }

  52. //函數名稱:void delay_50US(unsigned int t)
  53. //功能: 延時50*t(us)
  54. void delay_50us(uint t)
  55. {
  56.   unsigned char j;
  57.   for(;t>0;t--)
  58.   {
  59.     for(j=19;j>0;j--);
  60.   }
  61. }

  62. void Start_I2C()            //I2C總線產生起始信號函數
  63. {
  64.     SDA=1;                  //拉高數據線,發送起始條件的數據信號
  65.     SCL=1;                  //拉高時鐘線
  66.     SDA=0;                  //在時鐘線為高電平時,拉低數據線,產生起始信號
  67.     SCL=0;                  //鉗住I2C總線,準備發送或接收數據
  68. }

  69. void Stop_I2C()             //I2C總線產生停止信號函數
  70. {
  71.     SDA=0;                  //拉低數據線,發送結束條件的數據信號
  72.     SCL=1;                  //拉高時鐘線,發送結束條件的時鐘信號
  73.     SDA=1;                  //時鐘時線為高電平時,拉高數據線,發送I2C總線結束信號
  74. }

  75. /********************************************************************
  76.                       應答子函數
  77. 函數原型:   void I2CACK(bit a);
  78. 功能:       主控器進行應答信號(可以是應答或非應答信號,由位參數a決定)
  79. ********************************************************************/
  80. void Ack_I2C(bit a)         //接收應答信號函數;a是定義的一個位變量,來暫存應答狀態。
  81. {

  82.     if(a==0)
  83.         SDA=0;              //在此發出應答或非應答信號
  84.     else
  85.         SDA=1;
  86.     SCL=1;
  87.     SCL=0;                  //清時鐘線,鉗住I2C總線以便繼續接收
  88. }


  89. /*******************************************************************
  90.                   字節數據發送函數               
  91. 函數原型:     void   SendByte(uchar c);
  92. 功能:      將數據c發送出去,可以是地址,也可以是數據,發完后等待應答,并對
  93.            此狀態位進行操作.(不應答或非應答都使ack=0)
  94.            ack=1        發送數據正常,
  95.            ack=0        被控器無應答或損壞。
  96. ********************************************************************/
  97. void SendByte(uchar c)                      //向I2C總線寫入一個字節的數據函數
  98. {
  99.     uchar BitCnt;
  100.    
  101.     for(BitCnt=0;BitCnt<8;BitCnt++)         //要傳送的數據長度為8位
  102.     {
  103.         if((c<<BitCnt)&0x80)
  104.             SDA=1;                          //判斷發送位
  105.         else
  106.             SDA=0;               
  107.           SCL=1;                            //置時鐘線為高,通知被控器開始接收數據位
  108.           SCL=0;
  109.     }
  110.    
  111.     SDA=1;                                  //8位發送完后釋放數據線,準備接收應答位
  112.     SCL=1;
  113.     if(SDA==1)
  114.         ack=0;   
  115.     else
  116.         ack=1;                              //判斷是否接收到應答信號
  117.     SCL=0;
  118. }


  119. /*******************************************************************
  120.                   字節數據接收函數               
  121. 函數原型:     uchar   RcvByte();
  122. 功能:      用來接收從器件傳來的數據,并判斷總線錯誤(不發應答信號),
  123.            發完后請用應答函數應答從機。  
  124. ********************************************************************/
  125. uchar RcvByte()    //字節數據接收函數
  126. {
  127.    uchar retc;
  128.    uchar BitCnt;

  129.    retc=0;
  130.    SDA=1;                           //置數據線為輸入方式
  131.    for(BitCnt=0;BitCnt<8;BitCnt++)
  132.    {
  133.         SCL=0;                      //置時鐘線為低,準備接收數據位
  134.         SCL=1;                      //置時鐘線為高使數據線上數據有效
  135.         retc=retc<<1;
  136.         if(SDA==1)
  137.             retc=retc+1;            //讀數據位,接收的數據位放入retc中
  138.    }
  139.    SCL=0;
  140.    return(retc);
  141. }




  142. /***********將一個字節寫入DS3231指定地址***********/
  143. uchar write_byte(uchar addr, uchar write_data)
  144. {
  145.     Start_I2C();
  146.     SendByte(0xD0);
  147.     if (ack == 0)
  148.         return 0;
  149.    
  150.     SendByte(addr);   
  151.     if (ack == 0)
  152.         return 0;
  153.    
  154.     SendByte(write_data);
  155.     if (ack == 0)
  156.         return 0;
  157.    
  158.     Stop_I2C();
  159.     return 1;
  160. }
  161. /************從DS3231指定地址讀一個字節************/
  162. uchar read_byte(uchar addr)
  163. {
  164.     uchar read_data;
  165.     Start_I2C();
  166.     SendByte(0xD0);
  167.     if(ack==0)
  168.         return(0);
  169.    
  170.     SendByte(addr);
  171.     if(ack==0)
  172.         return(0);

  173.     Start_I2C();
  174.     SendByte(0xD1);
  175.     if(ack==0)
  176.         return(0);
  177.     read_data = RcvByte();
  178.     Ack_I2C(1);
  179.     Stop_I2C();
  180. return read_data;
  181. }


  182. /**************************設置時間******************************************/

  183. void Set_Time()
  184. {
  185.     uchar i;
  186.     uchar ucAddr=0x00;      //秒的地址
  187.     for(i=0;i<7;i++)
  188.     {
  189.        write_byte(ucAddr,tabtime[i]);//從秒開始連續寫入秒分時星期日月年
  190.        ucAddr+=1;
  191. }
  192. }



  193. /*********************讀取時間**********************/
  194. void get_time(void)
  195. {
  196.     hour=read_byte(0x02)/16*10+read_byte(0x02)%16;
  197. minute=read_byte(0x01)/16*10+read_byte(0x01)%16;    //因只顯示時、分,故可只讀取時、分
  198.     year=read_byte(0x06)/16*10+read_byte(0x06)%16;

  199. /*
  200.     uchar i;
  201. uchar ucCurtime[7];
  202. uchar ucAddr = 0x00;     //秒地址
  203. for(i=0;i<7;i++)
  204.         {ucCurtime[i]=0;}

  205. for(i=0; i<7; i++)
  206. {
  207.   ucCurtime[i] = read_byte(ucAddr);  //格式為: 從秒地址開始連續讀取,秒分時星期日月年。  
  208.   ucAddr += 1;
  209. }
  210. year=ucCurtime[6]/16*10+ucCurtime[6]%16;
  211. month=ucCurtime[5]/16*10+ucCurtime[5]%16;
  212. day=ucCurtime[4]/16*10+ucCurtime[4]%16;
  213. week=ucCurtime[3]/16*10+ucCurtime[3]%16;
  214. hour=ucCurtime[2]/16*10+ucCurtime[2]%16;
  215. minute=ucCurtime[1]/16*10+ucCurtime[1]%16;
  216. second=ucCurtime[0]/16*10+ucCurtime[0]%16;
  217. */
  218. }


  219. /*********************讀取溫度**********************/
  220. void get_Temperature()
  221. {
  222.     TtempH=read_byte(0X11);   //讀溫度高字節
  223. //因數碼管位數只有四位,故溫度的小數部分不顯示,可以不用讀溫度低字節
  224. //TtempL=read_byte(0x12);    //讀溫度低字節
  225. //TtempL=(TtempL>>6)*25;//將BIT7,BIT6的數據移入BIT1,BIT0位;分辨率數值擴大100倍便于整數運算
  226.    
  227. }
  228. ………………
復制代碼

完整程序代碼

原代碼.rar (4.87 KB, 下載次數: 165)


作者: baidi77    時間: 2018-12-27 18:57
學習了好帖
作者: zqy0812    時間: 2018-12-27 20:19
學習學習
作者: 周超然    時間: 2018-12-28 09:19
做的精致啊,你連洞洞板都省了,厲害
作者: tongyam    時間: 2018-12-28 10:36
ds1302匹配電容搭配好了,再加上高精度晶振,可以做到3天誤差1秒,做過好多這樣的表了
作者: lids    時間: 2018-12-28 10:49
DS3231供電要3.3V,走時誤差才小,5V供電誤差較大
作者: lxinq    時間: 2019-1-4 17:03
lids 發表于 2018-12-28 10:49
DS3231供電要3.3V,走時誤差才小,5V供電誤差較大

謝謝了,等我試試
作者: 51單片機1234    時間: 2019-1-21 13:36
謝謝樓主的分享
作者: f556    時間: 2019-1-21 14:32
動手能力可以,關鍵是“早晨上班,等紅燈時發現一女司機抱著狗兒開車”...《交通法》抱著狗狗開車罰款1元,扣12分。    狗狗
作者: 機智的愚人    時間: 2019-1-21 15:13
這個厲害了
作者: jialishoushi    時間: 2019-1-21 20:29
這個真不錯  學習下
作者: 雨夜明月我    時間: 2019-3-1 22:37
樓主,想問一下,你的資料里是DS3231的程序還是DS1302的程序???還望麻煩回一下,謝謝。!
作者: baibaoyu    時間: 2019-4-4 10:07
V這個真不錯  學習下
作者: huang0762    時間: 2019-4-4 12:08
焊的用心
作者: 心羽家電    時間: 2020-3-28 12:24
感謝樓主的資料 已經做成啦,我用共陽數碼管,程序稍微修改了一下,時間能正常顯示。但溫度只能顯示正的溫度是正常,到負溫度是就顯示不正常啦,望樓主指點迷津
作者: wsy06    時間: 2020-3-28 15:24
f556 發表于 2019-1-21 14:32
動手能力可以,關鍵是“早晨上班,等紅燈時發現一女司機抱著狗兒開車”...《交通法》抱著狗狗開車罰 ...

罰款一元??
作者: 加勒比小海盜    時間: 2020-3-29 09:08

ds1302做了個時鐘一天快70s左右,目前很郁悶
作者: 這一生只為你    時間: 2020-3-29 20:42
要是想省電的話,可以這樣做:單片機外部中斷接一個按鍵,單片機上電就進入掉電模式,然后按下按鍵喚醒,點亮LED輪流顯示溫度和時間,5秒到10秒以后,再自動進入掉電模式。這樣下來估計三節5南孚用一個月應該問題不大。
作者: cy009    時間: 2020-3-30 18:44
光敏作什么用途?




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 欧区一欧区二欧区三免费 | av一级久久 | av网站在线看 | 99国产精品久久久久老师 | 在线观看电影av | 国内久久 | 久久亚洲春色中文字幕久久久 | 欧美一区二区三区在线观看视频 | 天天综合久久 | 一区在线观看 | 台湾佬伊人 | 免费视频99 | 欧美日韩国产在线观看 | 欧美日韩国产一区二区三区不卡 | 国产欧美精品在线观看 | 中文字幕亚洲区一区二 | 日本一区二区三区在线观看 | 韩日一区二区三区 | 久久久久久久国产 | 国产精品久久久久久久7电影 | 大学生a级毛片免费视频 | 成人免费一区二区三区视频网站 | av在线播放免费 | 91精品国产一区二区三区 | 视频在线观看亚洲 | 日本精品裸体写真集在线观看 | 国产在线精品一区二区三区 | 国产精品久久久久久影院8一贰佰 | 日韩高清一区二区 | 国内精品视频在线观看 | 欧美一区二区在线观看 | 欧美三级电影在线播放 | 毛片免费在线观看 | 成人精品在线视频 | 中文字幕日本一区二区 | 国产va| 国产成人精品一区二区三区在线 | 日本久久久久久 | 米奇7777狠狠狠狠视频 | 久久综合一区二区三区 | 欧美日韩久久久 |