之前做了一个数码管显示的,想放液晶上看看,结果就悲剧了。
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);
}
}
- #include<reg52.h>
- #include<intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit DQ=P3^5; //连接DS18B20
- sbit en=P2^0; //连接1602 E脚
- sbit rs=P2^2; //连接1602 RS脚
- sbit rw=P2^1; //连接1602 的R/W脚,可选择是否编译
- uchar code table[]="TEMP IS";
- uchar tplsb,tpmsb; // 温度值低位、高位字节
- uint temp;
- void delay(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- /*******************产生复位脉冲初始化DS18B20**************/
- void reset(void)
- {
- uint i;
- DQ=0;
- i=100;
- while(i--);
- DQ=1;// 产生上升沿
- i=4;
- while(i--);
- }
- /********************* 等待应答脉冲*********************/
- void wait(void)
- {
- uint i;
- while(DQ);
- while(~DQ); // 检测到应答脉冲
- i=4;
- while(i--);
- }
- bit readbit(void)
- {
- uint i;
- bit b;
- DQ=0;
- i++;
- DQ=1;
- i++;i++;// 延时15us以上,读时隙下降沿后15us,DS18B20输出数据才有效
- b=DQ;
- i=10;
- while(i--);
- return (b);
- }
- /******************* 读取数据的一个字节**************************/
- uchar readbyte(void)
- {
- uchar i,j,b;
- b=0;
- for(i=0;i<8;i++)
- {
- j=readbit();
- b=(j<<7)|(b>>1);
- }
- return(b);
- }
- /******************写数据的一个字节,满足写1和写0的时隙要求************/
- void writebyte(uchar b)
- {
- uint i;
- uchar j;
- bit btmp;
- for(j=0;j<8;j++)
- {
- btmp=b&0x01;
- b=b>>1; // 取下一位(由低位向高位)
- if(btmp)
- {
- DQ=0;
- i++;i++;
- DQ=1;
- i=10;
- while(i--);// 整个写1时隙不低于60us
- }
- else
- {
- DQ=0;
- i=10;
- while(i--); // 保持低在60us到120us之间
- DQ=1;
- i++;i++;
- }
- }
- }
- /************************* 启动温度转换********************/
- void convert(void)
- {
- reset();// 产生复位脉冲,初始化DS18B20
- wait();//等待DS18B20给出应答脉冲
- writebyte(0xcc);// skip rom 命令
- writebyte(0x44);// convert T 命令
- }
- /********************* 读取温度值****************************/
- uint readtemp(void)
- {
- float tt;
- reset();
- wait();
- delay(1);
- writebyte(0xcc);// skip rom 命令
- writebyte(0xbe);// read scratchpad 命令
- tplsb=readbyte();// 温度值低位字节(其中低4位为二进制的"小数"部分)
- tpmsb=readbyte();// 高位值高位字节(其中高5位为符号位)
- temp=tpmsb;
- temp<<=8;
- temp=temp|tplsb;
- tt=temp*0.0625;
- temp=tt*10+0.5;
- return (temp);
- }
- unsigned char ChangeDat(unsigned char dat)
- {
- unsigned char a;
- a |= ((dat&0x01)<<7)|
- ((dat&0x02)<<5)|
- ((dat&0x04)<<3)|
- ((dat&0x08)<<1)|
- ((dat&0x10)>>1)|
- ((dat&0x20)>>3)|
- ((dat&0x40)>>5)|
- ((dat&0x80)>>7);
- return a;
- }
- void write1602_com(uint com)
- {
- uchar com_change;
- com_change=ChangeDat(com);
- rs=0;
- rw=0;
- P1=com_change;
- delay(5);
- en=1;
- delay(5);
- en=0;
- }
- void write1602_date(uchar date)
- {
- uchar dat_change;
- dat_change=ChangeDat(date);
- rs=1;
- rw=0;
- P1=dat_change;
- delay(5);
- en=1;
- delay(5);
- en=0;
- }
- void init1602(void) //1602初始化
- {
- write1602_com(0x38);
- delay(50);
- write1602_com(0x38);
- delay(5);
- write1602_com(0x38);
- delay(5);
- write1602_com(0x38);
- write1602_com(0x0c);
- write1602_com(0x06);
- write1602_com(0x01);
- }
- void display(uint temp)
- {
- uchar a1,a2,a3,a4;
- a1=temp/100;
- a2=temp%100;
- a3=a2/10;
- a4=a2%10;
- write1602_com(0x80+0x09);//第一行第9个位置显示温度的十位、个位和小数点后一位
- write1602_date(a1+0x30);
- delay(1);
- write1602_date(a3+0x30);
- delay(1);
- write1602_date(a4+0x30);
- delay(1);
- }
- void display1()
- {
- uchar num;
- write1602_com(0x80); //在第一行开头显示“TEMP IS”
- for(num=0;num<7;num++)
- {
- write1602_date(table[num]);
- delay(5);
- }
- }
- void main()
- {
- uchar x;
- init1602();
- convert();
- delay(1000);// 启动温度转换,需要750ms
- readtemp(); // 读取温度
- while(1)
- {
- display1();
- convert();
- x=readtemp();
- display(x);
- }
- }
复制代码一周热门 更多>