用PROTUES仿真51单片机连接DS18B20实时采集温度时,数码管显示不停闪烁

本人在学习51单片机,本次仿真中温度的十位不停闪烁。求各位大神帮忙看看哪里的问题?下图是显示27时的效果十位不停闪烁。晶振采用的是12MHZ.延时子函数延时怎么换算?

以下是protues仿真警告

#include <reg52.h>
#include<intrins.h>//用于调用_nop_();延时指令
#define uchar unsigned char
#define uint unsigned int
sbit dq=P2^2;
uint temp;
uchar code table[]={0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e,0xbf};//共阳极码
uchar sel;
void DELAY(uint ms)
{
uint i,j;
for(i=ms;i>0;i--)
for(j=120;j>0;j--);
}
void delay1(uint a)
{
while(--a);
}
void disp(uchar num)
{
uchar shi,ge;
shi=num/10;
ge=num%10;
sel=0x80;

P0=0xFF;//消隐
P0=table[shi];//输出十位
P2=sel;
DELAY(80);
sel=sel>>1;

P0=0xFF;//消隐
P0=table[ge];//输出个位
P2=sel;
DELAY(80);
sel=sel>>1;

}
uchar init()//复位并检测18b20的好坏
{
uchar a;
dq=1;//将总线拉高
delay1(8);//延时
dq=0;//将总线拉低
delay1(90);//延时750us
dq=1;
_nop_();//延时15~60us
_nop_();
a=dq;
delay1(100);//延时
dq=1;
return a;
}
void weite(uchar dat)//写数据
{
uchar i;
for(i=0;i<8;i++)
{
dq=0;
dq=dat&0x01;
delay1(5);//延时45us
dq=1;
dat>>=1;
}
}
uchar read()
{
uchar i,dat=0;
dq=1;
_nop_();
for(i=0;i<8;i++)
{
dq=0;//拉低数据总线
_nop_();//拉低数据总线6us
_nop_();
dat>>=1;//因为首先接收数据的低字节
dq=1;//拉高数据总线
_nop_();//拉低数据总线6us
_nop_();
if(dq)
dat|=0x80;
delay1(30);//延时约40us
dq=1;
}
return dat;
}
uchar read_tu()//读取温度
{
uchar a,b;
init();//复位
weite(0xcc);//跳过序列号(ID地址)
weite(0x44);//启动温度转换
init();
weite(0xcc);//跳过序列号(ID地址)
weite(0xbe);
a=read();//装载温度低字节
b=read();//装载温度高字节
b<<=4;
a>>=4;
b+=a;
return b;
}
void main()
{
DELAY(30);
while(1)
{
temp=read_tu();
disp(temp);
}
}

不停闪 那肯定是刷新时间没有设定好 但是仿真和现实不同 用在实际电路时可能就不闪了 所以还是要根据实际情况啦设定延时时间
温馨提示:内容为网友见解,仅供参考
第1个回答  2014-08-28
不停闪 那肯定是刷新时间没有设定好

PROTUES 仿真 DS18B20 当温度在12~25以内时,数码管显示不稳定,其他的...
首先,仿真图的P1口是位控,看引脚的运行状态和仿真图,数码管是共阳的,那么,仿真图对数码管的位控是不能串联限流电阻的,可以把P1口的4个电阻都去掉,用导线直接连接。其次,看你的程序,P1口却是段控,所以,你的仿真图并不是运行这个程度。或者,你这个仿真图是从别人那复制过来的,不是你的...

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

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

用AT89C51单片机和温度传感器DS18B20S设计数字式温度计
温度显示采用4位LED数码管显示,三位整数,一位小数,具有键盘输入上下限功能,超过上下限温度时,进行声音报警,DS18B20为检测器件,进行单点温度检测,检测精度为+-0.5℃急求,今天中午就要交了要有Protues仿真图和C语言程序邮箱1807223298@qq.com 展开  我来答 4个回答 #热议# 如何缓解焦虑情绪? 匿名用户 2020-05...

求:基于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温度传感器芯片程序,烧写在板子上的和用protues软件...
你看一下你开发板的原理图和你的仿真原理图是否一样的。我看你的段码代码,0是0xbf,但是这个仿真图如果是共阳数码管的话,0应该是0xc0;共阴数码管,则是0x3f。

基于18B20的多点温度显示系统
定时器T0中断函数每隔5ms执行1次,动态显示1位数码管;定时器T1中断函数每隔50ms中断1次,每中断20次(1秒)即读取1路DS18B20的温度代码,转换为温度值,再拆分成单个数码后送入显示缓冲区。DS18B20接口程序主要由复位函数、读位函数、读字节函数、写位函数、写字节函数、读温度函数等组成。 2、 参考程序 #include <...

protues仿真ds18b20怎么设置显示小数
这个直接调节是不可以的,只能双击元件,在属性对话框内设置。其实温度的小数没不要。

用单片机做温度检测系统 论文,
用DS18B20做的电子温度计,非常简单。include <reg51.h> include\\"AscLed.h\\"include <intrins.h> include <stdio.h> \/\/ define Seck (500\/TK) \/\/1秒中的主程序的系数 define OffLed (Seck*5*60) \/\/自动关机的时间5分钟!\/\/ if (FHz==0)define NOP_2uS_nop_()else defin...

...单片机数字温度传感器设计 (温度传感器是DS18B20) 寻高手帮在C语言...
\/*void init_display()\/\/上电时数码管的显示 { P2=0xff;delay(3);} *\/ void display(uint k)\/\/显示温度 { uchar ge,shi,bai;ge=k%10;shi=k\/10%10; \/\/shiwei bai=k\/100;if(!flag)\/\/温度为负数 { P2=seg[0];P0=0xbf;\/\/负号 显示"-"delay1(4);P2=0xff;P2=seg[1];P0=...

相似回答