標題: 單片機電子時鐘 鬧鐘程序lcd1602 ds1302 ds18b20溫度傳感器 [打印本頁]

作者: fhwiihr    時間: 2019-3-25 11:04
標題: 單片機電子時鐘 鬧鐘程序lcd1602 ds1302 ds18b20溫度傳感器
單片機 電子時鐘。這是一個完整的51單片機工程,里面包括 lcd1602 ds1302 ds18b20的綜合應用。
有基本的時鐘功能,還能通過按鍵設置時間及鬧鐘,另外,有溫度傳感器ds18b20測量溫度,用1602顯示

1.時鐘有鬧鐘功能,當鬧鐘鍵按下時,鬧鐘啟動。
2.只當設置鍵按下時,對當前時間進行設置,而設置與鬧鐘兩個鍵同時按下時,對鬧鐘時間進行設置,不會影響到當前時間,不過當前時間會停,這里還不知道怎么解決。

單片機源程序如下:
  1. #include<reg52.h>
  2. #include"lcd1602.h"
  3. #include"ds1302.h"
  4. #include"ds18b20.h"

  5. #define uint unsigned int
  6. #define uchar unsigned char

  7. uint b[6];
  8. //年月日時分秒

  9. uchar code row1[]={"2009-01-01"};
  10. uchar code row2[]={"00:00:00"};
  11. uchar year1[12]={31,28,31,30,31,30,31,31,30,31,30,31};//平年
  12. uchar year2[12]={31,29,31,30,31,30,31,31,30,31,30,31};//潤年
  13. uchar j[6]={0x85,0x88,0x8b,0x84+0x40,0x87+0x40,0x8a+0x40};//LCD地址

  14. uchar i,k,jj=0,w,clock=0,bigclock=0,c=0,num;
  15. //i循環(huán)數(shù)  k溫度緩存 jj地址位
  16. uint temp;

  17. sbit b1=P3^0;//設置
  18. sbit b2=P3^1;//上調
  19. sbit b3=P3^2;//下調
  20. sbit b4=P3^3;//轉換
  21. sbit b5=P3^4;//鬧鐘
  22. sbit speaker=P3^5;

  23. lcdscan()
  24. {
  25.         for(i=0;i<6;i++)
  26.         {
  27.                 lcdwrite(j[i]);
  28.                 lcdshuju(a[11-i*2]+0x30);
  29.                 lcdwrite(j[i]+0x01);
  30.                 lcdshuju(a[10-i*2]+0x30);
  31.         }
  32. }

  33. void key()
  34. {
  35.         if(b1==0)
  36.         {
  37.                 dsaddshuju(0x80,(a[1]<<4)+a[0]+0x80);
  38.                 while(b1==0)
  39.                 {
  40.                         for(i=0;i<6;i++)
  41.                         {
  42.                                 b[i]=a[11-i*2+clock]*10+a[10-i*2+clock];
  43.                         }

  44.                         if(b4==0)
  45.                         {
  46.                                 delay(3);
  47.                                 jj++;
  48.                                 if(jj==6)
  49.                                 {
  50.                                         jj=0;
  51.                                 }
  52.                         }
  53.                         if(b2==0)
  54.                         {
  55.                                 delay(3);
  56.                                 b[jj]++;
  57.                                 if(b[5]==60)b[5]=0;
  58.                                 if(b[4]==60)b[4]=0;
  59.                                 if(b[3]==24)b[3]=0;
  60.                                 if((b[0]%4==0 && b[0]%100!=0) || b[0]%400==0){if(b[2]>year2[b[1]-1])b[2]=1;}
  61.                                 else {if(b[2]>year1[b[1]-1])b[2]=1;}
  62.                                 if(b[1]==13)b[1]=1;
  63.                                 if(b[0]==100)b[0]=0;
  64.                                
  65.                         }
  66.                         if(b3==0)
  67.                         {
  68.                                 delay(3);
  69.                                 b[jj]--;
  70.                                 if(b[5]==-1)b[5]=59;
  71.                                 if(b[4]==-1)b[4]=59;
  72.                                 if(b[3]==-1)b[3]=23;
  73.                                 if((b[0]%4==0 && b[0]%100!=0) || b[0]%400==0){if(b[2]<=0)b[2]=year2[b[1]-1];}
  74.                                 else {if(b[2]<=0)b[2]=year1[b[1]-1];}
  75.                                 if(b[1]==0)b[1]=12;
  76.                                 if(b[0]==-1)b[0]=99;
  77.                         }

  78.                         for(i=0;i<6;i++)
  79.                         {
  80.                                 a[11-i*2+clock]=b[i]/10;
  81.                                 a[10-i*2+clock]=b[i]%10;
  82.                         }

  83.                         lcdwrite(j[jj]);
  84.                         lcdshuju(0);
  85.                         lcdwrite(j[jj]+1);
  86.                         lcdshuju(0);
  87.                         delay(200);
  88.                         lcdwrite(j[jj]);
  89.                         lcdshuju(a[11-2*jj+clock]+0x30);
  90.                         lcdwrite(j[jj]+1);
  91.                         lcdshuju(a[10-2*jj+clock]+0x30);
  92.                         delay(200);
  93.                        
  94.                         if(b1==1)
  95.                         {
  96.                                 dsaddshuju(0x80,(a[1]<<4)+a[0]);
  97.                                 dson();
  98.                         }
  99.                         if(b5==0)clock=12;
  100.                 }
  101.         }
  102. }

  103. void main()
  104. {       
  105.         speaker=0;
  106.         lcdrw=0;
  107.         dson();
  108.         lcdon();
  109.         lcdwrite(0x83);
  110.         for(i=0;i<10;i++)
  111.         {
  112.                 lcdshuju(row1[i]);
  113.                 delay(1);
  114.         }
  115.         lcdwrite(0x84+0x40);
  116.         for(i=0;i<8;i++)
  117.         {
  118.                 lcdshuju(row2[i]);
  119.                 delay(1);
  120.         }
  121.         dsrst=0;
  122.         dssclk=0;
  123.         while(1)
  124.         {
  125.                 for(i=0;i<5;i++)
  126.                 {
  127.                         dsrst=1;
  128.                         dswrite(0x81+i*2);
  129.                         k=dsread();
  130.                         dsrst=0;
  131.                         a[i*2]=k&0x0f;
  132.                         a[i*2+1]=(k>>4)&0x0f;                       
  133.                 }
  134.                 dsrst=1;
  135.                 dswrite(0x8d);
  136.                 k=dsread();
  137.                 dsrst=0;
  138.                 a[10]=k&0x0f;
  139.                 a[11]=(k>>4)&0x0f;
  140.                
  141.                 delay(100);

  142.                 lcdscan();
  143.                 key();
  144.                 if(b5==0)
  145.                 {
  146.                         for(i=0;i<12;i++)
  147.                         {
  148.                                 if(a[i+12]==a[i])num++;
  149.                         }
  150.                         if(num==12)bigclock=1;
  151.                         else num=0;
  152.                         lcdwrite(0x8e);
  153.                         lcdshuju('&');
  154.                 }
  155.                 else
  156.                 {
  157.                         lcdwrite(0x8e);
  158.                         lcdshuju(0x00);
  159.                 }       
  160.                 if(bigclock==1)
  161.                 {
  162.                         speaker=1;
  163.                         c++;
  164.                         if(c==100){bigclock=0;speaker=0;}
  165.                 }
  166.                 temp=readtemperature();//temp是uint型的。不然會出現(xiàn)溫度到25后回00的現(xiàn)象。可能是由于十六進制與十進制的差異。
  167.                 lcdwrite(0x8d+0x40);
  168.                 lcdshuju(temp/100+0x30);
  169.                 lcdwrite(0x8e+0x40);
  170.                 lcdshuju(temp/10%10+0x30);
  171.         }
  172. }
復制代碼

所有資料51hei提供下載:
電子時鐘 lcd1602 ds1302 ds18b20 鬧鐘.zip (52.01 KB, 下載次數(shù): 212)



作者: wangshengs    時間: 2019-4-5 14:06
為啥有重復定義的IO口,而且還有三個警告沒有返回值,程序的下載沒有問題鏈接電路也檢查沒有問題,為啥1602只顯示一個半的框框
作者: 曾程序    時間: 2019-4-17 12:24
感謝樓主
作者: yzhbyyy    時間: 2019-5-13 16:02
很給力!
作者: yidada1997    時間: 2019-6-21 15:35
這么nb
作者: yiyuan3085377    時間: 2020-11-23 14:00
根本不顯示我都懷疑這寫的嗎
作者: wdnmd2077    時間: 2020-11-23 14:23
這個程序寫的很好,再加點霍爾細節(jié)就完美了




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1