单片机是AT89c52,液晶12864,DS18b20;液晶只显示255,我写的程序应该是把温度的整数部分显示在液晶屏上;各位高手请帮忙一下,谢谢!
#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char code a[]={"0123456789"};
sbit RS=P2^0;
sbit RW=P2^1;
sbit E=P2^2;
sbit PSB=P2^3;
sbit RST=P2^5;
sbit DS18b20_data=P3^2;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void delay_10us()
{
_nop_();
_nop_();
_nop_();
}
void delay_15us(uint m)
{
uint x;
for(x=m;x>0;x--);
}
bit rstDS18b20(void)// DS18B20复位程序, 返回0-有设备连接,1-无设备连接
{
uchar i;
bit rstFlag;
rstFlag =1;
DS18b20_data=1;
_nop_();
DS18b20_data=0;//发送复位脉冲
delay_15us(40);//等待600us
DS18b20_data=1;
delay_15us(2);//15-60us
for(i=0;i<6;i++)//60-240us
{
delay_15us(1);
if( DS18b20_data==0)
rstFlag=0;
}
delay_15us(15);//240us
return rstFlag;
}
void writeDS18b20(uchar ch)//写一个字节的命令
{
uchar i;
DS18b20_data=1;//拉高数据总线,准备写数据延时1us
_nop_();
for(i=0;i<8;i++)
{
DS18b20_data=0;
delay_10us();
DS18b20_data=ch&0x01;//发送最低位,1或0
delay_15us(2);//保持写入数据时间60-120us,实际可以是30us
ch=ch>>1;//先写低位,后写高位
_nop_();
}
}
uchar readDS18b20(void )//读一个字节的命令
{
uchar i,rd;
rd=0;
DS18b20_data=1;//拉高总线,准备启动,延时1us
_nop_();
for(i=0;i<8;i++)
{
DS18b20_data=0;
delay_10us();
DS18b20_data=1;//拉高总线,准备收数据
_nop_();
rd=rd>>1;
if( DS18b20_data==1)//接受 DS18b20的数据,若是0就翻到上面rd右移1位
rd=rd+0x80;
delay_15us(2);//延时45us保证读数据要60us
}
return rd;
}
uchar gettemp(void)
{
uchar i=0,j=0;
uchar T=0;
// float tt;
if(!rstDS18b20())//如果探头连接正常
{
rstDS18b20();
writeDS18b20(0xcc);//跳过rom指令
writeDS18b20(0x44);//启动温度转换指令
if(!rstDS18b20())
{
rstDS18b20();
writeDS18b20(0xcc);
writeDS18b20(0xbe);
i=readDS18b20();//温度低位
j=readDS18b20();//温度高位
T=j*16+i/16;
//TD=(TL%16)*10/16;
return(T);
}
/*else
{
return 0xffff;
}*/
}
/* else
{
return 0xffff;
}*/
}
void write_com(uchar com)//给液晶写指令
{
RS=0;
delay(5);
RW=0;
delay(5);
E=1;
P0=com;
delay(5);
E=0;
}
void write_data(uchar date)//写数据
{
RS=1;
delay(5);
RW=0;
delay(5);
E=1;
P0=date;
delay(5);
E=0;
}
void init() //初始化设置
{
RST=0;//reset单片机
delay(40);
RST=1;
E=0;
write_com(0x30);//8位或4位选择
write_com(0x01);//显示清零
write_com(0x02);//地址归位
write_com(0x0c);//光标显示或不显示设置
//write_com(0x14);
}
void main()
{
uchar g,h,k,TH;
//uint TH;
init();
while(1)
{
TH=gettemp();
//t1=gettemp();
//t1=x*16/10;
g=TH/100;
h=(TH%100)/10;
k=TH%10;
write_com(0x91);
write_data(a[g]);
write_com(0x92);
write_data(a[h]);
write_com(0x93);
write_data(a[k]);
}
//while(1);
} |