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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機+1602+DS1302+DS18B20迷你時鐘設計

  [復制鏈接]
跳轉到指定樓層
樓主
ID:70481 發表于 2014-12-16 17:08 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
程序 LCD1602液晶時鐘.zip (51.17 KB, 下載次數: 102)
由于已經工作了,很少上51hei論壇打理帖子,對不起各位

程序較早寫的,待優化的地方較多,僅供大家參考

該作品僅供大家討論學習用,切勿用在商業用途。


第一個版本的資料

阻焊層.pdf (6.39 KB, 下載次數: 32)
電路原理圖.pdf (43.22 KB, 下載次數: 78)
絲印層.pdf (9.33 KB, 下載次數: 17)
原理圖負片.pdf (22.86 KB, 下載次數: 24)
測試源程序keil編譯.zip (1.14 KB, 下載次數: 75)

第一個版本

3D顯示效果圖(正面)(沒有3D模型只能顯示這樣,大家見諒)

3D顯示效果圖(反面) (沒有3D模型只能顯示這樣,大家見諒)

自制切割機


做好絲印層(就這個我用熱轉印做的)打好孔,裁好PCB


PCB反面(PCB我經過了化學鍍錫處理)


焊接好PCB板


ATMEL的AT89S52


DS1302就在單片機中間


在DS1302的上方也預留DS18B20的接口


安裝液晶顯示器效果





第二個版本
更新了蜂鳴器、ISP、可控制背光,優化了PCB布局








整體的效果

關閉背光的效果

程序已完工,程序運行(程序等資料過一段時間發出)
現在附件發的程序是測試程序,大家注意下








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

使用道具 舉報

