📄 wendu.c
字号:
//温度测试 DS18B20
//精确计算,含一位小数, 液晶显示,用的是独立的液晶板
#include <reg52.h>
#include"intrins.h" //_nop_();延时函数用
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P1^0; //温度控制口
sbit RS=P2^3;
sbit E=P2^5;
sbit RW=P2^4;
uchar add;
uchar data dis[10]=
{'T',':',0x00,0x00,0x00,0x00,'.',0x00,0xeb,'C'}; //存计算结果
uchar code ditab[16]=
{0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
//小数转换表
//*****************************
//延时11us函数
void delay(uint t)
{
for(;t>0;t--);
}
//****************************
//复位程序
ow_reset(void)
{
bit presence=1;
while(presence)
{
while(presence)
{
DQ=1;
_nop_();
_nop_();
DQ=0;
delay(50); //550US
DQ=1;
delay(6); //66US
presence=DQ; //presence=0继续下一步
}
delay(45); //500US
presence=~DQ;
}
DQ=1;
}
//****************************
//写命令函数,写一个字节
void write_byte(uchar val)
{
uchar i;
for(i=8;i>0;i--)
{
DQ=1;
_nop_();
_nop_();
DQ=0;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_();//5us
DQ=val&0x01; //最低位移出
delay(6); //66us
val=val>>1; //右移1位
}
DQ=1;
delay(1);
}
//*****************************
//读一字节函数
uchar read_byte(void)
{
uchar i;
uchar value=0;
for(i=8;i>0;i--)
{
DQ=1;
_nop_();
_nop_();
value>>=1;
DQ=0;
_nop_(); _nop_(); _nop_(); _nop_(); //4us
DQ=1;
_nop_(); _nop_(); _nop_(); _nop_(); //4us
if(DQ)
{
value|=0x80;
}
delay(6); //66us
}
DQ=1;
return(value);
}
//*************************************
//温度数据处理函数
void chuli(uchar gaowei,uchar diwei)
{
uchar zong;
if(gaowei>127) //要是负值调整
{
gaowei=256-gaowei;
diwei=256-diwei;
dis[2]=0xb0; //显示负号
}
else
{
dis[2]=0x20;
}
dis[7]=diwei&0x0f; //转换成液晶码
dis[7]=ditab[dis[7]]+0x30;
zong=((diwei&0xf0)>>4)|((gaowei&0x0f)<<4);
dis[3]=zong/100+0x30;
dis[5]=zong%100;
dis[4]=dis[5]/10+0x30;
dis[5]=dis[5]%10+0x30;
}
//*************************************
//显示子函数
//####################################################################
/*************延时*************/
delay1(uint z)
{
uint i,j;
for(i=0;i<z;i++)
for(j=0;j<120;j++)
;
}
//*****************************
//写指令子程序
wrcod(uchar i)
{
P0=i;
RS=0;
E=0;
delay1(7);
E=1;
}
//*****************************
//写数据子程序
wrshu(uchar i)
{
P0=i;
RS=1;
E=0;
delay1(2);
E=1;
}
//*****************************
//初始化液晶
chushi()
{
uchar coad;
coad=0x01; //清屏
wrcod(coad);
coad=0x06;
wrcod(coad); //输入方式控制
coad=0x0e;
wrcod(coad); //显示开关控制
coad=0x38;
wrcod(coad); //功能设定:设置16x2显示,5x7显示,8位数据接口
}
//*******************************
//显示程序
xian1()
{
uchar i=0;
while(i<10)
{
wrshu(dis[i]);
i++;
}
}
//########################################################################
//*************************************
//主程序
main()
{
uchar wenh,wenl; //存高低温度值
RW=0;
chushi();
while(1)
{
ow_reset(); //转换
write_byte(0xcc);
write_byte(0x44);
ow_reset();
write_byte(0xcc); //发读命令
write_byte(0xbe);
wenl=read_byte(); //温度低八位
wenh=read_byte(); //温度高八位
chuli(wenh,wenl); //数据处理
add=0x80; //显示
wrcod(add);
xian1();
delay1(200);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -