#include<reg51.h>
#include<intrins.h>
#define lcd P0
#define uchar unsigned char
#define uint unsigned int
sbit RS=P2^6;
sbit E=P2^7;
sbit RW=P2^5;
sbit DS_DQ=P3^7;
sbit led=P2^0;
uint xum;
uchar flag;
uchar code table[]="wendu";
uchar code table1[]=" . C";
void delay_long(uint delay) //延迟函数
{
uchar i,j;
for(i=delay;i>0;i--)
for(j=110;j>0;j--);
}
void delay(uchar t) //延时T*us
{
do{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
} while(--t);
}
// DS温度传感器部分
bit init_DS() //初始化DS总线
{
bit ack;
DS_DQ=0;
delay(50);
DS_DQ=1;
delay(6);
ack=DS_DQ;
while(!DS_DQ);
return ack;
}
void DS_writeBY(uchar BY) //写字节函数
{
uchar mak;
for(mak=0x01;mak!=0;mak<<=1)
{
DS_DQ=0;
_nop_();
_nop_();
if((mak&BY)==0)
DS_DQ=0;
else
DS_DQ=1;
delay(6);
DS_DQ=1;
}
}
uchar DS_readBY() //读一个字节
{
uchar k,date;
date=0;
for(k=0x01;k!=0;k<<=1)
{
DS_DQ=0;
_nop_();
_nop_();
DS_DQ=1;
_nop_();
_nop_();
if(!DS_DQ)
date &= ~k;
else
date |= k;
delay(6);
}
return date;
}
void DS_zhuanhuan_com() //温度转换指令
{
bit ack;
ack=init_DS(); //初始化
if(ack==0)
{
DS_writeBY(0xcc);
DS_writeBY(0x44); //开始温度转换 0X44
}
else
flag=1; //温度转换需要时间 具体 参考手册
}
uint read_DS_wendu() //读取温度 因为有正负 所以用int 类型
{
uchar tml=0;
uchar tmh=0;
float xum1;
bit ack;
ack=init_DS();
if(ack==0)
{
DS_writeBY(0xcc);
DS_writeBY(0xbe);
}
else
flag=1;
tml=DS_readBY(); //温度值16位 低位
tmh=DS_readBY(); // 高位
xum=tmh;
xum=(xum<<8)|tml;
P1=tmh;
xum1=xum*0.0625;
xum=xum1*10+0.5;
return xum;
}
// LCD部分
void lcd_write_com(uchar xun)
{
RS=0;
RW=0;
lcd=xun;
delay_long(5);
E=1;
E=0;
}
void lcd_write_date(uchar xun1)
{
RS=1;
RW=0;
lcd=xun1;
delay_long(5);
E=1;
E=0;
}
void init_lcd()
{
uchar i,j;
lcd_write_com(0x38);
lcd_write_com(0x0c);
lcd_write_com(0x06);
lcd_write_com(0x01);
lcd_write_com(0x80);
for(i=0;i<5;i++)
{
lcd_write_date(table[i]);
delay_long(20);
}
lcd_write_com(0xc0);
for(j=0;j<6;j++)
{
lcd_write_date(table1[j]);
delay_long(20);
}
}
void LCD_xianshi(uint num)
{
uchar bai,shi,ge;
bai=num/100;
shi=(num%100)/10;
ge=(num%100)%10;
lcd_write_com(0xc1);
lcd_write_date(0x30+bai);
lcd_write_com(0xc2);
lcd_write_date(0x30+shi);
lcd_write_com(0xc4);
lcd_write_date(0x30+ge);
}
// 主函数部分
void main()
{
uchar c;
init_lcd();
while(1)
{
DS_zhuanhuan_com();
delay_long(800);
for(c=10;c>0;c--)
{
LCD_xianshi(read_DS_wendu);
led=flag;
}
}
}
|