沙發
ID:70481 發表于 2014-12-16 17:10 | 只看該作者
源碼預覽:
  1. //#include <at89x52.h>          
  2. #include <intrins.h>
  3. #include <STC89C5xRC.H>

  4. #define DataPort P0

  5. unsigned char code one[] = "20  /  /  ";                 //固定字符
  6. unsigned char code two[] = "  :  :  ";                //固定字符
  7. unsigned char code wendu[] = {0x18, 0x1a, 0x05, 0x04, 0x04, 0x05, 0x02, 0x00};//溫度符號
  8. unsigned char code week_char[] = "MON TUE WED THU FRI STA SUN"; //星期字符串
  9. unsigned char miao, fen, shi, ri, yue, nian, week;
  10. unsigned int tp;
  11. bit time_flag, temp_flag;

  12. /******************************
  13. LCD1602
  14. 4PIN----RS
  15. 5PIN----RW
  16. 6PIN----EN
  17. *****************************/
  18. sbit beep = P1^0;                //蜂鳴器
  19. sbit DQ = P3^7;                        //18B20端口
  20. sbit RS = P2^4;                        //1602寄存器選擇
  21. sbit RW = P2^5;                        //1602讀寫控制
  22. sbit EN = P2^6;                        //1602使能端
  23. sbit key1 = P3^1;                //菜單鍵
  24. sbit key2 = P3^2;                //加
  25. sbit key3 = P3^3;                //減
  26. sbit RST = P3^5;                //1302復位
  27. sbit SDA = P3^4;                //1302數據
  28. sbit SCK = P3^6;                //1302時鐘                  

  29. void delay_us(unsigned char t)
  30. {
  31.   while(--t);
  32. }

  33. /***********ms延時程序***********/
  34. void delay_ms(unsigned int ms)
  35. {
  36.         unsigned int a, b;
  37.         for(a = ms; a > 0; a--)
  38.                 for(b = 110; b > 0; b--);
  39. }

  40. /********蜂鳴器響一聲**********/
  41. void beepplay()
  42. {
  43.         beep = 0;
  44.         delay_ms(60);
  45.         beep = 1;
  46. }

  47. /*********LCD判忙*************/
  48. void lcd_busy()
  49. {
  50.         DataPort = 0xff;
  51.         RS = 0;
  52.         RW = 1;
  53.         EN = 1;
  54.         delay_ms(1);
  55.         while(DataPort & 0x80);
  56.         EN = 0;
  57. }

  58. /**********LCD寫數據************/
  59. void write_date(unsigned char dat)
  60. {
  61.         lcd_busy();
  62.         RS = 1;
  63.         RW = 0;
  64.         DataPort = dat;
  65.         delay_ms(2);
  66.         EN = 1;
  67.         delay_ms(2);
  68.         EN = 0;
  69. }

  70. /*********LCD寫指令***********/
  71. void write_com(unsigned char com)
  72. {
  73.         lcd_busy();
  74.         RS = 0;
  75.         RW = 0;
  76.         DataPort = com;
  77.         delay_ms(2);
  78.         EN = 1;
  79.         delay_ms(2);
  80.         EN = 0;
  81. }

  82. /*********LCD初始化*************/
  83. void initLCD()
  84. {
  85.         unsigned char i;
  86.         delay_ms(5);                //延時啟動,等待電壓穩定
  87.         write_com(0x38);        //設置16*2顯示,5*7點陣,8位數據口
  88.         write_com(0x0c);        //設置開顯示,不顯示光標
  89.         write_com(0x06);        //寫一個字符地址指針加1
  90.         write_com(0x01);        //清屏
  91.         delay_ms(1);                //第一行起始地址0x80,第二行起始地址0xc0
  92.         write_com(0x81);          //第一行首空一個字符,開始寫入第一行固定字符
  93.        
  94.         for(i = 0; i < 10; i++)
  95.                 write_date(one[ i]);
  96.         delay_ms(1);
  97.         write_com(0xc2);        //第二行首空兩個字符,開始寫入第二行的固定字符
  98.        
  99.         for(i = 0; i < 8; i++)
  100.                 write_date(two[ i]);

  101.         write_com(0xcd);        //顯示地址
  102.         write_date('.');         //顯示"."
  103.         write_date(0x20);         //0x20顯示就是空  
  104. //        write_date('C');         //顯示C
  105.        
  106.         write_com(0x40);
  107.         for(i = 0; i < 8; i++)
  108.                 write_date(wendu[ i]);
  109.         write_com(0xcf);
  110.         write_date(0x00);
  111. }

  112. /*********10轉BCD**********/                   
  113. unsigned char toBCD(unsigned char dat)
  114. {
  115.         unsigned char tmp;
  116.         tmp=(((dat / 10) * 16)+(dat % 10));
  117.         return(tmp);       
  118. }

  119. /**********DS1302寫一個字節*********/          
  120. void writebyte(unsigned char dat)
  121. {
  122.         unsigned char i;
  123.         for(i = 0; i < 8; i++)
  124.         {
  125.                 SDA = dat & 0x01;
  126.                 SCK = 1;
  127.                 _nop_();_nop_();
  128.                 SCK = 0;
  129.                 dat >>= 1;          
  130.         }
  131. }

  132. /********寫DS1302寄存器********/         
  133. void write1302(unsigned char dizhi,shuju)
  134. {
  135.         RST = 0;
  136.         SCK = 0;
  137.         RST = 1;
  138.         writebyte(dizhi);        //寫入的地址
  139.         writebyte(shuju);        //寫入的數據
  140.         SCK = 1;
  141.         RST = 0;
  142. }

  143. /*******讀取DS1302寄存器********/
  144. unsigned char read1302(unsigned char dizhi)
  145. {
  146.         unsigned char i, dat, tmp;
  147.         RST = 0;
  148.         SCK = 0;
  149.         RST = 1;
  150.         writebyte(dizhi | 0x01);
  151.         for(i = 8; i > 0; i--)
  152.         {
  153.                 dat >>= 1;
  154.                 if(SDA)
  155.                         dat |= 0x80;
  156.                 SCK=1;
  157.                 _nop_();_nop_();
  158.                 SCK=0;
  159.         }
  160.         RST = 0;
  161.         tmp = dat >> 4;
  162.         tmp = ((tmp * 10)+(dat &= 0x0f));
  163.         return(tmp);
  164. }

  165. /*******DS18B20初始化*********/
  166. void init1820()
  167. {
  168.         DQ = 1;
  169.         _nop_();_nop_();
  170.         DQ = 0;
  171.         delay_us(200);
  172.         delay_us(200);
  173.         DQ = 1;
  174.         delay_us(80);
  175.         DQ = 1;
  176. }

  177. /*******向DS18B20中讀出一個字節*********/
  178. unsigned char readonebyte_18b20()
  179. {
  180.         unsigned char i=0, dat=0;
  181.         for(i = 8; i > 0; i--)
  182.         {
  183.                 DQ = 0;
  184.                 dat >>= 1;
  185.                 DQ = 1;
  186.                 if(DQ)
  187.                         dat |= 0x80;
  188.                 delay_us(25);
  189.         }
  190.         return(dat);
  191. }

  192. /******向DS18B20中寫入一個字節*******/
  193. void writeonebyte_18b20(unsigned char dat)
  194. {
  195.         unsigned char i=0;   
  196.         for(i = 8; i > 0; i--)   
  197.         {
  198.                 DQ = 0;  
  199.                 DQ = dat & 0x01;
  200.                 delay_us(25);
  201.                 DQ = 1;
  202.                 dat >>= 1;
  203.         }
  204.         delay_us(25);
  205. }

  206. /*********讀取溫度*********/
  207. unsigned int readtemp(void)
  208. {
  209.         unsigned int xx, tempL=0, tempH=0;
  210.         init1820();
  211.         writeonebyte_18b20(0xcc);
  212.         writeonebyte_18b20(0x44);
  213.         delay_us(100);
  214.         init1820();
  215.         writeonebyte_18b20(0xcc);
  216.         writeonebyte_18b20(0xbe);
  217.         tempL = readonebyte_18b20();
  218.         tempH = readonebyte_18b20();
  219.         tempH <<= 8;
  220.         xx = tempL | tempH;
  221.         return(xx);       
  222. }

  223. /********顯示函數*********/
  224. void display(unsigned char dizhi, dat)
  225. {
  226.         unsigned char a, b;
  227.         a = dat / 10;         //取得十位數字
  228.         b = dat % 10;                                        //取得個位數字
  229.         write_com(dizhi);                        //設定顯示的地址
  230.         write_date(a + 0x30);        //數字+0x30得到該數字的LCD1602顯示碼
  231.         write_date(b + 0x30);
  232. }

  233. /***********溫度顯示函數**************/
  234. void display_wendu(unsigned char dizhi, dat)
  235. {
  236.          write_com(dizhi);
  237.          write_date(dat);
  238. }

  239. /**********顯示周字符**********/
  240. void display_week(unsigned char week)
  241. {
  242.         unsigned char i;
  243.         write_com(0x8d);        //設置星期顯示地址
  244.         switch(week)
  245.         {
  246.                 case 1:        for(i = 0; i < 3; i++)
  247.                                 write_date(week_char[ i]);break;
  248.                 case 2: for(i = 4; i < 7; i++)
  249.                                 write_date(week_char[ i]);break;
  250.                 case 3: for(i = 8; i < 11; i++)
  251.                                 write_date(week_char[ i]);break;
  252.                 case 4: for(i = 12; i < 15; i++)
  253.                                 write_date(week_char[ i]);break;
  254.                 case 5: for(i = 16; i < 19; i++)
  255.                                 write_date(week_char[ i]);break;
  256.                 case 6: for(i = 20; i < 23; i++)
  257.                                 write_date(week_char[ i]);break;
  258.                 case 7: for(i = 24; i < 27; i++)
  259.                                 write_date(week_char[ i]);break;
  260.         }
  261. }

  262. /*********按鍵掃描********/
  263. void keyscan()
  264. {
  265.         unsigned char num;
  266.         if(key1 == 0)                                //判斷key1是不是按下
  267.         {
  268.                 delay_ms(20);                //按鍵消抖
  269.                 if(key1 == 0)                         //再次檢測key1是否按下
  270.                 {
  271.                         beepplay();                       
  272.                         while(!key1);        //等待key1釋放
  273.                         num++;
  274.                         switch(num)
  275.                         {
  276.                                 case 1: TR0 = 0;                                                                                //關閉中斷
  277.                                                 temp_flag = 0;
  278.                                                 time_flag = 0;
  279.                                                 write1302(0x8e, 0x00);                                                //允許寫入DS1302
  280.                                                 write1302(0x80, 0x80);                                                //時間暫停
  281.                                                 write_com(0x0f);                                                                        //設置光標閃爍
  282.                                                 write_com(0xc9);break;                                                //秒鐘閃爍地址
  283.                                 case 2: write_com(0xc6);break;                                //分閃爍地址
  284.                                 case 3: write_com(0xc3);break;                                //時閃爍地址
  285.                                 case 4: write_com(0x8f);break;                                //星期閃爍地址
  286.                                 case 5: write_com(0x8a);break;                                //日閃爍地址
  287.                                 case 6: write_com(0x87);break;                                //月閃爍地址
  288.                                 case 7: write_com(0x84);break;                                //年閃爍地址
  289.                                 case 8: write_com(0x0c);                                                        //設置光標不閃爍
  290.                                                 write1302(0x90,0xa9);                                                        //充電
  291.                                                 write1302(0x8c, toBCD(nian));
  292.                                                 write1302(0x86, toBCD(ri));
  293.                                                 write1302(0x88, toBCD(yue));
  294.                                                 write1302(0x8a, toBCD(week));
  295.                                                 write1302(0x84, toBCD(shi));
  296.                                                 write1302(0x82, toBCD(fen));
  297.                                                 write1302(0x80, toBCD(miao));                         //寫入秒
  298.                                                 write1302(0x8e, 0x80);                                                        //禁止寫入DS1302
  299.                                                 num = 0;TR0 = 1;break;                                                                //定時器打開計數清零
  300.                         }
  301.                 }
  302.         }
  303.    if(num != 0)           //i>0,按鍵key2,key3無效
  304.    {
  305.                 if(key2 == 0)
  306.                 {
  307.                         delay_ms(20);
  308.                         if(key2 == 0)
  309.                         {
  310.                                 beepplay();
  311.                                 while(!key2);  //等待釋放
  312.                                 switch(num)
  313.                                 {
  314.                                         case 1: miao++;if(miao >= 60)miao = 0;        //秒++
  315.                                                         display(0xc8, miao);                        //顯示秒
  316.                                                         write_com(0xc9);break;                //因為顯示地址指針自動加1,重新定義秒的地址
  317.                                         case 2: fen++;if(fen == 60)fen = 0;                //分++
  318.                                                         display(0xc5, fen);                        //顯示當前調入分數據
  319.                                                         write_com(0xc6);break;
  320.                                         case 3: shi++;if(shi == 24)shi = 0;
  321.                                                         display(0xc2, shi);
  322.                                                         write_com(0xc3);break;
  323.                                         case 4: week++;if(week == 8)week = 1;
  324.                                                         display_week(week);
  325.                                                         write_com(0x8f);break;
  326.                                         case 5: ri++;if(ri == 32)ri = 1;
  327.                                                         display(0x89, ri);
  328.                                                         write_com(0x8a);break;
  329.                                         case 6: yue++;if(yue == 13)yue = 1;
  330.                                                         display(0x86, yue);
  331.                                                         write_com(0x87);break;
  332.                                         case 7: nian++;if(nian == 100)nian = 0;
  333.                                                         display(0x83, nian);
  334.                                                         write_com(0x84);break;
  335.                                 }
  336.                         }
  337.                 }
  338.                 if(key3==0)                           //按鍵0有效,判斷key3按下是不是0
  339.                 {
  340.                         delay_ms(20);           //按鍵消抖
  341.                         if(key3==0)
  342.                         {
  343.                                 beepplay();           //調用蜂鳴器響一聲
  344.                                 while(!key3);  //等待釋放key3
  345.                                 switch(num)
  346.                                 {
  347.                                         case 1: miao--;if(miao == 255 | miao > 60)miao = 59;        //減1,減到0再減1就是255
  348.                                                         display(0xc8, miao);
  349.                                                         write_com(0xc9);break;
  350.                                         case 2: fen--;if(fen == 255)fen = 59;
  351.                                                         display(0xc5, fen);
  352.                                                         write_com(0xc6);break;
  353.                                         case 3: shi--;if(shi == 255)shi = 23;
  354.                                                         display(0xc2, shi);
  355.                                                         write_com(0xc3);break;
  356.                                         case 4: week--;if(week == 0)week = 7;
  357.                                                         display_week(week);
  358.                                                         write_com(0x8f);break;
  359.                                         case 5: ri--;if(ri == 0)ri = 31;
  360.                                                         display(0x89, ri);
  361.                                                         write_com(0x8a);break;
  362.                                         case 6: yue--;if(yue == 0)yue = 12;
  363.                                                         display(0x86, yue);
  364.                                                         write_com(0x87);break;
  365.                                         case 7: nian--;if(nian == 255)nian = 99;
  366.                                                         display(0x83, nian);
  367.                                                         write_com(0x84);break;
  368.                                 }
  369.                         }
  370.                 }
  371.         }                       
  372. }

  373. /***********更新時間***********/
  374. void update_time()
  375. {
  376.         if(time_flag == 1)
  377.         {
  378.                 time_flag = 0;
  379.                 miao = read1302(0x81);                //讀秒
  380.                 fen = read1302(0x83);                        //讀分  
  381.                 shi = read1302(0x85);                        //讀時  
  382.                 ri = read1302(0x87);                        //讀日  
  383.                 yue = read1302(0x89);                        //讀月  
  384.                 week = read1302(0x8b);                //讀周  
  385.                 nian = read1302(0x8d);                //讀年

  386.                 display(0xc8, miao);                        //更新秒
  387.                 display(0xc5, fen);                        //更新分
  388.                 display(0xc2, shi);                        //更新時
  389.                 display(0x89, ri);                        //更新日
  390.                 display(0x86, yue);                        //更新月
  391.                 display(0x83, nian);                        //更新年
  392.                 display_week(week);                 //更新周
  393.         }
  394. }

  395. /**********更新溫度*********/
  396. void update_temp()
  397. {
  398.         unsigned int temp;
  399.         if(temp_flag == 1)
  400.         {       
  401.                 temp_flag = 0;
  402.                 temp = readtemp();
  403.                 tp = temp;
  404.                 if(tp & 0x8000)
  405.                         tp = (~tp)+1;
  406.                 tp = ((tp * 5) >> 3);
  407.                 if(temp & 0x8000)
  408.                 {
  409.                         display_wendu(0xcb, '-');
  410.                         display_wendu(0xcc, (tp % 100 / 10) + 0x30);
  411.                         display_wendu(0xce, (tp % 10) + 0x30);
  412.                 }
  413.                 else
  414.                 {
  415.                         if((tp / 100 % 10) == 0)
  416.                                 display_wendu(0xcb, 0x20);
  417.                         else
  418.                                 display_wendu(0xcb, (tp / 100 % 10) + 0x30);
  419.                         display_wendu(0xcc, (tp % 100 / 10) + 0x30);
  420.                         display_wendu(0xce, (tp % 10) + 0x30);
  421.                 }          
  422.         }
  423. }

  424. /********定時器初始化************/
  425. void init_Time0()
  426. {
  427.         TMOD = 0x01;        //設置定時器工作模式
  428.         TH0 = 0;
  429.   TL0 = 0;
  430.         EA = 1;                //開總中斷
  431.         ET0 = 1;                //開定時器0中斷
  432.         TR0 = 1;                //啟動定時器
  433. }

  434. /**********主函數*************/
  435. void main()
  436. {
  437.         initLCD();                         //初始化LCD
  438.         init_Time0();                //初始化定時器          
  439.         while(1)
  440.         {
  441.                 keyscan();                //鍵盤掃描
  442.                 update_time();         //更新時間
  443.                 update_temp();        //更新溫度
  444.         }                                                                  
  445. }                                               

  446. /************中斷程序***************/
  447. void Time0()interrupt 1                                 //中斷程序不易過多
  448. {
  449.         static unsigned char x, y;
  450.         TH0 = (65536-10000) / 256;                         //賦值10ms
  451.         TL0 = (65536-10000) % 256;                 
  452.         x++;
  453.         if(x == 10)
  454.         {
  455.                 x = 0; y++;
  456.                 time_flag = 1;
  457.                 if(y == 5)
  458.                 {
  459.                         y = 0;
  460.                         temp_flag = 1;       
  461.                 }
  462.         }       
  463. }
復制代碼
回復

使用道具 舉報

板凳
ID:66137 發表于 2014-12-16 23:25 | 只看該作者
高手,這東西不錯,等你發正式版的程序。。
回復

使用道具 舉報

地板
ID:48140 發表于 2014-12-17 11:36 來自手機 | 只看該作者
這東西真好可以好好學習一下。51hei有你更精彩!!
回復

使用道具 舉報

5#
ID:70614 發表于 2014-12-17 13:29 | 只看該作者
制作的真漂亮
回復

使用道具 舉報

6#
ID:70391 發表于 2014-12-20 17:42 | 只看該作者
不錯的東西,學習了。謝謝分享。
回復

使用道具 舉報

7#
ID:70391 發表于 2014-12-21 11:03 | 只看該作者
配有實物圖,很好的東西,樓主很厲害,謝謝分享。
回復

使用道具 舉報

8#
ID:73762 發表于 2015-3-5 10:05 | 只看該作者
支持一個,謝謝樓主
回復

使用道具 舉報

9#
ID:73949 發表于 2015-3-5 16:02 | 只看該作者
學習學習!謝謝分享!
回復

使用道具 舉報

10#
ID:70614 發表于 2015-3-21 12:49 | 只看該作者
真詳細 謝謝分享
回復

使用道具 舉報

11#
ID:75864 發表于 2015-4-1 11:06 | 只看該作者
學習,樓主的動手能力真強大
回復

使用道具 舉報

12#
ID:74143 發表于 2015-4-3 14:35 | 只看該作者
頂一個。。。。
回復

使用道具 舉報

13#
ID:61484 發表于 2015-4-14 22:09 | 只看該作者
學習下
回復

使用道具 舉報

14#
ID:72047 發表于 2015-4-17 04:48 | 只看該作者
這個資料不錯,下載一下
回復

使用道具 舉報

15#
ID:77523 發表于 2015-4-22 15:36 來自手機 | 只看該作者
我也做了1602得時鐘,可惜不能用,希望外做一次
回復

使用道具 舉報

16#
ID:74992 發表于 2015-4-22 21:49 | 只看該作者
給樓主頂帖,實在是不錯哦!
回復

使用道具 舉報

17#
ID:77776 發表于 2015-4-23 21:09 | 只看該作者
看著我也想做一個
回復

使用道具 舉報

18#
ID:77689 發表于 2015-5-26 12:35 來自手機 | 只看該作者
樓主,給我發一份程序吧,謝謝了,我的編程能力不行,1719190054@qq.com
回復

使用道具 舉報

19#
ID:83273 發表于 2015-6-28 22:57 | 只看該作者
挺不錯的
回復

