微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > ds18b20程序,为什么在液晶上显示不出来?

ds18b20程序,为什么在液晶上显示不出来?

时间:10-02 整理:3721RD 点击:
下面是我写的温度检测程序,液晶模块没问题的,可以显示字符出来,温度这块就是空白,大伙帮我瞧瞧哪里出问题了?
//DS18B02模块
#include<reg51.h>
#include<intrins.h>
typedef unsigned char uchar;
typedef unsigned int  uint;
sbit dq=P2^6;//温度DS18B02控制引脚
#define nops; {_nop_(); _nop_(); _nop_(); _nop_();}//4US空指令
/**********************
液晶引脚申明
**********************/
sbit rs=P2^0;
sbit rw=P2^1;
sbit en=P2^2;
sbit busy=P0^7;
//================================================US延时
void delayus(uint z)
{
uint i;
for(i=0;i<z;i++)
{_nop_();}
}
//==========================================MS延时
void delayms(uint z)
{
uint i,j;
for(i=0;i<z;i++)
for(j=0;j<120;j++);
}
/************************
等待繁忙函数wait();=================液晶模块开始
***************************/
void wait()
{
P0=0XFF;
do
{
  en=0;
  rs=0;
  rw=1;
  en=1;
}
while(busy==1);
en=0;
}
/************************
写命令函数writelcd_com(uchar com)
***************************/
void writelcd_com(uchar com)
{
wait();
en=0;
P0=com;
rs=0;
rw=0;
en=1;
_nop_();
en=0;
}
/************************
写数据函数writelcd_dat(uchar dat)
***************************/
void writelcd_dat(uchar dat)
{
wait();
en=0;
P0=dat;
rs=1;
rw=0;
en=1;
_nop_();
en=0;
}
/************************
LCD1206初始函数lcd_init()
***************************/
void lcd_init()
{
writelcd_com(0x38);//显示模式设置
writelcd_com(0x08);//显示关闭
writelcd_com(0x01);//显示清屏
writelcd_com(0x02);//指针清零
writelcd_com(0x06);//显示光标移动设置
writelcd_com(0x0C);//显示开启
}
//=====================================================液晶模块结束
//================================DS18B20复位函数
void reset_ds18b20()
{
bit fig=1;
while(fig)
{
  while(fig)
  {
   dq=1;
   dq=0;
   delayus(550);
   dq=1;
   delayus(70);
   fig=dq;
  }
  delayus(300);
  fig=~dq;
}
}
//=========================================18b20写字节
void wds18b20_byte(uchar byte)
{
uchar i;
for(i=0;i<8;i++)
{
  dq=1;
  dq=0;
  nops;//4us
  dq=byte&0x01;
  delayus(70);
  dq=1;
  byte>>=1;
}
}
//==========================================18b20读字节
uchar rds18b20_byte(void)
{
uchar i,dat=0;
for(i=0;i<8;i++)
{
  dq=1;
  dat>>=1;
  dq=0;
  nops;
  dq=1;
  nops;
  if(dq==1)dat|=0x80;
  delayus(70);
}
dq=1;
return dat;
}
//===================================启动DS18B20温度转换
void start_ds18b20()
{
reset_ds18b20();
wds18b20_byte(0xcc);//发SKIP ROM命令
wds18b20_byte(0x44);//转换命令
}
//=============================================读取温度
int read_temp()
{
uchar temp_dat[2];//温度暂放数组
int temp;
reset_ds18b20();
wds18b20_byte(0xcc);//发SKIP ROM命令
wds18b20_byte(0xbe);//转读命令
temp_dat[0]=rds18b20_byte();//读低位
temp_dat[1]=rds18b20_byte();//读高位
temp=temp_dat[1];
temp<<=8;//移到高8位
temp|=temp_dat[0];
temp>>=4;//移掉4位小数位
return temp;
}
//===================================数据转换到液晶转换
void ds18b20_lcd()
{
char ans;
start_ds18b20();
delayms(500); // 延时500毫秒
ans=read_temp();//读温度并强制类型转换

if (ans < 0)
{
  writelcd_dat('-');
  ans = ~ans+1;
}
writelcd_dat(ans/100+'0');
writelcd_dat(ans/10%10+'0');
writelcd_dat(ans%10+'0');
}
//=================================主函数
main()
{
lcd_init();
while(1)
{
  writelcd_com(0x80);//起始位置
  writelcd_dat('T');
  writelcd_dat('E');
  writelcd_dat('M');
  writelcd_dat('P');
  writelcd_dat(':');
  ds18b20_lcd();
}
}

writelcd_dat(ans/100+'0');
writelcd_dat(ans/10%10+'0');
writelcd_dat(ans%10+'0');
上面的那个加法有问题,数字加ASC码,什么意思?

就是想把该数值转化为对应的ASII码啊

是显示问题还是模块的问题,,,如果协议那块出问题查模块,显示这块出问题查显示,,,你这样一个程序写到底,查起来太累了。而且每个人有每个人写程序的写法,大家都不愿意看别人写的很长的程序,,,建议你分模块写,至于楼上说的,你可以查表转换成显示码。LCD_TAB[]={'0','1','2','3','4','5','6','7','8','9'};

我认为可能就是这两块有问题
//=============================================读取温度
int read_temp()
{
uchar temp_dat[2];//温度暂放数组
int temp;
reset_ds18b20();//复位
wds18b20_byte(0xcc);//发SKIP ROM命令
wds18b20_byte(0xbe);//转读命令
temp_dat[0]=rds18b20_byte();//读低位
temp_dat[1]=rds18b20_byte();//读高位
temp=temp_dat[1];
temp<<=8;//移到高8位
temp|=temp_dat[0];
temp>>=4;//移掉4位小数位
return temp;
}
//===================================数据转换到液晶转换
void ds18b20_lcd()
{
char ans;
start_ds18b20();//启动温度转换
delayms(500); // 延时500毫秒
ans=read_temp();//读温度并强制类型转换
if (ans < 0)
{
  writelcd_dat('-');//写液晶数据
  ans = ~ans+1;
}
writelcd_dat(ans/100+'0');//写液晶数据
writelcd_dat(ans/10%10+'0');
writelcd_dat(ans%10+'0');
}
PCB打样找华强 http://www.hqpcb.com 样板2天出货

writelcd_dat(ans/100+'0');//写液晶数据
writelcd_dat(ans/10%10+'0');
writelcd_dat(ans%10+'0');
应该把‘0’换成 0X30

谢谢

小编问题解决了么  我也遇到和你一样的问题了。

lcd真的是各种问题啊

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

网站地图

Top