我设置的温度超过60度LED等就会亮,温度没超过60度时,数码管显示温度值正常,但是还是有一堆的看不懂的提醒定位是ds18b20好像有问题;然后温度超过60度后,LED灯亮,但是数码管不显示温度值,调节温度传感器也没有反应,而且仍然有一堆的提醒ds18b20好像有问题,求解答谢谢!!!
单片机源程序:
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit du26=P2^6;//数码管段选
sbit we27=P2^7;//数码管位选
sbit DS=P2^2;//温度传感器
sbit led1=P3^7;//led
uchar code smgdu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0~9数码管段表
uchar code smgwei[]={0xfe,0xfd,0xfb}; //1~3数码管位表
uint sum,wendu;
uint tt,y;
void delay(uchar z)
{
uchar x,y;
for(x=0;x<z;x++)
for(y=0;y<110;y++);
}
void we(uchar z) //位选
{
we27=0;
P0=z;
we27=1;
we27=0;
}
void du(uchar z) //段选
{
du26=0;
P0=z;
du26=1;
du26=0;
}
void display() //三个数码管显示
{
static uchar wei;
switch(wei)
{
case 0:we(smgwei[wei]);du(smgdu[wendu/100]);break;
case 1:we(smgwei[wei]);du(smgdu[wendu%100/10]|0x80);break;
case 2:we(smgwei[wei]);du(smgdu[wendu%10]);break;
}
wei++;
if(wei==3)
wei=0;
}
void timer0int() interrupt 1 //定时器,定时5ms
{
static uchar num;
TH0=(65535-5000)/256;
TL0=(65535-5000)%256;
num++;
display();
if(num>=200) //延时1s显示温度数值
{
num=0;
y=1;
}
}
void delay_us(uchar us) //延时函数
{
while(us--);
}
//单总线初始化时序
bit ds_init()
{
bit i;
DS=1;
_nop_();
DS=0;
delay_us(75);//拉低总线499.45us,总线上的温度传感器将会被全部复位
DS=1;//释放总线
delay_us(4);//延时37.95us,等待温度传感器发回存在信号
i=DS;
delay_us(25);//延时141.95us,读取温度传感器存在的时间
DS=1;
_nop_();
return (i);
}
//写一个字节
void write_byte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
DS=0;
_nop_(); //产生写时序
DS=dat&0x01;
delay_us(12);//延时76.95us
DS=1;//释放总线准备下一次数据的写入
_nop_();
dat>>=1;
}
}
//读一个字节
uchar read_byte()
{
uchar i,j,dat;
for(i=0;i<8;i++)
{
DS=0;
_nop_();//产生读时序
DS=1;
_nop_();//释放总线
j=DS;
delay_us(12);//76.95us
DS=1;
_nop_();
dat=(j<<7)|(dat>>1);
}
return (dat);
}
void main()
{
uint i;
uchar L,M;
EA=1;
ET0=1;
TR0=1;
TMOD=0X01;
TH0=(65535-5000)/256;
TL0=(65535-5000)%256;
while(1)
{
ds_init();//初始化温度传感器
write_byte(0xcc);//发送跳跃ROM指令
write_byte(0x44);//发送温度转换指令
delay(50);
ds_init();//初始化温度传感器
write_byte(0xcc);//发送跳跃ROM指令
write_byte(0xbe);//读取温度传感器暂存器的值
L=read_byte();
M=read_byte();
i=M;
i<<=8;
i|=L;
i=i*0.0625*10+0.5;//将读出来的数据合并存到i中
if(y==1)
{
y=0;
wendu=i;
}
if(wendu>=600) //温度超过60度,LED灯亮
led1=0;
else
led1=1;
}
}
|