📄 main.c
字号:
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
/////////////////////////////
//1602液晶线定义
//////////////////////////////
#define E INT0 //液晶控制线定义
#define RS RXD
#define RW TXD //液晶控制线定义
sbit D0=P2^7; //传感器数据线定义
bit status;
code uchar ANSC[]={'0','1','2','3','4','5','6','7','8','9'};
code uchar error[]="NO DEVICE!";
code uchar table[]="The temper is:";
uchar Temper[2];
void delay1(uchar del)
{
uchar i;
for(i=0;i<del;i++);
}
void delay2(unsigned int i)
{
while(--i);
}
void delay(uchar del)
{
uchar i,j;
for(i=del;i>0;i--)
for(j=0;j<110;j++);
}
//*******************************************************
void Write_Com(uchar com)
{
RS=0;
P0=com;
delay(1);
E=1;
delay(1);
E=0;
}
void Write_Data(uchar date)
{
RS=1;
P0=date;
delay(1);
E=1;
delay(2);
E=0;
}
//*******************************************************
//*******************一线总线的写操作********************
void write_command(uchar com1) //一线总线写命令
{
unsigned char i=0;
for (i=8; i>0; i--)
{
D0 = 0;
_nop_();_nop_();
D0=1;
D0 = com1&0x01;
delay2(5);
D0 = 1;
com1>>=1;
}
}
//********************************************************
unsigned char read_data()
{
unsigned char i=0;
unsigned char temp=0;
for (i=8;i>0;i--)
{
D0 = 0;
_nop_();_nop_();
temp>>=1;
D0 = 1;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
if(D0) temp|=0x80;
delay2(4);
}
_nop_();_nop_();_nop_();
return(temp);
}
void reset()
{
uchar i;
D0=1;
D0=0;
for(i=0;i<60;i++)
_nop_();
for(i=0;i<61;i++)
_nop_();
D0=1;
delay1(9);
status=D0;
D0=1;
for(i=0;i<60;i++)
_nop_();
for(i=0;i<61;i++)
_nop_();
}
void init1()
{
uchar i;
reset(); //传感器初始化和错误处理
while(status)
{
reset();
if(status)
{
reset();
if(status)
{
i=0;
Write_Com(0x01);
delay(5);
Write_Com(0x80);
while(error[i]!='\0')
{
Write_Data(error[i]);
i++;
}
while(1);
}
}
break; //传感器初始化和错误处理
}
}
void Init()
{
D0=1;
E=0; //液晶初始化
RW=0;
Write_Com(0x38);
Write_Com(0x0c);
Write_Com(0x06);
Write_Com(0x01);
delay(5); //液晶初始化
}
//*******************************************************
void main()
{
uchar MSB,LSB,shiwei,gewei,xiaoshu0,xiaoshu1,xiaoshu2,xiaoshu3;
unsigned char i;
Init();
Write_Com(0x80);
i=0;
while(table[i]!='\0')
{
Write_Data(table[i]);
i++;
delay(1);
}
loop:init1();
write_command(0xcc); //跳过ROM匹配
write_command(0x44); //启动温度转换
delay(255);
delay(255);
init1(); //复位传感器
write_command(0xcc); //跳过ROM匹配
write_command(0xbe); //读取温度指令
LSB=read_data(); //温度的小数位
MSB=(read_data()<<4)|(LSB>>4);//温度的整数位
shiwei=MSB/10;
gewei=MSB%10;
xiaoshu0=(LSB&0x0f)*625/1000;
xiaoshu1=(((LSB&0x0f)*625)%1000)/100;
xiaoshu2=(((LSB&0x0f)*625)%100)/10;
xiaoshu3=((LSB&0x0f)*625)%10;
Temper[0]=ANSC[shiwei];
Temper[1]=ANSC[gewei];
Temper[2]='.';
Temper[3]=ANSC[xiaoshu0];
Temper[4]=ANSC[xiaoshu1];
Temper[5]=ANSC[xiaoshu2];
Temper[6]=ANSC[xiaoshu3];
Temper[7]=0xdf;
Temper[8]='C';
Write_Com(0x80+0x45);
Write_Data(Temper[0]);
Write_Data(Temper[1]);
Write_Data(Temper[2]);
Write_Data(Temper[3]);
Write_Data(Temper[4]);
Write_Data(Temper[5]);
Write_Data(Temper[6]);
Write_Data(Temper[7]);
Write_Data(Temper[8]);
goto loop;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -