单片机DS18B20测温的问题,程序好像没问题,但是用protues仿真就是没反应,请高手们帮帮忙!

#include<reg52.h>

#define uchar unsigned char
#define uint unsigned int

sbit DQ=P3^4;
sbit we1=P2^0;
sbit we2=P2^1;
sbit en=P2^4;

uchar smg_du[]={
0x3F,
0x06,
0x5B,
0x4F,
0x66,
0x6D,
0x7D,
0x07,
0x7F,
0x6F};

uchar temp;

/////////////////////////////////////////////////////
void init_ds18b20(void);
void delay(uint t);
void write_byte(uchar dat);
uchar read_byte(void);
uchar readtemperature(void);
void display();
void delay_50us(uint t);

///////////////////////////////////////////////////////
void main()
{
while(1)
{
temp=readtemperature();
display();
}
}

////////////////////////////////////////////////////////
void init_ds18b20(void)
{
uchar n;
DQ=1;
delay(8);
DQ=0;
delay(80); //大约600us
DQ=1;
delay(8);
n=DQ;
delay(4);
}

////////////////////////////////////////////////////////
void display()
{
en=1;
we1=1;
we2=0;
P0=smg_du[temp%10];
en=0;
delay_50us(20);

en=1;
we1=0;
we2=1;
P0=smg_du[temp/10];
en=0;
delay_50us(20);

}
////////////////////////////////////////////////////////
void delay_50us(uint t)
{
uchar j;
for(;t>0;t--)
for(j=19;j>0;j--);
}

void delay(uint t)
{
while(t--);
}

/////////////////////////////////////////////////////////
void write_byte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
DQ=0;
DQ=dat&0x01;
delay(4); // 大约40us~50us
DQ=1;
dat>>=1;
}
delay(4);
}
////////////////////////////////////////////////////////
uchar read_byte(void)
{
uchar i;
uchar value;
for(i=0;i<8;i++)
{
DQ=0;
value>>=1;
DQ=1;
if(DQ)
value|=0x80;
delay(4);
}
return value;
}

////////////////////////////////////////////////////////
uchar readtemperature(void)
{
uchar a,b;

init_ds18b20();
write_byte(0xcc); //跳过rom
write_byte(0x44); //启动温度测量
delay(300);

init_ds18b20();
write_byte(0xcc);
write_byte(0xbe); // 读取命令
a=read_byte(); // 读取低位
b=read_byte(); // 读取高位

b<<=4;
b+=(a&0xf0)>>4;
return b;
}
////////////////////////////////////////////////////////

看一下晶振对了没有,这个很关键
对了,你怎么这样写程序啊,这样显示的时间会不均衡的,即每位数码管显示的时间不一样,会带来一个暗一个亮,特别是当你想加点其它功能,比如说按键,采AD等等时,你会发现显示的不正常
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-12-02
先确定你的显示部分是正常的,然后再调试18B20的程序
18B20的程序比较啰嗦,用虚拟示波器查看下波形
第2个回答  2011-11-29
protues仿真ds18b20与实际不符是正常的。追问

可是我的是显示不了哦!

第3个回答  2017-12-08
读ds18B20的读完后少DQ=1;底下是在proteus上及实物可以用
uchar ReadOneByte()
{
uchar i,dat=0;
DQ = 1;
_nop_();
for(i=0;i<8;i++)
{
DQ = 0;
dat >>= 1;
DQ = 1;
_nop_();
_nop_();
if(DQ)
dat |= 0X80;
Delay(30);
DQ = 1; // 你的程序少了这个
}
return dat;
}

单片机DS18B20测温的问题,程序好像没问题,但是用protues仿真就是没...
你这是动态显示,ds18b20转换时间很长,基本上数码管就没有闪烁的时间就过去了,人眼很难捕捉到,你用静态显示就看见了 如果想动态显示那么 display();改成for(i=1;i<100,i++){ display();} 可以调整i的上限观察吧

单片机DS18B20测温的问题,程序好像没问题,但是用protues仿真就是没...
对了,你怎么这样写程序啊,这样显示的时间会不均衡的,即每位数码管显示的时间不一样,会带来一个暗一个亮,特别是当你想加点其它功能,比如说按键,采AD等等时,你会发现显示的不正常

...芯片程序,烧写在板子上的和用protues软件仿真用的程序为何不能通用啊...
我看你的段码代码,0是0xbf,但是这个仿真图如果是共阳数码管的话,0应该是0xc0;共阴数码管,则是0x3f。

PROTUES 仿真 DS18B20 当温度在12~25以内时,数码管显示不稳定,其他的...
其次,看你的程序,P1口却是段控,所以,你的仿真图并不是运行这个程度。或者,你这个仿真图是从别人那复制过来的,不是你的程序的运行结果。所以,你的问题,与程序,与仿真图都不相符,或都不是你的,那也就找不到真正的原因了。

在protues中AD620,LM358,RV1可以用哪些元件替换仿真?
如果是测温的话可以用DS18b20代替,这是一个串行输入输出数字的温度传感器,网上资料很多,感觉比AD590方便(不用再另加AD了,直接输出数字量)。但是如果一定要用到0809转换的话那protues里就没有适合的了。再有protues里面只能对ADC0808进行仿真(AD0809不能进行仿真),其用法、硬件连接和程序都是一致的...

用AT89C51单片机和温度传感器DS18B20S设计数字式温度计
本设计采用的主控芯片是ATMEL公司的AT89S52单片机,数字温度传感器是DALLAS公司的DS18B20。本设计用数字传感器DS18B20测量温度,测量精度高,传感器体积小,使用方便。所以本次设计的数字温度计在工业、农业、日常生活中都有广泛的应用。单片机技术已经广泛应用社会生活的各个领域,已经成为一种非常实用的技术。51单片机是最常用的...

求:基于AT89C51单片机的多路DS18B20测温显示
bit DS18B20_FLG = 0; \/\/“1”:DS18B20存在 ;“0”:不存在 unsigned char LEDBuf[4];void delay(unsigned int i);\/\/延时 display();\/\/DS18B20温度采集子程序\/\/\/DS18B20温度采集子程序\/\/\/DS18B20温度采集子程序\/\/\/ unsigned char Init_DS18B20(void);unsigned char Read_DS18B20(void); ...

...温度传感器是DS18B20) 寻高手帮在C语言程序中加个报警程序。急需...
if(flag)\/\/温度为正数 由于实际的焊的板子只有三个数码管 所以,没加“+” 了。如 45.0度 { \/\/DIN=1;P2=0xff;P2=seg[0];P0=tab[0];delay1(4);P2=0xff;P2=seg[1];P0=tab[ge];DIN=0; \/\/ 问题问什么 加小数点要在P2口上加才能正常显示。delay1(4);DIN=1;P2=0xff;P2=...

在protues仿真中lm016l只是屏幕有亮光,但不显示内容。
可以给你i写一份

相似回答