|
單片機(jī) 電子時鐘。這是一個完整的51單片機(jī)工程,里面包括 lcd1602 ds1302 ds18b20的綜合應(yīng)用。
有基本的時鐘功能,還能通過按鍵設(shè)置時間及鬧鐘,另外,有溫度傳感器ds18b20測量溫度,用1602顯示
1.時鐘有鬧鐘功能,當(dāng)鬧鐘鍵按下時,鬧鐘啟動。
2.只當(dāng)設(shè)置鍵按下時,對當(dāng)前時間進(jìn)行設(shè)置,而設(shè)置與鬧鐘兩個鍵同時按下時,對鬧鐘時間進(jìn)行設(shè)置,不會影響到當(dāng)前時間,不過當(dāng)前時間會停,這里還不知道怎么解決。
單片機(jī)源程序如下:
- #include<reg52.h>
- #include"lcd1602.h"
- #include"ds1302.h"
- #include"ds18b20.h"
- #define uint unsigned int
- #define uchar unsigned char
- uint b[6];
- //年月日時分秒
- uchar code row1[]={"2009-01-01"};
- uchar code row2[]={"00:00:00"};
- uchar year1[12]={31,28,31,30,31,30,31,31,30,31,30,31};//平年
- uchar year2[12]={31,29,31,30,31,30,31,31,30,31,30,31};//潤年
- uchar j[6]={0x85,0x88,0x8b,0x84+0x40,0x87+0x40,0x8a+0x40};//LCD地址
- uchar i,k,jj=0,w,clock=0,bigclock=0,c=0,num;
- //i循環(huán)數(shù) k溫度緩存 jj地址位
- uint temp;
- sbit b1=P3^0;//設(shè)置
- sbit b2=P3^1;//上調(diào)
- sbit b3=P3^2;//下調(diào)
- sbit b4=P3^3;//轉(zhuǎn)換
- sbit b5=P3^4;//鬧鐘
- sbit speaker=P3^5;
- lcdscan()
- {
- for(i=0;i<6;i++)
- {
- lcdwrite(j[i]);
- lcdshuju(a[11-i*2]+0x30);
- lcdwrite(j[i]+0x01);
- lcdshuju(a[10-i*2]+0x30);
- }
- }
- void key()
- {
- if(b1==0)
- {
- dsaddshuju(0x80,(a[1]<<4)+a[0]+0x80);
- while(b1==0)
- {
- for(i=0;i<6;i++)
- {
- b[i]=a[11-i*2+clock]*10+a[10-i*2+clock];
- }
- if(b4==0)
- {
- delay(3);
- jj++;
- if(jj==6)
- {
- jj=0;
- }
- }
- if(b2==0)
- {
- delay(3);
- b[jj]++;
- if(b[5]==60)b[5]=0;
- if(b[4]==60)b[4]=0;
- if(b[3]==24)b[3]=0;
- if((b[0]%4==0 && b[0]%100!=0) || b[0]%400==0){if(b[2]>year2[b[1]-1])b[2]=1;}
- else {if(b[2]>year1[b[1]-1])b[2]=1;}
- if(b[1]==13)b[1]=1;
- if(b[0]==100)b[0]=0;
-
- }
- if(b3==0)
- {
- delay(3);
- b[jj]--;
- if(b[5]==-1)b[5]=59;
- if(b[4]==-1)b[4]=59;
- if(b[3]==-1)b[3]=23;
- if((b[0]%4==0 && b[0]%100!=0) || b[0]%400==0){if(b[2]<=0)b[2]=year2[b[1]-1];}
- else {if(b[2]<=0)b[2]=year1[b[1]-1];}
- if(b[1]==0)b[1]=12;
- if(b[0]==-1)b[0]=99;
- }
- for(i=0;i<6;i++)
- {
- a[11-i*2+clock]=b[i]/10;
- a[10-i*2+clock]=b[i]%10;
- }
- lcdwrite(j[jj]);
- lcdshuju(0);
- lcdwrite(j[jj]+1);
- lcdshuju(0);
- delay(200);
- lcdwrite(j[jj]);
- lcdshuju(a[11-2*jj+clock]+0x30);
- lcdwrite(j[jj]+1);
- lcdshuju(a[10-2*jj+clock]+0x30);
- delay(200);
-
- if(b1==1)
- {
- dsaddshuju(0x80,(a[1]<<4)+a[0]);
- dson();
- }
- if(b5==0)clock=12;
- }
- }
- }
- void main()
- {
- speaker=0;
- lcdrw=0;
- dson();
- lcdon();
- lcdwrite(0x83);
- for(i=0;i<10;i++)
- {
- lcdshuju(row1[i]);
- delay(1);
- }
- lcdwrite(0x84+0x40);
- for(i=0;i<8;i++)
- {
- lcdshuju(row2[i]);
- delay(1);
- }
- dsrst=0;
- dssclk=0;
- while(1)
- {
- for(i=0;i<5;i++)
- {
- dsrst=1;
- dswrite(0x81+i*2);
- k=dsread();
- dsrst=0;
- a[i*2]=k&0x0f;
- a[i*2+1]=(k>>4)&0x0f;
- }
- dsrst=1;
- dswrite(0x8d);
- k=dsread();
- dsrst=0;
- a[10]=k&0x0f;
- a[11]=(k>>4)&0x0f;
-
- delay(100);
- lcdscan();
- key();
- if(b5==0)
- {
- for(i=0;i<12;i++)
- {
- if(a[i+12]==a[i])num++;
- }
- if(num==12)bigclock=1;
- else num=0;
- lcdwrite(0x8e);
- lcdshuju('&');
- }
- else
- {
- lcdwrite(0x8e);
- lcdshuju(0x00);
- }
- if(bigclock==1)
- {
- speaker=1;
- c++;
- if(c==100){bigclock=0;speaker=0;}
- }
- temp=readtemperature();//temp是uint型的。不然會出現(xiàn)溫度到25后回00的現(xiàn)象?赡苁怯捎谑M(jìn)制與十進(jìn)制的差異。
- lcdwrite(0x8d+0x40);
- lcdshuju(temp/100+0x30);
- lcdwrite(0x8e+0x40);
- lcdshuju(temp/10%10+0x30);
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
電子時鐘 lcd1602 ds1302 ds18b20 鬧鐘.zip
(52.01 KB, 下載次數(shù): 212)
2019-3-25 10:54 上傳
點(diǎn)擊文件名下載附件
|
評分
-
查看全部評分
|