标题: LCD1602显示255 不知道哪里错了,请帮忙看看单片机程序 [打印本页]

作者: 2248373991    时间: 2022-3-9 15:44
标题: LCD1602显示255 不知道哪里错了,请帮忙看看单片机程序
#include"reg51.h"
sbit RS=P3^0;
sbit RW=P3^1;
sbit E=P3^2;
sbit DQ=P3^3;
unsigned int readtemp=0;
unsigned char str[]={"0123456789"};

// 非精确延时确定
void delay_18B20(unsigned int i)
{
  for(;i>0;i--);
}

// 初始化程序
void Init_DS18B20(void)
{
  unsigned char x=0;
  DQ=1;
  delay_18B20(8);
  DQ=0;
  delay_18B20(80);
  DQ=1;
  delay_18B20(14);
  x=DQ;
  delay_18B20(20);
}



// 读时序
unsigned char ReadOneChar(void)
{
  unsigned char i=0;
  unsigned char dat=0;
  for (i=8;i>0;i--)
  {
    DQ=0;
        dat>>=1;
        DQ=1;
        if(DQ)
        dat|=0x80;
        delay_18B20(4);
        }
        return(dat);
}



// 写时序
void WriteOneChar(unsigned char dat)
{
  unsigned char i=0;
  for(i=8;i>0;i--);
  {
    DQ=0;
        DQ=dat&0x01;
        if(DQ){delay_18B20(1);DQ=1;}
         else{delay_18B20(5);DQ=1;}         
        dat>>=1;
   }
}
        
// 读温度
unsigned char ReadTemperature(void)
{
  unsigned char a=0,b=0;
  unsigned int temp=0;
  Init_DS18B20();
  WriteOneChar(0xCC);
  WriteOneChar(0x44);
  delay_18B20(100);
  Init_DS18B20();
  WriteOneChar(0xCC);
  WriteOneChar(0xBE);
  delay_18B20(100);
  a=ReadOneChar();
  b=ReadOneChar();
  temp=((b*256+a)>>4);
  return(temp);
}

void delay(unsigned int n)
{
  unsigned int i=0,j=0;
  for(i=0;i<n;i++)
  {
    for(j=0;j<120;j++);
  }
}

void writedat(unsigned char dat)
{
  RS=1;
  RW=0;
  E=0;
  P1=dat;
  delay(5);
  E=1;
  E=0;
}

void writecom(unsigned char com)
{
  RS=0;
  RW=0;
  E=0;
  P1=com;
  delay(5);
  E=1;
  E=0;
}

void initlcd()
{
  writecom(0x38);
  writecom(0x0c);
  writecom(0x06);
  writecom(0x01);
}

void display()
{
  unsigned char temp0=0,temp1=0,temp2=0;
  temp0=readtemp/100;
  temp1=(readtemp%100)/10;
  temp2=readtemp%10;

  writecom(0x80);
  delay(5);
  writedat(str[temp0]);
  delay(5);
  writedat(str[temp1]);
  delay(5);
  writedat(str[temp2]);
  delay(5);
}

void main()
{
  initlcd();
  while(1)
  {
    readtemp=ReadTemperature();
        display();         
  }
}


作者: glinfei    时间: 2022-3-9 17:22
temp=((b*256+a)>>4); debug一下temp的数字对不对,我觉得你又没有用强制类转换,不如分步写。
作者: lkc8210    时间: 2022-3-9 22:20
之前花了一段时间研究过DS18B20
总出以下几个重点

0. 开机拉高总线
1. 初始化
先拉低最少480us再拉高释放总线
等侯DS18B20在15~60us内拉低示意初始化成功
离开前拉高总线

2. 写数据
拉低1us然后写入数据并维持60~120us
重覆8次先低后高
离开前拉高总线


3. 读数据
拉低1us再拉高释放总线然后读取数据并等侯60~120us
如果DS18B20输出1,总线可被立刻拉高
如果DS18B20输出0,总线会维持低电平22~23us
重覆8次先低后高
离开前拉高总线
作者: lkc8210    时间: 2022-3-10 16:57
void Init_DS18B20(void)内
delay_18B20(80);太久了改delay_18B20(48);

// 读时序
unsigned char ReadOneChar(void)
{
  unsigned char i=0;
  unsigned char dat=0;
  for (i=8;i>0;i--)
  {
    DQ=0;
        dat>>=1;
        DQ=1;
        if(DQ)
        dat|=0x80;
        delay_18B20(4);
        DQ=1;//<<<<<<<<<<<<<<<<<<<每次都要拉高
        }
        return(dat);
}

// 写时序
void WriteOneChar(unsigned char dat)
{
  unsigned char i=0;
  for(i=8;i>0;i--);//<<<<<<<<<<<<<<<<<<<<<<多了个分号
  {
    DQ=0;
        DQ=dat&0x01;
        if(DQ){delay_18B20(1);DQ=1;}
         else{delay_18B20(5);DQ=1;}         
        dat>>=1;
   }
}

void main()
{
  initlcd();
  while(1)
  {
    readtemp=ReadTemperature();
        display();
        delay(900);//<<<<<<<<<<<<<<<<<<<<<<<DS18B20不能连续读取,需暂停970ms
  }
}
作者: man1234567    时间: 2022-3-10 17:00
对于不同的单片机来说速度是不一样的。
抄的程序一般没问题,时序也没问题,时长可能都需要按实调整。
作者: 2248373991    时间: 2022-3-10 17:21
lkc8210 发表于 2022-3-10 16:57
void Init_DS18B20(void)内
delay_18B20(80);太久了改delay_18B20(48);

谢谢,改好了,程序可以运行了
作者: 53heihsiao    时间: 2022-3-10 17:46
原来如此,学习了,谢谢




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1