/*
功能:溫度采集顯示和可調(diào)時(shí)鐘顯示,蜂鳴器報(bào)警,時(shí)鐘用中斷法實(shí)現(xiàn)
s1:選擇要調(diào)節(jié)的時(shí)、分、秒位
s2:時(shí)、分、秒加一
s3:時(shí)、分、秒減一
*/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar num,s1num,count;
uchar shi,fen,miao;
sbit rs=P2^0;
sbit e=P2^1;
sbit s1=P3^0;
sbit s2=P3^1;
sbit s3=P3^2; //按鍵定義
sbit DQ =P2^2; //定義通信端口
sbit beep=P1^0;
bit flag;
uchar code table1[]="Time: 00:00:00";
uchar code table2[]="Temperature: 'C";//1602初始化字符
void alarm(uchar num);
void delay(uint z)//延時(shí)子函數(shù)
{
uint x,y;
for(x=z; x>0; x--)
for(y=110;y>0;y--);
}
#include<1602.h>
#include<18b20.h>
#include<clock_set.h>
void main()
{
uchar temp;
init_1602();
while(1)
{ delay(500); //去除0秒和1秒之間顯示間隔跟正常1秒間隔相差過(guò)大
if(miao==0) //每分鐘進(jìn)行溫度采集一次
{
TR0=0; //進(jìn)入溫度采集后,關(guān)閉定時(shí)器
flag=1; //flag=1,標(biāo)志進(jìn)入溫度采集模式
write_com(0x80+0x40+13);
write_dat(0x30+1); //消除不顯示數(shù)字1
temp=ReadTemperature(); //讀取DS18B20的溫度值
alarm(temp);
write_1602(12,temp); //向1602中寫入溫度值
TR0=1; //溫度采集完成后,打開定時(shí)器
delay(100);//等待miao不等零,跳出循環(huán)
}
flag=0; //flag=0,標(biāo)志在時(shí)鐘顯示模式下
keyscan(); //調(diào)用鍵盤掃描子程序,用以調(diào)整時(shí)間
}
}
void timer0() interrupt 1//定時(shí)器1的中斷服務(wù)程序,并向1602中寫時(shí)分秒顯示時(shí)間
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
count++;
if (count==18)
{
count=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
}
if(flag==0) //flag=0,標(biāo)志在時(shí)鐘顯示模式下,然后才顯示時(shí)間
write_1602(6,shi);
}
if(flag==0)
write_1602(9,fen);
}
if(flag==0)
write_1602(12,miao);
}
}
void alarm(uchar num) //報(bào)警
{
if(40>=num)
beep=1; //在溫度允許范圍,不報(bào)警
else
beep=~beep;
return(0);
}
|