📄 tempture2.c
字号:
#include <reg51.h>
#include <intrins.h>
typedef unsigned char BYTE;
typedef unsigned int WORD;
typedef bit BOOL ;
sbit rs = P2^0; //
sbit rw = P2^1;
sbit ep = P2^2;
BYTE code dis1[] = {"temp"};
unsigned int dis2[7]={0};
sbit TMDAT=P3^3;
WORD sdata=0;
WORD xiaoshu1;
WORD xiaoshu2;
WORD xiaoshu;
bit flag=1; //温度正负标志
BYTE seg7code[]={0,1,2,3,4,5,6,7,8,9};
delay(BYTE ms)
{ // 延时子程序
BYTE i;
while(ms--)
{
for(i = 0; i< 250; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
BOOL lcd_bz()
{ // 测试LCD忙碌状态
BOOL result;
rs = 0;
rw = 1;
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
result = (BOOL)(P0 & 0x80);
ep = 0;
return result;
}
lcd_wcmd(BYTE cmd)
{ // 写入指令数据到LCD
while(lcd_bz());
rs = 0;
rw = 0;
ep = 0;
_nop_();
_nop_();
P0 = cmd;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 0;
}
lcd_pos(BYTE pos)
{ //设定显示位置
lcd_wcmd(pos | 0x80);
}
lcd_wdat(BYTE dat)
{ //写入字符显示数据到LCD
while(lcd_bz());
rs = 1;
rw = 0;
ep = 0;
P0 = dat;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 0;
}
lcd_init()
{ //LCD初始化设定
lcd_wcmd(0x38); //
delay(1);
lcd_wcmd(0x0c); //
delay(1);
lcd_wcmd(0x06); //
delay(1);
lcd_wcmd(0x01); //清除LCD的显示内容
delay(1);
}
/************************************************************
程序名称:复位函数
函数说明:向DS18B20发送484us复位信号
功能:
*************************************************************/
void dmsec(WORD count)
{
int i;
while(count--)
{
for(i=0;i<115;i++)
;
}
}
/************************************************************
程序名称:复位函数
函数说明:向DS18B20发送484us复位信号
功能:
*************************************************************/
void tmreast(void)
{
int i;
TMDAT=0;
for(i=0;i<103;i++);
TMDAT=1;
for(i=0;i<4;i++);
}
/************************************************************
程序名称:读位函数
函数说明:读取DS18B20一位信号
功能:
*************************************************************/
bit tmrbit(void)
{
int i;
bit dat;
TMDAT=0; //给脉冲信号
i++;
TMDAT=1;
i++;i++ ; //微量延时
dat=TMDAT; //给脉冲信号
for(i=0;i<8;i++);
return(dat);
}
/************************************************************
程序名称:读字函数
函数说明:读取DS18B20一字节信号
功能:
*************************************************************/
BYTE tmrbyte(void)
{
BYTE i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmrbit();
dat=(j<<7)|(dat>>1);
}
return(dat);
}
/************************************************************
程序名称:写函数
函数说明:
功能:
*************************************************************/
void tmwbyte(BYTE dat) //写一个字节
{
BYTE i,j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)
{
TMDAT=0; //写0
i++;i++;
TMDAT=1;
for(i=0;i<8;i++);
}
else
{
TMDAT=0;
for(i=0;i<8;i++);
TMDAT=1;
i++;i++;
}
}
}
/************************************************************
程序名称:温度转换函数
函数说明:将读取的DS18B20的数据进行转换
功能:
*************************************************************/
void trstar(void)
{
tmreast();
dmsec(1);
tmwbyte(0xcc); //跳过序列号命令
tmwbyte(0x44); //发送转换命令44H
}
/************************************************************
程序名称:读温度函数
函数说明:读取转换后的温度
功能:
*************************************************************/
void temp(void)
{
BYTE a,b;
tmreast();
dmsec(1);
tmwbyte(0xcc);
tmwbyte(0xbe);
a=tmrbyte(); // 读取温度
b=tmrbyte();
if(b>0x7f)
{
a=~a;b=~b+1; //补码转换,取反加一
flag=0; //温度为负时flag=0
}
sdata=a/16+b*16;
xiaoshu1=(a&0x0f)*10/16;
xiaoshu2=(a&0x0f)*100/16%10;
xiaoshu=xiaoshu1*10+xiaoshu2;
/* sdata=45;
xiaoshu1=3;
xiaoshu2=2;
xiaoshu=xiaoshu1*10+xiaoshu2;
*/
}
void DS18B20R(void)
{
trstar();
dmsec(5); // 不断读取数据
temp(); // 读取数据后将温度存在TMP中
}
/************************************************************
程序名称:显示函数
函数说明:显示读取的数据
功能:
*************************************************************/
void LED(void)
{
if(flag==1)
{
dis2[0]='+';
dis2[1]='2';//sdata/10;
dis2[2]='5';//seg7code[sdata%10];
dis2[3]='.';
dis2[4]='6';//seg7code[xiaoshu1];
dis2[5]='4';
dis2[6]='C';
}
/* if(flag==0)
{
P2=0x7f;
P0=seg7code[11]; //负号
Delay(8);
P0=seg7code[sdata/10];
Delay(8);
P2=0xbf;
P0=seg7code[sdata%10];
Delay(8);
P2=0xdf;
P0=seg7code[xiaoshu1];
Delay(8);
P2=P2|0xf0;
} */
}
void main()
{
BYTE k;
flag=1;
DS18B20R();
LED();
lcd_init(); // 初始化LCD
delay(10);
lcd_pos(4); // 设置显示位置为第一行的第5个字符
k = 0;
while(dis1[k] != '\0')
{ // 显示字符"welcome!"
lcd_wdat(dis1[k]);
k++;
}
lcd_pos(0x41); // 设置显示位置为第二行第二个字符
k = 0;
while(dis2[k] != '\0')
{
lcd_wdat(dis2[k]); // 显示字符" www.xingyan.com.cn "
k++;
}
while(1); //
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -