DS18B20溫度采集,可以讓液晶1602顯示出
程序100%可以運行 哈哈
//DS18B20溫度采集,LCD1602顯示
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar table[]={" temp:"};
uchar table1[]={"www.E3_china.cn"};
/********IO引腳定義**********/
sbit rs=P1^0;
sbit rw=P1^1;
sbit en=P1^2;
sbit dq=P3^2;
sbit beep=P1^5;
uchar num;
uint tempwarn,d=0,h=0;
void delay(uint n) //延時程序
{
while(n>0)n--;
}
void write_com(uchar com) //液晶寫命令程序
{
rs=0; //等0輸入命令
en=0; //液晶使能信號初始化
P0=com; //把com參數,液晶的命令值送到P0口
delay(100); //延時,按照液晶的時序圖的要求
en=1; //使能信號,0到1表示上升沿打開可以寫命令數據到液晶里
delay(100);
en=0; //使能信號回復
}
void write_data(uchar date) //液晶寫數據程序
{
rs=1; //等1表示輸入數據
en=0;
P0=date; //把date參數,液晶的數據送到P0口
delay(100);
en=1;
delay(100);
en=0;
}
void init() //液晶初始化程序
{
en=0;
write_com(0x38); //設置16X2顯示,5X7點陣,8位數據口
write_com(0x0c); //設置開顯示,不顯示光標
write_com(0x06); //寫一個字符后地址指針加1
write_com(0x01); //顯示清0,數據指針清0
}
void Writebyte(uchar dat)//DS18B20溫度芯片的寫字節程序
{
uchar j;
for(j=0;j<8;j++)
{
dq=0;
dq=dat&0x01;
delay(5);
dq=1;
dat>>=1;
}
}
uchar Readbyte(void)//DS18B20溫度芯片讀字節程序
{
uchar i,dat=0;
for(i=0;i<8;i++)
{
dq=0;
dat>>=1;
dq=1;
if(dq==1)
dat|=0x80;
delay(4);
}
return dat;
}
void initds18b20(void)//溫度芯片初始化程序
{
uchar x=0;
dq=1;
delay(8);
dq=0;
delay(80);
dq=1;
delay(14);
x=dq;
delay(20);
}
void Readtemp(void)//讀溫度程序
{
initds18b20();
Writebyte(0xcc);
Writebyte(0x44);
initds18b20();
Writebyte(0xcc);
Writebyte(0xbe);
d=Readbyte(); //溫度信號的低8位數據函數
h=Readbyte(); //溫度信號的高8位數據函數
}
convert() //溫度信號處理程序,把溫度信號數據值轉換為液晶顯示
{
uint temp,tmp;
float tt;
tmp=d; //低8位數據給tmp
temp=h; //高8位數據給temp
temp<<=8; //高8位左移8位
temp|=d; //高低8位數據或起來再賦給temp
if((h&0x80)!=0) //高8位h&10000000是否等0,不等0表示負多少度
{
table[7]='-'; //把-賦給液晶數組的第8個元素,表示-號在第8位,1602一行有16個字符
temp=temp-1;
temp=~temp;
}
else
table[7]='+';
temp>>=4;
table[8]=(temp/100)+'0'; //液晶第9位字符為溫度的百位數,例如120度的1
table[9]=(temp/10)%10+'0'; //液晶第10位字符為溫度的十位數,例如120度的2
table[10]=(temp%10)+'0'; //液晶第9位字符為溫度的個位數,例如120度的0
tmp=tmp&0x0f; //低位溫度提取小數數據
tt=tmp*0.0625; //小數部分數據轉換
table[11]='.'; //顯示小數點
table[12]=((uchar)(tt*10))%10+'0';//小數點后面的小數數字
tempwarn=temp;
return tempwarn;//溫度值返回
}
void warn(uint tempwarn)//溫度報警程序
{
if(tempwarn<=16) //返回的值是溫度的值,如果溫度小于20度就報警并且啟動風冷設備
{
beep=0;
delay(5000);//蜂鳴器的聲音響的時間
beep=1;
delay(50000); //蜂鳴器的聲音不響的時間
}
else if(tempwarn>=25)//如果溫度大于25度并且啟動報警
{
beep=0;
delay(5000);
beep=1;
delay(50000);
}
}
void main()
{
rw=0; //rw直接置0,應該在液晶初始化前,否則斷電后再通電就不能顯示,切記!!!
init(); //液晶初始化函數
write_com(0x80+0x40); //0x80+0x40表示液晶的第二行開始顯示
for(num=0;num<15;num++) //num<16,16表示顯示16位
{
write_data(table1[num]);//液晶顯示需要的內容,調用寫液晶數據函數,這行顯示拼音dengtianming
}
while(1) //大循環,不斷檢測和更新溫度
{
Readtemp();
convert();
warn(tempwarn);
write_com(0x80); //液晶的第一行開始地址
for(num=0;num<15;num++)//顯示16位數據,后面的幾位沒有用到就寫不到16,以免后面的幾位會出現一個隨機數據顯示亂碼
{
write_data(table[num]);//液晶需要顯示的內容
}
}
}
|