51 ds18b20的Proteus仿真为什么不正确,不知道哪错了,求助‘’
时间:10-02
整理:3721RD
点击:
#include<reg52.h>
#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int
sbit ds=P2^2; //温度传感器信号线
sbit dula=P2^6;//数码管选段线
sbit wela=P2^7;//数码管选位线
sbit beep=P2^3;// 蜂鸣器
uint temp;//定义整形的温度数据
float f_temp; //定义浮点型的温度数据
uint warn_l1=270;
uint warn_l2=250;
uint warn_h1=300;
uint warn_h2=320;
sbit led0=P1^0;
sbit led1=P1^1;
sbit led2=P1^2;
sbit led3=P1^3;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,//不带小数点的0-9编码
0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//带小数点的0-9温度编码
void delay(uint z)//延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void dsreset(void) //ds18b20的复位,初始化
{
uint i;
ds=0;
i=103;
while(i>0)i--;
ds=1;
i=4;
while(i>0)i--;
}
bit tempreadbit(void)//读一位数据函数
{
uint i;
bit dat;
ds=0;i++;
ds=1;i++;i++;
dat=ds;
i=8;while(i>0)i--;
return(dat);
}
uchar tempread(void)//读一个字节数据函数
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tempreadbit();
dat=(j<<7)|(dat>>1);//读出的数据最低为在最前面
}
return(dat);
}
void tempwritebyte(uchar dat)//向ds18b20写一个字节函数
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb) //写1
{
ds=0;
i++;i++;
ds=1;
i=8;while(i>0)i--;
}
else //写0
{
ds=0;
i=8;while(i>0)i--;
ds=1;
i++;i++;
}
}
}
void tempchange(void)//ds18b20获取温度并转换
{
dsreset();
delay(1);
tempwritebyte(0xcc);//写跳过读ROM指令
tempwritebyte(0x44);//写温度转换指令
}
uint get_temp() //读取寄存器中存储的温度数据
{
uchar a,b;
dsreset();
delay(1);
tempwritebyte(0xcc);
tempwritebyte(0xbe);//读暂存器
a=tempread(); //读低八位
b=tempread(); //读高八位
temp=b;
temp<<=8;//两个字节组合为一个字节
temp=temp|a;
f_temp=temp*0.0625;//温度在寄存器中为12位,分辨率为0.0625
temp=f_temp*10+0.5; //乘以10表示小数点后取一位,0.5表示四舍五入
f_temp=f_temp+0.05;
return temp;
}
void display(uchar num,uchar dat)//数据显示程序
{ //num表示第几个数码管,dat表示要显示的数
uchar i;
dula=0;
P0=table[dat];
dula=1;
dula=0;
wela=0;
i=0XFF;
i=i&(~((0X01)<<(num)));//只有一位为零
P0=i;
wela=1;
wela=0;
delay(1);
}
void dis_temp(uint t) //显示温度数值函数
{
uchar i;
i=t/100; //温度的十位
display(0,i);
i=t%100/10; //温度的个位
display(i,i+10);
i=t%100%10; //温度的小数点位
display(2,i);
}
void warn(uint s,uchar led)//蜂鸣器报警,灯闪烁
{ //s控制音调,led控制灯
uchar i;i=s;
beep=0; //响
P1=~(led); //灯亮
while(i--)
{
dis_temp(get_temp()); //起到延时作用
}
beep=0;
P1=0XFF;
i=s;
while(i--)
{
dis_temp(get_temp());
}
}
void deal(uint t) //温度处理函数
{
uchar i;
if((t>warn_l2)&&(t<=warn_l1))
{
warn(40,0x01);
}
else if(t<=warn_l2)
{
warn(10,0x03);
}
else if((t<warn_h2)&&(t>=warn_h1))
{
warn(40,0x04);
}
else if(t>=warn_h2)
{
warn(10,0x0c);
}
else
{
i=40;
while(i--)
{
dis_temp(get_temp());
}
}
}
void main()
{
uchar buff[4],i;
dula=0;
wela=0;
while(1)
{
tempchange(); //温度转换函数
for(i=10;i>0;i--)
{
dis_temp(get_temp()); //获取温度并显示
}
deal(temp); //温度处理
sprintf(buff,"%f",f_temp); //将浮点型温度格式化为字符型
for(i=10;i>0;i--)
{
dis_temp(get_temp()); //温度显示
}
}
}
#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int
sbit ds=P2^2; //温度传感器信号线
sbit dula=P2^6;//数码管选段线
sbit wela=P2^7;//数码管选位线
sbit beep=P2^3;// 蜂鸣器
uint temp;//定义整形的温度数据
float f_temp; //定义浮点型的温度数据
uint warn_l1=270;
uint warn_l2=250;
uint warn_h1=300;
uint warn_h2=320;
sbit led0=P1^0;
sbit led1=P1^1;
sbit led2=P1^2;
sbit led3=P1^3;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,//不带小数点的0-9编码
0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//带小数点的0-9温度编码
void delay(uint z)//延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void dsreset(void) //ds18b20的复位,初始化
{
uint i;
ds=0;
i=103;
while(i>0)i--;
ds=1;
i=4;
while(i>0)i--;
}
bit tempreadbit(void)//读一位数据函数
{
uint i;
bit dat;
ds=0;i++;
ds=1;i++;i++;
dat=ds;
i=8;while(i>0)i--;
return(dat);
}
uchar tempread(void)//读一个字节数据函数
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tempreadbit();
dat=(j<<7)|(dat>>1);//读出的数据最低为在最前面
}
return(dat);
}
void tempwritebyte(uchar dat)//向ds18b20写一个字节函数
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb) //写1
{
ds=0;
i++;i++;
ds=1;
i=8;while(i>0)i--;
}
else //写0
{
ds=0;
i=8;while(i>0)i--;
ds=1;
i++;i++;
}
}
}
void tempchange(void)//ds18b20获取温度并转换
{
dsreset();
delay(1);
tempwritebyte(0xcc);//写跳过读ROM指令
tempwritebyte(0x44);//写温度转换指令
}
uint get_temp() //读取寄存器中存储的温度数据
{
uchar a,b;
dsreset();
delay(1);
tempwritebyte(0xcc);
tempwritebyte(0xbe);//读暂存器
a=tempread(); //读低八位
b=tempread(); //读高八位
temp=b;
temp<<=8;//两个字节组合为一个字节
temp=temp|a;
f_temp=temp*0.0625;//温度在寄存器中为12位,分辨率为0.0625
temp=f_temp*10+0.5; //乘以10表示小数点后取一位,0.5表示四舍五入
f_temp=f_temp+0.05;
return temp;
}
void display(uchar num,uchar dat)//数据显示程序
{ //num表示第几个数码管,dat表示要显示的数
uchar i;
dula=0;
P0=table[dat];
dula=1;
dula=0;
wela=0;
i=0XFF;
i=i&(~((0X01)<<(num)));//只有一位为零
P0=i;
wela=1;
wela=0;
delay(1);
}
void dis_temp(uint t) //显示温度数值函数
{
uchar i;
i=t/100; //温度的十位
display(0,i);
i=t%100/10; //温度的个位
display(i,i+10);
i=t%100%10; //温度的小数点位
display(2,i);
}
void warn(uint s,uchar led)//蜂鸣器报警,灯闪烁
{ //s控制音调,led控制灯
uchar i;i=s;
beep=0; //响
P1=~(led); //灯亮
while(i--)
{
dis_temp(get_temp()); //起到延时作用
}
beep=0;
P1=0XFF;
i=s;
while(i--)
{
dis_temp(get_temp());
}
}
void deal(uint t) //温度处理函数
{
uchar i;
if((t>warn_l2)&&(t<=warn_l1))
{
warn(40,0x01);
}
else if(t<=warn_l2)
{
warn(10,0x03);
}
else if((t<warn_h2)&&(t>=warn_h1))
{
warn(40,0x04);
}
else if(t>=warn_h2)
{
warn(10,0x0c);
}
else
{
i=40;
while(i--)
{
dis_temp(get_temp());
}
}
}
void main()
{
uchar buff[4],i;
dula=0;
wela=0;
while(1)
{
tempchange(); //温度转换函数
for(i=10;i>0;i--)
{
dis_temp(get_temp()); //获取温度并显示
}
deal(temp); //温度处理
sprintf(buff,"%f",f_temp); //将浮点型温度格式化为字符型
for(i=10;i>0;i--)
{
dis_temp(get_temp()); //温度显示
}
}
}