微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 关于用1602显示18b20温度的问题,麻烦各位大神相助。十分.....

关于用1602显示18b20温度的问题,麻烦各位大神相助。十分.....

时间:10-02 整理:3721RD 点击:
用1602显示18b20的温度数字,可是数字一直在闪动,且没有变化,另外,想再其他位显示一些固定的信息,怎么实现啊啊啊 啊?急求,十分感谢!下面是小弟的程序,不知错在哪里了。
#include  <reg52.h>
#include  <intrins.h>
#define uchar unsigned char
#define uint unsigned int
void delay(uint z);
void write(uchar date);
void readtemp();
void display();
void init();
void writecom(uchar com);
void writedate(uchar da);
void zhunbei();
void lcd_pos(uchar pos);
sbit DQ=P3^3;
sbit rs=P2^0;
sbit rw=P2^1;
sbit E=P2^2;
uint h,num;
uchar flag,time,TN,TD,TH,TL,x=22,s=25;
  uchar ss,sg,xs,xg;
uchar code shu[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
uchar code wendu[]={"Wendu:  ." };
bit lcd_busy()
{                          
    bit result ;
    rs = 0 ;
    rw = 1 ;
    E = 1 ;
    delay(5) ;
    result = (bit)(P0&0x80) ;
    E= 0 ;
    return(result) ;
}
/****初始化函数***/
reset(void)
{
     
     
flag=1;
while(flag)
  {
   while(flag)
   {
    DQ=1;
    _nop_();
    _nop_();
    DQ=0;
    for(time=0;time<200;time++);
    DQ=1;
    for(time=0;time<20;time++);
    flag=DQ;
   }
   for(time=0;time<200;time++);
   flag=~DQ;
  }
  DQ=1;
  return(flag) ; //返回信号,0=presence,1= no presence  
}
/****写函数****/
void write(uchar date)
{
uchar i;
for(i=0;i<8;i++)
{
  DQ=1;
  _nop_();
  DQ=0;
  DQ=date&0x01;
  for(time=0;time<10;time++);
  DQ=1;
  for(time=0;time<1;time++);
  date>>=1;
  
}
for(time=0;time<4;time++);

}
/******读函数******/
uchar read(void)
{
uchar j=0;
uchar value;
for(j=8;j>0;j--)
  {
    DQ=1;
    _nop_();
    DQ=0;
    _nop_();
    DQ=1;
    for(time=0;time<3;time++);
    value>>=1;
    if(DQ==1)
      value|=0x80;
   else
    value|=0x00;
    for(time=0;time<20;time++);
  }
return(value);
        
}
/*******读取温度****/
void readtemp()
{
reset();
write(0xcc) ;
write(0x44);

reset();
write(0xcc);
write(0xbe);
TL=read();
TH=read();
}
/**1602****/
void lcd_pos(uchar pos)
{                          
  writecom(pos | 0x80) ;  //数据指针=80+地址变量
}
/****写指令*****/
  void writecom(uchar com)
{
  while(lcd_busy()) ;
rs=0;
rw=0;
E=0;
P0=com;
delay(5);
E=1;
delay(5);
E=0;
}
/*****写数据*****/
void writedate(uchar da)
{
rs=1;
rw=0;
E=0;
P0=da;
delay(5);
E=1;
delay(5);
E=0;
}
void init()
{
E=0;
writecom(0x38);
writecom(0x0e);
writecom(0x06);
writecom(0x01);
writecom(0x80);
}
/******温度显示********/
void display()
{
   uchar TNS,TNG;  
   TNS=TN/10;
   TNG=TN%10;
ss=s/10;   //十位
sg=s%10;   //各位
xs=x/10;   //小数点后第一位
xg=x%10;   //小数点后第二位
init();
lcd_pos(0x06);     
writedate(shu[ss]);
lcd_pos(0x07);
writedate(shu[sg]);

lcd_pos(0x09);
writedate(shu[xs]);
lcd_pos(0x10);
writedate(shu[xg]);
}
void zhunbei()
{
    init();
num=0;
while(wendu[num]!='\0')
  {
    writedate(wendu[num]);
    num++;
  }
}
/********主函数*******/
void main()
{
  
  zhunbei();
  do{
   readtemp();
   display();
    }
while(!flag) ;
}
/***延时程序****/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
  for(y=110;y>0;y--);
}

大神,求助呀,你这是卖萌吗?

http://bbs.elecfans.com/forum.php?mod=attachment&aid=MTc2NDUyfGNlY2Y4YmI3ZDRmOGIyNDdkMTE0YjRhMmIxZTQxY2FhfDE1MDk2NTI4NTU%3D&request=yes&_f=.c
这是一个温度显示加报警的程序

谢谢,马上去看看

能告诉我我这个程序错在哪儿了不?

void display()
{
   uchar TNS,TNG;  
   TNS=TN/10;
   TNG=TN%10;
ss=s/10;   //十位
sg=s%10;   //各位
xs=x/10;   //小数点后第一位
xg=x%10;   //小数点后第二位
init();
lcd_pos(0x06);     
writedate(shu[ss]);
lcd_pos(0x07);
writedate(shu[sg]);
lcd_pos(0x09);
writedate(shu[xs]);
lcd_pos(0x10);
writedate(shu[xg]);
}把里面的init();去掉,因为每次执行display()时,都会初始化lcd,所以lcd上会没有WENDU这些字符,而且数字会不停的闪烁

啊啊啊啊啊!终于可以了!十分感谢!大神!膜拜!

啊啊啊啊啊!终于可以了!十分感谢!大神!膜拜!

啊啊啊啊啊!终于可以了!十分感谢!大神!膜拜!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top