使用道具 舉報

20#
ID:84732 發表于 2015-7-5 14:04 | 只看該作者
我也照著做個看看
回復

使用道具 舉報

21#
ID:85555 發表于 2015-7-14 14:12 | 只看該作者
不錯。
回復

使用道具 舉報

22#
ID:124081 發表于 2016-6-1 00:05 | 只看該作者
明天仔細看看
回復

使用道具 舉報

23#
ID:116662 發表于 2016-6-5 21:49 | 只看該作者
樓主做工真漂亮,謝謝分享
回復

使用道具 舉報

24#
ID:135369 發表于 2016-11-9 21:13 | 只看該作者
學習了,正好我也要給女票做一個
回復

使用道具 舉報

25#
ID:162718 發表于 2017-1-22 15:07 | 只看該作者
時間是沒有問題的,但是溫度沒有用,自己寫這樣的程序也是出現這個問題,我把樓主的程序抄回去還是沒有辦法度溫度,溫度總是0.00,不知道什么原因,看了好多人都是這個問題,是不是什么地方出錯了。
回復

使用道具 舉報

26#
ID:71689 發表于 2017-2-1 21:01 | 只看該作者
謝謝分享
回復

使用道具 舉報

27#
ID:157769 發表于 2017-4-6 21:52 | 只看該作者
bevispan 發表于 2017-1-22 15:07
時間是沒有問題的,但是溫度沒有用,自己寫這樣的程序也是出現這個問題,我把樓主的程序抄回去還是沒有辦法 ...

