27,375
社区成员
发帖
与我相关
我的任务
分享
#include<reg51.h>
#include<intrins.h>
#include<delay.h>
typedef unsigned char uchar;
typedef unsigned int uint;
typedef unsigned long uint16;
sbit LCD_RS=P1^0;
sbit LCD_RW=P1^1;
sbit LCD_EN=P2^5;
sbit LED_DU=P2^6;
sbit LED_WE=P2^7;
sbit DQ=P2^2; //温度传感器数据口
uchar tab1[14]=" APP!";
//uchar tab1[11]="Today Temp:";
uchar tab2[10]="2013.04.04";
uchar tab[10]={'0','1','2','3','4','5','6','7','8','9'};
uchar spot='.';
uint16 Temp();
//*******18B32函数********//
void delay5us() //主函数调用delay5us(),先执行LCALL指令2us,执行_nop_()用时1us,最后执行RET用时2us,较准确
{
_nop_();
}
void delayus(uint i) //延时i*5us,误差较大
{
uint j;
for(j=i;j>0;j--)
delay5us();
}
void Reset() //复位,480~960 us的低电平,再持续15~60us 高电平,进入主机发送存在信号
{
bit flag=1;
while(flag){
while(flag){
DQ=1; //释放总线
_nop_();
DQ=0; //拉至低电平
delayus(100); //延时在480~960us内
DQ=1; //释放总线,进入接受状态
delay(3); //延时在15~60us内
flag=DQ; //接受主机发送的存在信号,低电平复位成功
}
delayus(95); //延时480,复位成功释放总线,否则失败
flag=~DQ; //?????复位成功返回低电平,取反为高电平,怎么退出循环?????
}
DQ=1;
}
uint Read_Byte() //读取数据
{
uint val=0;
uchar i;
for(i=0;i<8;i++){
DQ=1; //初始化高电平
_nop_();
DQ=0;
_nop_(); //延时4us ,产生读时间隙
_nop_();
_nop_();
_nop_();
DQ=1;
if(DQ){
val>>=1;
val|=0x80; //高位到低位
}
delayus(12); //延时大于60us
}
DQ=1;
return val;
}
void Write_Byte(uchar dat) //写入8位数据
{
uchar i;
for(i=0;i<8;i++){
DQ=1;
_nop_();
DQ=0; //产生写时间隙
_nop_(); //延时4us
_nop_();
_nop_();
_nop_();
DQ=dat&0x01;
delay(12); //延时大于60us,进行下一位写入
dat>>=1;
}
DQ=1;
_nop_(); //连续两次间隔大于1us
_nop_();
}
uint16 Temp()
{
uint16 temperature;
uint tem[2];
/************************************************
启动温度转换的三个步骤:
一,复位;
二,发出Skip ROM(CCH)写操作;
三,发出Convert T(44H)写操作;
四,发出(BEH)读操作;
************************************************/
Reset(); //复位
Write_Byte(0xCC);
Write_Byte(0x44);
Write_Byte(0xBE);
tem[0]=Read_Byte(); //低八位
tem[1]=Read_Byte(); //高八位
temperature=tem[1];
temperature<<=8;
temperature|=tem[0];
//temperature>>=4; //???????????
return temperature; //返回无转换温度
}
//******LCD函数***********//
void LCD_Write_Com(uchar com)
{
P0=com;
LCD_RS=0;
LCD_RW=0;
LCD_EN=0; //此处后面写数据??
delay(1);
LCD_EN=1;
delay(1);
LCD_EN=0;
}
void LCD_Write_Data(uchar _data)
{
P0=_data;
LCD_RS=1;
LCD_RW=0;
LCD_EN=0;
delay(1);
LCD_EN=1;
delay(1);
LCD_EN=0;
}
void Init()
{
LED_DU=0;
LED_WE=0;
LCD_Write_Com(0x38);
delay(2);
LCD_Write_Com(0x0f);
delay(2);
}
//********主函数*********//
void main()
{
uchar i,a[4];
uint16 Tem;
/*********温度计算*************/
Tem=temp(); //???
Tem=Tem*0.0625;
a[3]=Tem/100; //百位
a[2]=Tem%100/10; //十位
a[1]=Tem%10; //个位
a[0]=0; //未定义
/*******显示***********/
Init();
LCD_Write_Com(0x80);
for(i=0;i<14;i++)
LCD_Write_Data(tab1[i]);
LCD_Write_Com(0xc0);
for(i=3;i>=0;i--)
LCD_Write_Data(tab[a[i]]);
while(1);
}