为什么我的DS18B20程序在实验板上能通过Proteus上却不行
最近做了基于单片机的DS18B20的测温,实验板上我用的是1602的液晶,proteus里没有1602就用了LM016L,可是在实验板上可以显示温度,proteus却仿真...
最近做了基于单片机的DS18B20的测温,实验板上我用的是1602的液晶,proteus里没有1602就用了LM016L,可是在实验板上可以显示温度,proteus却仿真不不出来。各位大侠帮小弟看看是哪里的错。。
下面是程序
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar temp;
sbit lcdrs=P3^5;
sbit lcden=P3^4;
uchar num;
sbit DQ=P2^2;
sbit dula=P2^6;
sbit wela=P2^7;
void delay1(int);
void delay2(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void delay(uint count)
{
uint i;
while(count)
{
i=200;
while(i>0)
i--;
count--;
}
}
void dsreset() /*复位DS18B20*/
{
DQ=0;
delay1(29);
DQ=1;
delay1(2);
}
void delay1(int z)
{
int s;
for (s=0;s<z;s++);
}
void tmpwritebyte(uchar dat) /*向DS18B20内写入一个字节*/
{
bit testb;
int i;
for(i=0;i<8;i++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb==1)
{
DQ=0;
DQ=1;
delay1(3);
}
else
{
DQ=0;
delay1(3);
DQ=1;
}
}
}
bit tmpreadbit() /*从DS18B20内读出一位*/
{
int i;
bit dat;
DQ=0;
i++;
DQ=1;
dat=DQ;
delay1(3);
DQ=1;
return dat;
}
uchar tmpread(void) /*从DS18B20内读出一个字节*/
{
uchar dat,i,j;
dat=0;
for(i=0;i<8;i++)
{
j=tmpreadbit();
dat=(j<<7)|(dat>>1);
}
return dat;
}
void tmpchange()/*开启温度转化*/
{
dsreset();
delay(1);
tmpwritebyte(0xcc);
tmpwritebyte(0x44);
}
uint tmp()/*计算温度*/
{
float tt;
uchar a,b;
dsreset();
delay(1);
tmpwritebyte(0xcc);
tmpwritebyte(0xbe);
a=tmpread();
b=tmpread();
temp=b;
temp<<=8;
temp=temp|a;
tt=temp*0.0625;
temp=tt*10+0.5;
return temp;
}
void write_com(uchar com) /*向1602液晶写入命令*/
{
lcdrs=0;
P0=com;
delay2(5);
lcden=1;
delay2(5);
lcden=0;
}
void write_data(uchar date) /*向1602液晶写入数据*/
{
lcdrs=1;
P0=date;
delay2(5);
lcden=1;
delay2(5);
lcden=0;
}
void init() /*初始化程序*/
{
dula=0;
wela=0;
lcden=0;
write_com(0x38);
write_com(0x0e);
write_com(0x06);
write_com(0x01);
}
void main()/*程序入口*/
{
uchar temp1,bai,shi,ge;
init();
tmpchange();
temp1=tmp();
bai=temp1/100;
shi=temp1%100/10;
ge=temp1%10;
write_com(0x80+0x40);
write_data(0x30+bai);
write_data(0x30+shi);
write_data(0x2e);
write_data(0x30+ge);
delay(20);
}
现在只显示15.9,数字也不变化 展开
下面是程序
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar temp;
sbit lcdrs=P3^5;
sbit lcden=P3^4;
uchar num;
sbit DQ=P2^2;
sbit dula=P2^6;
sbit wela=P2^7;
void delay1(int);
void delay2(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void delay(uint count)
{
uint i;
while(count)
{
i=200;
while(i>0)
i--;
count--;
}
}
void dsreset() /*复位DS18B20*/
{
DQ=0;
delay1(29);
DQ=1;
delay1(2);
}
void delay1(int z)
{
int s;
for (s=0;s<z;s++);
}
void tmpwritebyte(uchar dat) /*向DS18B20内写入一个字节*/
{
bit testb;
int i;
for(i=0;i<8;i++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb==1)
{
DQ=0;
DQ=1;
delay1(3);
}
else
{
DQ=0;
delay1(3);
DQ=1;
}
}
}
bit tmpreadbit() /*从DS18B20内读出一位*/
{
int i;
bit dat;
DQ=0;
i++;
DQ=1;
dat=DQ;
delay1(3);
DQ=1;
return dat;
}
uchar tmpread(void) /*从DS18B20内读出一个字节*/
{
uchar dat,i,j;
dat=0;
for(i=0;i<8;i++)
{
j=tmpreadbit();
dat=(j<<7)|(dat>>1);
}
return dat;
}
void tmpchange()/*开启温度转化*/
{
dsreset();
delay(1);
tmpwritebyte(0xcc);
tmpwritebyte(0x44);
}
uint tmp()/*计算温度*/
{
float tt;
uchar a,b;
dsreset();
delay(1);
tmpwritebyte(0xcc);
tmpwritebyte(0xbe);
a=tmpread();
b=tmpread();
temp=b;
temp<<=8;
temp=temp|a;
tt=temp*0.0625;
temp=tt*10+0.5;
return temp;
}
void write_com(uchar com) /*向1602液晶写入命令*/
{
lcdrs=0;
P0=com;
delay2(5);
lcden=1;
delay2(5);
lcden=0;
}
void write_data(uchar date) /*向1602液晶写入数据*/
{
lcdrs=1;
P0=date;
delay2(5);
lcden=1;
delay2(5);
lcden=0;
}
void init() /*初始化程序*/
{
dula=0;
wela=0;
lcden=0;
write_com(0x38);
write_com(0x0e);
write_com(0x06);
write_com(0x01);
}
void main()/*程序入口*/
{
uchar temp1,bai,shi,ge;
init();
tmpchange();
temp1=tmp();
bai=temp1/100;
shi=temp1%100/10;
ge=temp1%10;
write_com(0x80+0x40);
write_data(0x30+bai);
write_data(0x30+shi);
write_data(0x2e);
write_data(0x30+ge);
delay(20);
}
现在只显示15.9,数字也不变化 展开
1个回答
东莞大凡
2024-08-07 广告
2024-08-07 广告
在东莞市大凡光学科技有限公司,我们利用Halcon软件处理机器视觉项目时,会用到自定义标定板以满足特定需求。Halcon支持用户根据实际应用场景自定义标定板形状与标记点。这不仅可以灵活应对不同工作环境,还能提高标定精度。通过调整圆点数量、间...
点击进入详情页
本回答由东莞大凡提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询