标题:
基于51的温控系统温度问题
[打印本页]
作者:
1074024793
时间:
2019-4-20 11:27
标题:
基于51的温控系统温度问题
我的温度 显示不能随传感器温度的改变而变化是为什么?
#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; //控制发光二极管
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复位,初始化函数
{
ds=1;
delay2(8);
ds=0;
delay2(90);
ds=1;
delay2(4);
if(ds==0)
delay2(14);
ds=1;
}
uchar read_ds18b20_byte() //读1字节数据函数(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;//循环8次完成一个字节,并返回数据
}
void write_ds18b20_byte(uchar date)//向ds8b20写1字节数据函数
{
uchar j=0;
for(j=0;j<=8;j++)
{
ds=0;
ds=date&0x01; //取出数据最低位送到数据线
delay2(5);
ds=1;
date=date>>1;//字节右移一位,接着取第二位
delay2(5);
}
}
int read_ds18b20_temp() //DS18B20开始获取温度并转换
{
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()//显示温度数值函数,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, 下载次数: 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; //控制发光二极管
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延时函数
{
while(--us);
}
void delay(uchar z)//约1ms延时函数
{
while(z--)
{
delay_us(245);
delay_us(245);
}
}
//读一个字节
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);
}
//写一个字节
void write_byte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
DS=0;
DS=dat&0x01;
delay_us(25);//延时
DS=1;//释放总线准备下一次数据的写入
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,等待温度传感器发回存在信号
i=DS;
delay_us(25);//延时141.95us,读取温度传感器存在的时间
return (i);
}
uint ReadTemperature()
{
uint H,i;
uchar L;
ds_init();//初始化温度传感器
write_byte(0xcc);//发送跳跃ROM指令
write_byte(0x44);//发送温度转换指令
delay(10);
ds_init();//初始化温度传感器
write_byte(0xcc);//发送跳跃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()//显示温度数值函数,t传递的是整型的温度值
{
uint tp,tpz;
uchar tpshi,tpge,tpxiao;
tp=ReadTemperature();
if(tp>0x0630 || (tp&0x8000)>0)//限制在0~99范围
tp=0;
tpz=tp>>4; //分解为整数;
tpxiao=tp&0x0f;//分解为小数
tpxiao=tpxiao*6/10;//保留一位小数
/*
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
沙发误导你。
作者:
爱爱爱
时间:
2019-4-27 21:38
单片机时序有没有问题
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1