找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1132|回复: 6
收起左侧

LCD1602显示255 不知道哪里错了,请帮忙看看单片机程序

[复制链接]
ID:985137 发表于 2022-3-9 15:44 | 显示全部楼层 |阅读模式
#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();         
  }
}

回复

使用道具 举报

ID:844772 发表于 2022-3-9 17:22 | 显示全部楼层
temp=((b*256+a)>>4); debug一下temp的数字对不对,我觉得你又没有用强制类转换,不如分步写。
回复

使用道具 举报

ID:161164 发表于 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次先低后高
离开前拉高总线

评分

参与人数 1黑币 +40 收起 理由
admin + 40 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:161164 发表于 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
  }
}
回复

使用道具 举报

ID:584814 发表于 2022-3-10 17:00 | 显示全部楼层
对于不同的单片机来说速度是不一样的。
抄的程序一般没问题,时序也没问题,时长可能都需要按实调整。
回复

使用道具 举报

ID:985137 发表于 2022-3-10 17:21 | 显示全部楼层
lkc8210 发表于 2022-3-10 16:57
void Init_DS18B20(void)内
delay_18B20(80);太久了改delay_18B20(48);

谢谢,改好了,程序可以运行了
回复

使用道具 举报

ID:1009534 发表于 2022-3-10 17:46 | 显示全部楼层
原来如此,学习了,谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表