標題:
基于51的溫控系統(tǒng)溫度問題
[打印本頁]
作者:
1074024793
時間:
2019-4-20 11:27
標題:
基于51的溫控系統(tǒng)溫度問題
我的溫度 顯示不能隨傳感器溫度的改變而變化是為什么?
#include <reg52.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
sbit ds=P3^5; //溫度傳感器
sbit beep=P3^7;
sbit rs=P2^4; //控制發(fā)光二極管
sbit rw=P2^3;
sbit lcde=P2^2;
uchar tp,tpx,num,count,miao,fen,shi;
uchar code table[]="happy everyday!";
uchar code table1[]=": :";
uchar code table2[]="weather:cold";
uchar code table3[]="weather:hot";
void delay(uint z) //延時
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void delay2(uint i)
{
while(i--);
}
////***ds18b20*****///
void init_ds18b20() //DS18B20復位,初始化函數(shù)
{
ds=1;
delay2(8);
ds=0;
delay2(90);
ds=1;
delay2(4);
if(ds==0)
delay2(14);
ds=1;
}
uchar read_ds18b20_byte() //讀1字節(jié)數(shù)據(jù)函數(shù)(MSB)
{
uchar i,dat;
dat=0;
for(i=0;i<8;i++)
{
ds=0;
dat=dat>>1;
ds=1;
if(ds==1)
{
dat=dat|0x80;//最高位或上一個1,使得最高位為1
}
delay2(4);
}
return dat;//循環(huán)8次完成一個字節(jié),并返回數(shù)據(jù)
}
void write_ds18b20_byte(uchar date)//向ds8b20寫1字節(jié)數(shù)據(jù)函數(shù)
{
uchar j=0;
for(j=0;j<=8;j++)
{
ds=0;
ds=date&0x01; //取出數(shù)據(jù)最低位送到數(shù)據(jù)線
delay2(5);
ds=1;
date=date>>1;//字節(jié)右移一位,接著取第二位
delay2(5);
}
}
int read_ds18b20_temp() //DS18B20開始獲取溫度并轉(zhuǎn)換
{
uchar a=0;//低8位
uint b=0;//高8位
uint t=0;//組成新溫度
init_ds18b20();
write_ds18b20_byte(0xcc);
write_ds18b20_byte(0x44);
init_ds18b20();
write_ds18b20_byte(0xcc);
write_ds18b20_byte(0xbe);
a=read_ds18b20_byte();
b=read_ds18b20_byte();
a=a&0x00ff;
b=(b&0x000f)<<8;
t=a|b;
return t;
}
void writecom(uchar com)
{
rs=0;
rw=0;
lcde=0;
delay(5);
lcde=0;
P1=com;
delay(5);
lcde=1;
delay(5);
lcde=0;
}
void writedate(uchar date)
{
rs=1;
rw=0;
delay(5);
lcde=0;
P1=date;
delay(5);
lcde=1;
delay(5);
lcde=0;
}
void wendudisplay()//顯示溫度數(shù)值函數(shù),t傳遞的是整型的溫度值
{
uint tp,tpz;
uchar tp2,tpshi,tpge,tpxiao;
tp=read_ds18b20_temp();
tp2=tp&0x000f;
tpxiao=tp2*0.0625;
tpz=(tp&0x0ff0)>>4;
tpz=tpz*0.0625;
tpshi=tpz/10;
tpge=tpz%10;
writecom(0x80+0x40+10);
writedate(tpshi+0x30);
writedate(tpge+0x30);
writedate('.') ;
writedate(tpxiao+0x30);
writedate(0xdf);
writedate('C');
if(tpz<15)
{
writecom(0x80);
for(num=0;num<16;num++)
{
writedate(table2[num]);
delay(5);
beep=0;
}
}
if((tpz<25)&&(tpz>=15))
{
writecom(0x80);
for(num=0;num<15;num++)
{
writedate(table[num]);
delay(5);
beep=1;
}
}
if(tpz>25)
{
writecom(0x80);
for(num=0;num<16;num++)
{
writedate(table3[num]);
delay(5);
}
}
}
void writesfm(uchar add,uchar date)
{
uchar shi,ge;
shi=date/10;
ge=date%10;
writecom(0x80+0x40+add);
writedate(0x30+shi);
writedate(0x30+ge);
writecom(0x80+0x40+add);
}
void init()
{
lcde=0;
writecom(0x38);
writecom(0x0c);
writecom(0x06);
writecom(0x01);
delay(5);
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
miao=15;
fen=12;
shi=12;
}
void main()
{
init();
while(1)
{
wendudisplay();
writesfm(0,shi);
writesfm(3,fen);
writesfm(6,miao);
writecom(0x80+0x40+2);
writedate(':');
writecom(0x80+0x40+5);
writedate(':');
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count==20)
{
count=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
shi++;
fen=0;
if(shi==24)
shi=0;
}
}
}
}
作者:
dianzi741
時間:
2019-4-20 14:49
中斷會影響18b20 的讀值 我以前遇到過,這個屬于模擬I2C的時序問題
作者:
wulin
時間:
2019-4-20 15:57
給你改好了,仿真和程序的LCD用的是P0,你自己改回P1
無標題.jpg
(171.49 KB, 下載次數(shù): 17)
下載附件
2019-4-20 15:56 上傳
#include <reg52.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
sbit DS=P3^5; //溫度傳感器
sbit beep=P3^7;
sbit rs=P2^4; //控制發(fā)光二極管
sbit rw=P2^3;
sbit lcde=P2^2;
uchar tp,tpx,num,count,miao,fen,shi;
uchar code table[]= "happy everyday! ";
uchar code table1[]=": :";
uchar code table2[]="weather:cold ";
uchar code table3[]="weather:hot ";
void delay_us(uchar us)//約2us延時函數(shù)
{
while(--us);
}
void delay(uchar z)//約1ms延時函數(shù)
{
while(z--)
{
delay_us(245);
delay_us(245);
}
}
//讀一個字節(jié)
uchar read_byte()
{
uchar i,dat;
for(i=0;i<8;i++)
{
DS=0;
dat>>=1;
DS=1;
if(DS)
dat|=0x80;
delay_us(25);
}
return (dat);
}
//寫一個字節(jié)
void write_byte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
DS=0;
DS=dat&0x01;
delay_us(25);//延時
DS=1;//釋放總線準備下一次數(shù)據(jù)的寫入
dat>>=1;
}
}
//單總線初始化時序
bit ds_init()
{
bit i;
DS=1;
delay_us(5);
DS=0;
delay_us(200);//拉低總線499.45us,總線上的溫度傳感器將會被全部復位
delay_us(200);
DS=1;//釋放總線
delay_us(50);//延時37.95us,等待溫度傳感器發(fā)回存在信號
i=DS;
delay_us(25);//延時141.95us,讀取溫度傳感器存在的時間
return (i);
}
uint ReadTemperature()
{
uint H,i;
uchar L;
ds_init();//初始化溫度傳感器
write_byte(0xcc);//發(fā)送跳躍ROM指令
write_byte(0x44);//發(fā)送溫度轉(zhuǎn)換指令
delay(10);
ds_init();//初始化溫度傳感器
write_byte(0xcc);//發(fā)送跳躍ROM指令
write_byte(0xbe);//讀取溫度傳感器暫存器的值
L=read_byte();
H=read_byte();
H<<=8;
i=L+H;
return(i);
}
void writecom(uchar com)
{
rs=0;
rw=0;
lcde=0;
delay(5);
lcde=0;
P0=com;
delay(5);
lcde=1;
delay(5);
lcde=0;
}
void writedate(uchar date)
{
rs=1;
rw=0;
delay(5);
lcde=0;
P0=date;
delay(5);
lcde=1;
delay(5);
lcde=0;
}
void wendudisplay()//顯示溫度數(shù)值函數(shù),t傳遞的是整型的溫度值
{
uint tp,tpz;
uchar tpshi,tpge,tpxiao;
tp=ReadTemperature();
if(tp>0x0630 || (tp&0x8000)>0)//限制在0~99范圍
tp=0;
tpz=tp>>4; //分解為整數(shù);
tpxiao=tp&0x0f;//分解為小數(shù)
tpxiao=tpxiao*6/10;//保留一位小數(shù)
/*
tp2=tp&0x000f;
tpxiao=tp2*0.0625;
tpz=(tp&0x0ff0)>>4;
tpz=tpz*0.0625;
*/
tpshi=tpz/10;
tpge=tpz%10;
writecom(0x80+0x40+10);
writedate(tpshi+0x30);
writedate(tpge+0x30);
writedate('.') ;
writedate(tpxiao+0x30);
writedate(0xdf);
writedate('C');
if(tpz<15)
{
writecom(0x80);
for(num=0;num<16;num++)
{
writedate(table2[num]);
delay(5);
beep=0;
}
}
if((tpz<25)&&(tpz>=15))
{
writecom(0x80);
for(num=0;num<16;num++)
{
writedate(table[num]);
delay(5);
beep=1;
}
}
if(tpz>25)
{
writecom(0x80);
for(num=0;num<16;num++)
{
writedate(table3[num]);
delay(5);
}
}
}
void writesfm(uchar add,uchar date)
{
uchar shi,ge;
shi=date/10;
ge=date%10;
writecom(0x80+0x40+add);
writedate(0x30+shi);
writedate(0x30+ge);
writecom(0x80+0x40+add);
}
void init()
{
lcde=0;
writecom(0x38);
writecom(0x0c);
writecom(0x06);
writecom(0x01);
delay(5);
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
miao=15;
fen=12;
shi=12;
}
void main()
{
init();
writecom(0x80+0x40+2);
writedate(':');
writecom(0x80+0x40+5);
writedate(':');
while(1)
{
wendudisplay();
writesfm(0,shi);
writesfm(3,fen);
writesfm(6,miao);
// writecom(0x80+0x40+2);
// writedate(':');
// writecom(0x80+0x40+5);
// writedate(':');
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count==20)
{
count=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
shi++;
fen=0;
if(shi==24)
shi=0;
}
}
}
}
復制代碼
作者:
yzwzfyz
時間:
2019-4-20 16:53
沙發(fā)誤導你。
作者:
愛愛愛
時間:
2019-4-27 21:38
單片機時序有沒有問題
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1