標題:
單片機電子時鐘 鬧鐘程序lcd1602 ds1302 ds18b20溫度傳感器
[打印本頁]
作者:
fhwiihr
時間:
2019-3-25 11:04
標題:
單片機電子時鐘 鬧鐘程序lcd1602 ds1302 ds18b20溫度傳感器
單片機 電子時鐘。這是一個完整的51單片機工程,里面包括 lcd1602 ds1302 ds18b20的綜合應用。
有基本的時鐘功能,還能通過按鍵設置時間及鬧鐘,另外,有溫度傳感器ds18b20測量溫度,用1602顯示
1.時鐘有鬧鐘功能,當鬧鐘鍵按下時,鬧鐘啟動。
2.只當設置鍵按下時,對當前時間進行設置,而設置與鬧鐘兩個鍵同時按下時,對鬧鐘時間進行設置,不會影響到當前時間,不過當前時間會停,這里還不知道怎么解決。
單片機源程序如下:
#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;//設置
sbit b2=P3^1;//上調
sbit b3=P3^2;//下調
sbit b4=P3^3;//轉換
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)象。可能是由于十六進制與十進制的差異。
lcdwrite(0x8d+0x40);
lcdshuju(temp/100+0x30);
lcdwrite(0x8e+0x40);
lcdshuju(temp/10%10+0x30);
}
}
復制代碼
所有資料51hei提供下載:
電子時鐘 lcd1602 ds1302 ds18b20 鬧鐘.zip
(52.01 KB, 下載次數(shù): 212)
2019-3-25 10:54 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
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