可以i嘗試用這段代碼,DS1302寫地址讀取時間函數。1602可以同時顯示溫度和時間

/*******************************************************************************
* 函 數 名         : Ds1302Read
* 函數功能                   : 讀取一個地址的數據
* 輸    入         : addr
* 輸    出         : dat
*******************************************************************************/

uchar Ds1302Read(uchar addr)
{
        uchar n,dat,dat1;
        RST = 0;
        _nop_();

        SCLK = 0;//先將SCLK置低電平。
        _nop_();
        RST = 1;//然后將RST(CE)置高電平。
        _nop_();

        for(n=0; n<8; n++)//開始傳送八位地址命令
        {
                DSIO = addr & 0x01;//數據從低位開始傳送
                addr >>= 1;
                SCLK = 1;//數據在上升沿時,DS1302讀取數據
                _nop_();
                SCLK = 0;//DS1302下降沿時,放置數據
                _nop_();
        }
        _nop_();
        for(n=0; n<8; n++)//讀取8位數據
        {
                dat1 = DSIO;//從最低位開始接收
                dat = (dat>>1) | (dat1<<7);
                SCLK = 1;
                _nop_();
                SCLK = 0;//DS1302下降沿時,放置數據
                _nop_();
        }

        /*RST = 0;
        _nop_();        //以下為DS1302復位的穩定時間,必須的。
        SCLK = 1;
        _nop_();
        DSIO = 0;
        _nop_();
        DSIO = 1;
        _nop_();
        return dat;        */
        SCLK=1;//以下為溫度與時間共存必須代碼,原因現在不清楚,以后仔細分析。
        _nop_();
        SCLK=0;
        _nop_();
        RST=0;
        _nop_();
                RST=1;
        _nop_();
        _nop_();        
        DSIO = 0;
        _nop_();
        DSIO = 1;
        _nop_();
return dat;
}
回復

