|
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit DQ=P2^2;//ds18b20與單片機(jī)連接口
sbit RS=P1^0;
sbit RW=P1^1;
sbit EN=P2^5;
sbit en573=P2^6;
sbit en1573=P2^7;
uchar data disdata[5];
uint tvalue,CurrentT=0;//溫度值
uchar tflag;//溫度正負(fù)標(biāo)志
#define LCD_BUS P0
sbit SetKey= P3^4;
sbit UpKey= P3^5;
sbit DnKey= P3^6;
sbit BEEP= P2^3;
unsigned char AlarmTempLow=10,AlarmTempTop=40,Set=0,NG=0;
void delayms(uint ms) //延時(shí)xx毫秒
{
uchar i;
while(ms--)
{
for(i=0;i<120;i++);
}
}
void command(uint com) //LCD寫指令
{
RS=0; //RS為0
LCD_BUS=com; //裝載指令
delayms(5); //延時(shí)5ms
EN=1; //LCD使能
delayms(5); //延時(shí)5ms
EN=0; //LCD不使能
}
void write_dat(uchar dat) //LCD寫數(shù)據(jù)
{
RS=1; //RS為1
LCD_BUS=dat; //裝載數(shù)據(jù)
delayms(5); //延時(shí)5ms
EN=1; //LCD使能
delayms(5); //延時(shí)5ms
EN=0; //LCD不使能
}
void writestring(uchar x,uchar y,uchar *s) //LCD 寫字符串
{
if (y == 0) command(0x80 + x); //表示第一行
else command(0xC0 + x); //表示第二行
while (*s) //判斷是否字符串的結(jié)尾
{
write_dat( *s); //顯示當(dāng)前字符
s ++; //字符串地址加1
}
}
void writeChar(uchar x,uchar y,uchar s) //LCD 寫字符串
{
if (y == 0) command(0x80 + x); //表示第一行
else command(0xC0 + x); //表示第二行
{
write_dat( s); //顯示當(dāng)前字符
}
}
void LCD_Initial() //LCD初始化
{
EN=0; //LCD不使能
RW=0; //RW為0
command(0x38); //發(fā)送初始化指令
command(0x0c); //發(fā)送初始化指令
command(0x06); //發(fā)送初始化指令
command(0x01); //發(fā)送初始化指令
command(0x80+0x02); //發(fā)送LCD初始位置
}
/*************************DS1820程序****************************/
void delay_18B20(unsigned int i)//延時(shí)1微秒
{
while(i--);
}
void ds1820rst(void)/*ds1820復(fù)位*/
{
unsigned char x=0;
DQ = 1; //DQ復(fù)位
delay_18B20(4); //延時(shí)
DQ = 0; //DQ拉低
delay_18B20(100); //精確延時(shí)大于480us
DQ = 1; //拉高
delay_18B20(40);
}
uchar ds1820rd(void)/*讀數(shù)據(jù)*/
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; //給脈沖信號(hào)
dat>>=1;
DQ = 1; //給脈沖信號(hào)
if(DQ)
dat|=0x80;
delay_18B20(10);
}
return(dat);
}
void ds1820wr(uchar wdata)/*寫數(shù)據(jù)*/
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = wdata&0x01;
delay_18B20(10);
DQ = 1;
wdata>>=1;
}
}
unsigned int Read_Temperature(void)/*讀取溫度值并轉(zhuǎn)換*/
{
uchar a,b;
ds1820rst();
ds1820wr(0xcc);//*跳過讀序列號(hào)*/
ds1820wr(0x44);//*啟動(dòng)溫度轉(zhuǎn)換*/
ds1820rst();
ds1820wr(0xcc);//*跳過讀序列號(hào)*/
ds1820wr(0xbe);//*讀取溫度*/
a=ds1820rd();
b=ds1820rd();
tvalue=b;
tvalue<<=8;
tvalue=tvalue|a;
if(tvalue<0x0fff) tflag=0;
else {tvalue=~tvalue+1;tflag=1;}
tvalue=tvalue*(0.625);//溫度值擴(kuò)大10倍,精確到1位小數(shù)
CurrentT=tvalue;
return(tvalue);
}
void Display_Temperature() //顯示溫度
{
uchar flagdat;
disdata[0]=tvalue/1000+0x30;//百位數(shù)
disdata[1]=tvalue%1000/100+0x30;//十位數(shù)
disdata[2]=tvalue%100/10+0x30;//個(gè)位數(shù)
disdata[3]=tvalue%10+0x30;//小數(shù)位
if(tflag==0) flagdat=0x20;//正溫度不顯示符號(hào)
else flagdat=0x2d;//負(fù)溫度顯示負(fù)號(hào):-
//if(disdata[0]==0x30)
//{
// disdata[0]=0x20;//如果百位為0,不顯示
// if(disdata[1]==0x30) disdata[1]=0x20;//如果百位為0,十位為0也不顯示
//}
if(tflag==1)
{
writeChar(10,0,flagdat);//wr_com(0x8a);wr_dat(flagdat);//顯示符號(hào)位
writeChar(11,0,disdata[0]);//wr_com(0x8b);wr_dat(disdata[0]);//顯示百位
writeChar(12,0,disdata[1]);//wr_com(0x8c);wr_dat(disdata[1]);//顯示十位
writeChar(13,0,disdata[2]);//wr_com(0x8d);wr_dat(disdata[2]);//顯示個(gè)位
writeChar(14,0,0X2E);//wr_com(0x8e);wr_dat(0x2e);//顯示小數(shù)點(diǎn)
writeChar(15,0,disdata[3]);//wr_com(0x8f); wr_dat(disdata[3]);//顯示小數(shù)位
}
else
{
writeChar(10,0,disdata[0]);//wr_com(0x8a);wr_dat(disdata[0]);//顯示百位
writeChar(11,0,disdata[1]);//wr_com(0x8b);wr_dat(disdata[1]);//顯示十位
writeChar(12,0,disdata[2]);//wr_com(0x8c);wr_dat(disdata[2]);//顯示個(gè)位
writeChar(13,0,0X2e);//wr_com(0x8d);wr_dat(0x2e);//顯示小數(shù)點(diǎn)
writeChar(14,0,disdata[3]);//wr_com(0x8e);wr_dat(disdata[3]);//顯示小數(shù)位
}
}
void SetFun(void)
{
unsigned char i1=0,i2=0,i3=0,i4=0,i5=0,i6=0;
if(SetKey==0)
{
delayms(20);
if(SetKey==0)
{
if(Set<2) Set++;
else Set=0;
}
switch(Set)
{
case 0: writestring(0,1," ");writestring(8,1," ");break;
case 1: writestring(0,1,">");writestring(8,1," ");break;
case 2: writestring(0,1," ");writestring(8,1,">");break;
}
while(SetKey==0);
}
if((UpKey==0)&&(Set!=0))
{
delayms(20);
if(UpKey==0)
{
switch(Set)
{
case 1: if(AlarmTempLow<99) AlarmTempLow++;else AlarmTempLow=99; break;
case 2: if(AlarmTempTop<99) AlarmTempTop++;else AlarmTempTop=99; break;
}
i1 = AlarmTempLow/100; //獲得溫度值的百位
i2 = AlarmTempLow%100/10; //獲得溫度值的十位
i3 = AlarmTempLow%10; //獲得溫度值的個(gè)位
i4 = AlarmTempTop/100; //獲得溫度值的百位
i5 = AlarmTempTop%100/10; //獲得溫度值的十位
i6 = AlarmTempTop%10; //獲得溫度值的個(gè)位
writestring(5,1," ");
writestring(13,1," ");
if(i1!=0) writeChar(5,1,i1+'0');
if((i1==0)&&(i2!=0)) writeChar(5,1,i2+'0');
if(i1!=0) writeChar(6,1,i2+'0');
if((i1==0)&&(i2==0)) writeChar(5,1,i3+'0');
else if((i1==0)&&(i2!=0)) writeChar(6,1,i3+'0');
if((i1!=0)) writeChar(7,1,i3+'0');
if(i4!=0) writeChar(13,1,i4+'0');
if((i4==0)&&(i5!=0)) writeChar(13,1,i5+'0');
if(i4!=0) writeChar(14,1,i5+'0');
if((i4==0)&&(i5==0)) writeChar(13,1,i6+'0');
else if((i4==0)&&(i5!=0)) writeChar(14,1,i6+'0');
if((i4!=0)) writeChar(15,1,i6+'0');
while(UpKey==0);
}
}
if((DnKey==0)&&(Set!=0))
{
delayms(20);
if(DnKey==0)
{
switch(Set)
{
case 1: if(AlarmTempLow>0) AlarmTempLow--;else AlarmTempLow=0; break;
case 2: if(AlarmTempTop>0) AlarmTempTop--;else AlarmTempTop=0; break;
}
i1 = AlarmTempLow/100; //獲得溫度值的百位
i2 = AlarmTempLow%100/10; //獲得溫度值的十位
i3 = AlarmTempLow%10; //獲得溫度值的個(gè)位
i4 = AlarmTempTop/100; //獲得溫度值的百位
i5 = AlarmTempTop%100/10; //獲得溫度值的十位
i6 = AlarmTempTop%10; //獲得溫度值的個(gè)位
writestring(5,1," ");
writestring(13,1," ");
if(i1!=0) writeChar(5,1,i1+'0');
if((i1==0)&&(i2!=0)) writeChar(5,1,i2+'0');
if(i1!=0) writeChar(6,1,i2+'0');
if((i1==0)&&(i2==0)) writeChar(5,1,i3+'0');
else if((i1==0)&&(i2!=0)) writeChar(6,1,i3+'0');
if((i1!=0)) writeChar(7,1,i3+'0');
if(i4!=0) writeChar(13,1,i4+'0');
if((i4==0)&&(i5!=0)) writeChar(13,1,i5+'0');
if(i4!=0) writeChar(14,1,i5+'0');
if((i4==0)&&(i5==0)) writeChar(13,1,i6+'0');
else if((i4==0)&&(i5!=0)) writeChar(14,1,i6+'0');
if((i4!=0)) writeChar(15,1,i6+'0');
/*writeChar(4,1,i1+'0');
writeChar(5,1,i2+'0');
writeChar(6,1,i3+'0');
writeChar(12,1,i4+'0');
writeChar(13,1,i5+'0');
writeChar(14,1,i6+'0');*/
while(DnKey==0);
}
}
}
void main(void)
{
unsigned char i=0; //P3=0xef;
P2=0xef;BEEP=1;
LCD_Initial(); //LCD 初始化
P0=0x00;
en573=1;
en573=0;
P0=0x00;
en1573=1;
en1573=0;
Read_Temperature(); //讀取溫度值
writestring(1,0,"DS18B20 Alarmer"); //顯示“DS18B20 Alarmer”
delayms(1000); //延時(shí)1S
writestring(0,0,"Current T= "); //顯示“Current T= ”
writestring(0,1," Low=10 Top=40 "); //顯示“ Low=10 Top=40 ”
NG=0;
while(1)
{
Read_Temperature(); // //讀取溫度值
Display_Temperature(); //顯示溫度值
SetFun();
if((CurrentT<(AlarmTempTop*10))&&(CurrentT>(AlarmTempLow*10)))
{
BEEP=1;
}
else if((CurrentT>(AlarmTempTop*10)))
{
while(1)
{
BEEP=0;
delayms(200);
BEEP=1;
delayms(200);
}
}
else if((CurrentT<(AlarmTempLow*10))||(tflag==1))
{
while(1)
{
BEEP=0;
delayms(1000);
BEEP=1;
delayms(1000);
}
}
}
}
LB@[T004Z0[8GLDKR7AUOS8.png (16.75 KB, 下載次數(shù): 93)
下載附件
仿真電路圖
2017-1-9 16:30 上傳
|
評(píng)分
-
查看全部評(píng)分
|