基于单片机DS18B20的程序在实验板上可以通过,在proteus却仿真不出来
做了个测温程序在实验板上我用1602的液晶可以显示出温度可是在proteus里我用LM016L却仿真不出来各位大侠帮忙看看是什么问题。。。下面是我写的程序#include...
做了个测温程序在实验板上我用1602的液晶可以显示出温度可是在proteus里我用LM016L却仿真不出来 各位大侠帮忙看看是什么问题。。。
下面是我写的程序
#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);
}
改过了 还是不行,液晶的I/O口貌似是有高低电平变化,可是显示的就老是0,怎么回事.....现在不显示0了 ,可是只显示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);
}
改过了 还是不行,液晶的I/O口貌似是有高低电平变化,可是显示的就老是0,怎么回事.....现在不显示0了 ,可是只显示15.9,数字也不变化 展开
1个回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询