标题:
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