之前做了一个数码管显示的,想放液晶上看看,结果就悲剧了。
STC89C52+DS18B20+1602难道就坑死我了?
请大家帮忙检查一下那里有错误,为什么显示一直是0000
tica, Arial, sans-serif">#include <REG52.H>
#include <intrins.h>
typedef unsigned char uchar;
typedef unsigned int uint;
uchar a,b,c,d; //定义变量
uchar k;
sbit lcden=P3^4;
sbit lcdrs=P3^5;
sbit dula=P2^6;
sbit wela=P2^7;
sbit DATA=P2^2; //DS18B20接入口
//uchar table2[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};
uint disdata[4]={0,0,0,0};
// 毫秒延时
void delay(uint tt)
{
uchar i;
while(tt--)
for(i=110;i>0;i--);
}
//短延时
//系统初始化
//按键扫描
//温度检测
void Init_DS18B20()
//传感器初始化
{
uchar x=0;
DATA = 1; //DQ复位
delay(10); //稍做延时
DATA = 0; //单片机将DQ拉低
delay(80); //精确延时 大于 480us //450
DATA = 1; //拉高总线
delay(20);
x=DATA; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay(30);
}
//读一个字节
ReadOneChar(void)
{
uchar i=0;
uchar dat = 0;
for (i=8;i>0;i--)
{
DATA = 0; // 给脉冲信号
dat>>=1;
DATA = 1; // 给脉冲信号
if(DATA)
dat|=0x80;
delay(8);
}
return(dat);
}
//写一个字节
void WriteOneChar(unsigned char dat)
{
uchar i=0;
for (i=8; i>0; i--)
{
DATA = 0;
DATA = dat&0x01;
delay(10);
DATA = 1;
dat>>=1;
}
delay(8);
}
//读取温度
int ReadTemperature(void)
{
uchar a=0;
uchar b=0;
int t=0;
float tt=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar();//低位
b=ReadOneChar();//高位
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;
t= tt*10+0.5;
return(t);
}
void init_com(void)
{
TMOD = 0x20;
PCON = 0x00;
SCON = 0x50;
TH1 = 0xFd;
TL1 = 0xFd;
TR1 = 1;
}
void write_com(uchar com)
{
lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar dat)
{
lcdrs=1;
P0=dat;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init()
{
dula=0;
wela=0;
lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
}
void display(int x)
{
disdata[0]=x/1000+0x30;
disdata[1]=x%1000/100+0x30;
disdata[2]=x%100/10+0x30;
disdata[3]=x%10+0x30;
write_com(0x80);
write_data(disdata[0]);
delay(200);
write_data(disdata[1]);
delay(200);
write_data(disdata[2]);
delay(200);
write_data(disdata[3]);
delay(200);
}
/*-------------------------------------------------------------------*/
//主函数
void main()
{
init();
init_com();
while(1)
{
int temp;
temp = ReadTemperature();//读温度
display(temp);
}
}
一周热门 更多>