📄 temp_controlnew.c
字号:
#include "reg52.h"
#include "absacc.h"
#define display_single XBYTE[0x0000]
#define display_point XBYTE[0x0100]
#include <absacc.h>
#include <stdio.h>
#include <math.h>
#define uchar unsigned char
sbit dq=P1^3;
uchar code single[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar code single_point[9]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff};
uchar point,indiv,ten,hun;
sbit key_1=P1^0;
sbit key_2=P1^2;
uchar temp1,temp2,ready=0,flag=1;
uchar temp1,temp2;
void display(void);
void delay(unsigned int count)
{
unsigned int i;
while(count)
{
i=20;
while(i>0)
{
display();
i--;
}
count--;
}
}
void _nop()
{;
}
/***********************************************************\
|数码显示程序 |
| |
\***********************************************************/
void display(void)
{
display_single=single[point];
display_point=single_point[0];
_nop();
_nop();
display_point=0xff;
display_single=(single[indiv]&0x7f);
display_point=single_point[1];
_nop();
_nop();
display_point=0xff;
display_single=single[ten];
display_point=single_point[2];
_nop();
_nop();
display_point=0xff;
display_single=single[hun];
display_point=single_point[3];
_nop();
_nop();
display_point=0xff;
}
/*******************************************************\
| 函数名 Reset_18B20 |
| 函数功能 复位18B20芯片 |
| 参数 无 |
| 返回值 无 |
\*******************************************************/
bit Reset_18B20()
{
bit answer;
unsigned char i;
int j;
//置总线为低电平并保持至少480us
dq = 0;
for(i=0; i<7;i++) //780us
{
display();
}
//等电阻拉高总线并保持15-60us
dq=1;
for(i=0; i<9; i++) //65us
{
_nop();
}
//接受应答信号
answer=dq;
//延时60-240us
for(i=0; i<2;i++) //240us
{
display();
for(j=0;j<1;j++);
}
return(answer);
}
/*******************************************************\
| 函数名 read_byte_18B20 |
| 函数功能 从18B20中读出一位数据 |
| 参数 无 |
| 返回值 读出的数据 |
\*******************************************************/
bit read_bit_18B20(void)
{
bit bitval;
unsigned char i;
dq=0;
_nop();
dq=1;
_nop();
_nop();
bitval = dq;
for(i=0; i<8; i++)
{
_nop();
}
return(bitval);
}
/*******************************************************\
| 函数名 write_bit_18B20 |
| 函数功能 向18B20中写入一位数据 |
| 参数 bitval : 待写入的数据 |
| 返回值 无 |
\*******************************************************/
void write_bit_18B20(unsigned char bitval)
{
unsigned char i;
dq=0;
for(i=0; i<1; i++)
{
_nop();
_nop();
}
if (bitval==1)
{
dq=1;
}
for(i=0; i<8; i++)
{
_nop();
}
dq=1;
}
/*******************************************************\
| 函数名 read_byte_18B20 |
| 函数功能 从18B20中读出一个字节的数据 |
| 参数 无 |
| 返回值 读出的数据 |
\*******************************************************/
unsigned char read_byte_18B20(void)
{
unsigned char i;
unsigned char j;
unsigned char value = 0;
for (i=0;i<8;i++)
{
j = read_bit_18B20();
if (j) //如果是 1 置1,否则置 0
{
value|= (0x01<<i); //先读低位,再读高位
}
_nop();
}
return(value);
}
/*******************************************************\
| 函数名 write_byte_18B20 |
| 函数功能 向18B20中写入一个字节的数据 |
| 参数 val : 待写入的数据 |
| 返回值 无 |
\*******************************************************/
void write_byte_18B20(unsigned char val)
{
unsigned char i;
unsigned char temp;
for (i=0; i<8; i++)
{
temp = val>>i;
temp&= 0x01;
write_bit_18B20(temp);
}
_nop();
}
/*******************************************************\
| 函数名 GetTemperat |
| 函数功能 利用18B20芯片检测温度,并在LED上显示 |
| 参数 无 |
| 返回值 温度 |
\*******************************************************/
void GetTemperat()
{
while(Reset_18B20()); //复位等待从机应答
write_byte_18B20(0xCC); //忽略ROM匹配
write_byte_18B20(0x44); //发送温度转化命令
delay(300); //延时
while(Reset_18B20()); //再次复位,等待从机应答
write_byte_18B20(0xCC); //忽略ROM匹配
write_byte_18B20(0xBE); //发送读温度命令
temp1= read_byte_18B20(); //读出温度低8位
temp2= read_byte_18B20(); //读出温度高8位
dq=1; //释放总线
ready=1;
}
void reachmassege()interrupt 4 using 1
{
uchar a;
while(RI!=1);RI=0;
ES=0;
if(flag)
{
a=SBUF;
if(a!=0x02){key_1=~key_1;goto reti;}
else {
flag=0;
SM2=0;
SBUF=0x02;
while(TI!=1);TI=0;
while(RI!=1);RI=0;}
}
if(SBUF==0xff){key_2=~key_2;SM2=1;ES=1;flag=1;goto reti;}
a=SBUF;
//key_2=~key_2;
if(a==0x00)
{
if(ready==0x01)SBUF=0x01;
else SBUF=0x00;
while(TI!=1);TI=0;
while(RI!=1);RI=0;
if(SBUF==0xff){SM2=1;ES=1;flag=1;goto reti;}
else if(SBUF==0x01)
{SBUF=temp1;
while(TI!=1);TI=0;
SBUF=temp2;
while(TI!=1);TI=0;}
else if(SBUF==0x02)
{SBUF=point;
while(TI!=1);TI=0;
SBUF=indiv;
while(TI!=1);TI=0;
SBUF=ten;
while(TI!=1);TI=0;
SBUF=hun;
while(TI!=1);TI=0;
}
}
flag=0;
reti:
ES=1;
}
/***************************************\
|温度值转换 |
\***************************************/
void tmpchangebcd(void)
{float a;
uchar c,d,f,e;
c=temp2&0xf8;
if(c)
{temp1=~temp1+1; //////
temp2=~temp2;}//////////////////////
d=temp1&0x0f;
f=temp1>>4;
e=temp2&0x07;
e<<=4;
f|=e;
a=d*0.0625;
point=(uchar)(a*10);
indiv=f%10;
ten=f%100/10;
hun=f/100;
}
void main()
{
flag=1;
TMOD=0x20;
TL1=0xfa;
TH1=0xfa;
PCON=0x00;
TR1=1;
SCON=0xf0;
ES=1;
EA=1;
key_1=0;
key_2=0;
while(1)
{
GetTemperat();
tmpchangebcd();
//key_1=~key_1;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -