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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

搭棚焊了一個高精度時鐘送小姑娘(DS3231+89c52單片機)

  [復制鏈接]
跳轉到指定樓層
樓主
前幾天在網上閑逛發現有人搭棚焊了一個時鐘,一時心動想自己也做一個送小姑娘。

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

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




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



有人說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)

評分

參與人數 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:456690 發表于 2018-12-27 18:57 | 只看該作者
學習了好帖
回復

使用道具 舉報

板凳
ID:456769 發表于 2018-12-27 20:19 | 只看該作者
學習學習
回復

使用道具 舉報

地板
ID:449525 發表于 2018-12-28 09:19 | 只看該作者
做的精致啊,你連洞洞板都省了,厲害
回復

使用道具 舉報

5#
無效樓層,該帖已經被刪除
6#
ID:220779 發表于 2018-12-28 10:36 | 只看該作者
ds1302匹配電容搭配好了,再加上高精度晶振,可以做到3天誤差1秒,做過好多這樣的表了
回復

使用道具 舉報

7#
ID:140489 發表于 2018-12-28 10:49 | 只看該作者
DS3231供電要3.3V,走時誤差才小,5V供電誤差較大
回復

使用道具 舉報

8#
ID:456116 發表于 2019-1-4 17:03 | 只看該作者
lids 發表于 2018-12-28 10:49
DS3231供電要3.3V,走時誤差才小,5V供電誤差較大

謝謝了,等我試試
回復

使用道具 舉報

9#
ID:229361 發表于 2019-1-21 13:36 | 只看該作者
謝謝樓主的分享
回復

使用道具 舉報

10#
ID:282850 發表于 2019-1-21 14:32 | 只看該作者
動手能力可以,關鍵是“早晨上班,等紅燈時發現一女司機抱著狗兒開車”...《交通法》抱著狗狗開車罰款1元,扣12分。    狗狗
回復

使用道具 舉報

11#
ID:211167 發表于 2019-1-21 15:13 | 只看該作者
這個厲害了
回復

使用道具 舉報

12#
ID:35873 發表于 2019-1-21 20:29 | 只看該作者
這個真不錯  學習下
回復

使用道具 舉報

13#
ID:116551 發表于 2019-3-1 22:37 | 只看該作者
樓主,想問一下,你的資料里是DS3231的程序還是DS1302的程序???還望麻煩回一下,謝謝!!!
回復

使用道具 舉報

14#
ID:333807 發表于 2019-4-4 10:07 | 只看該作者
V這個真不錯  學習下
回復

使用道具 舉報

15#
ID:266095 發表于 2019-4-4 12:08 | 只看該作者
焊的用心
回復

使用道具 舉報

16#
ID:608007 發表于 2020-3-28 12:24 | 只看該作者
感謝樓主的資料 已經做成啦,我用共陽數碼管,程序稍微修改了一下,時間能正常顯示。但溫度只能顯示正的溫度是正常,到負溫度是就顯示不正常啦,望樓主指點迷津
回復

使用道具 舉報

17#
ID:716703 發表于 2020-3-28 15:24 | 只看該作者
f556 發表于 2019-1-21 14:32
動手能力可以,關鍵是“早晨上班,等紅燈時發現一女司機抱著狗兒開車”...《交通法》抱著狗狗開車罰 ...

罰款一元??
回復

使用道具 舉報

18#
ID:685070 發表于 2020-3-29 09:08 | 只看該作者

ds1302做了個時鐘一天快70s左右,目前很郁悶
回復

使用道具 舉報

19#
ID:403593 發表于 2020-3-29 20:42 | 只看該作者
要是想省電的話,可以這樣做:單片機外部中斷接一個按鍵,單片機上電就進入掉電模式,然后按下按鍵喚醒,點亮LED輪流顯示溫度和時間,5秒到10秒以后,再自動進入掉電模式。這樣下來估計三節5南孚用一個月應該問題不大。
回復

使用道具 舉報

20#
無效樓層,該帖已經被刪除
21#
ID:619259 發表于 2020-3-30 18:44 | 只看該作者
光敏作什么用途?
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产在线精品一区二区三区 | 91在线一区二区三区 | 偷拍亚洲色图 | 亚洲人成人一区二区在线观看 | 999久久久免费精品国产 | 国产乱码精品一品二品 | 亚洲午夜av久久乱码 | 最新国产福利在线 | 成年免费在线观看 | 国产精品久久福利 | 国产男女视频 | 亚洲精品美女 | 欧美一二区 | 特级黄色毛片 | 久久av一区 | 成人欧美一区二区三区在线播放 | 一区二区三区av | 神马影院一区二区三区 | 亚洲狠狠丁香婷婷综合久久久 | 亚洲欧美一区二区三区情侣bbw | 亚洲精品中文字幕在线观看 | 久久麻豆精品 | 日日摸日日碰夜夜爽亚洲精品蜜乳 | 日韩伦理电影免费在线观看 | 久草视频在线播放 | 欧产日产国产精品视频 | 久久久国产一区二区三区四区小说 | 日本高清中文字幕 | 亚洲精品国产电影 | 成人毛片视频免费 | 日韩免费视频一区二区 | 中文字幕国产日韩 | 看一级毛片视频 | 久久综合久 | 国产精品久久久久久久久久久久午夜片 | 性一交一乱一透一a级 | 久久久www成人免费无遮挡大片 | 欧美日韩亚洲视频 | 亚洲va在线va天堂va狼色在线 | 最新av中文字幕 | 成人日韩|