使用道具 舉報

28#
ID:136641 發表于 2017-9-30 17:55 | 只看該作者
手工厲害了我的哥
回復

使用道具 舉報

29#
ID:437276 發表于 2018-12-3 17:13 | 只看該作者
樓主的動手能力真強大,我還需鍛煉這方面的能力
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 美女视频网站久久 | 欧美日韩一区二区三区视频 | 国产精品成人一区二区 | 91网站在线看| 欧美成人精品一区二区三区 | 影音先锋欧美资源 | 日韩美女在线看免费观看 | 欧美偷偷 | 雨宫琴音一区二区在线 | 日本精品网站 | 黄色在线观看网址 | 久久精品日产第一区二区三区 | 一区二区三区在线免费观看 | 精品一区二区三区视频在线观看 | 91精品国产91久久久久久吃药 | 99精品国自产在线 | 孰女乱色一区二区三区 | 日韩在线视频一区二区三区 | 91精品国产一二三 | 欧美 日韩 在线播放 | 欧美精品综合在线 | 久久天天躁狠狠躁夜夜躁2014 | 黑人巨大精品欧美一区二区一视频 | 精品成人一区二区 | 亚洲欧洲一区二区 | 日韩一区二区三区视频 | 希岛爱理在线 | 综合色导航 | 中文字幕亚洲欧美 | 精品一区二区三区91 | 久久中文免费视频 | 亚洲欧美一区二区在线观看 | 中文字幕精品一区 | 免费激情网站 | 欧美美女爱爱视频 | 国产成人在线播放 | 精品不卡 | 亚洲美乳中文字幕 | 国产日韩精品视频 | 色男人天堂av | 久久亚洲精品国产精品紫薇 |