📄 tempc.c
字号:
#include <reg51.h>
#include <intrins.h>
sbit P3_0=P3^0;
sbit P3_1=P3^1;
sbit P3_2=P3^2;
sbit P3_3= P3^3;
sbit P3_4= P3^4;
sbit P3_5= P3^5;
sbit P3_6= P3^6;
sbit P3_7= P3^7;
#define LEDPort P1 //LED控制口
#define LEDf P3_0 //LEDf
#define LED1 P3_1 //LED1
#define LED2 P3_2 //LED2
#define LED3 P3_3 //LED3
#define LED4 P3_4 //LED4
#define Key_jd P3_5 //上调温度
#define TMPort P3_7 //DS1820 DataPort
unsigned char code LEDDis[]={0x5f,0x06,0x3b,0x2f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0-9的LED笔划,0xFF为空,0xF7为负号
static unsigned char bdata StateREG; //可位寻址的状态寄存器
sbit DS18B20ON = StateREG^0; //DS1820是否存在
sbit SetTF = StateREG^1; //是否是在温度设置状态
static signed char LED_f,LED_1,LED_2,LED_3,LED_4; //LED的显示位 LED_One为十位,LED_Two为个位
static signed char L_1,L_2,L_3,L_4,L_5; //LED的显示位 LED_One为十位,LED_Two为个位
static unsigned char Sign; //负号标识
static unsigned char sign_jd; //精度标识
static unsigned char KeyV,TempKeyV; //键值
static unsigned char bdata TLV _at_ 0x0029; //温度变量高低位
static unsigned char bdata THV _at_ 0x0028;
static signed char TMV; //转换后的温度值
static signed char TM; //转换后的温度值
static signed int wd; //转换后的温度值
static signed int zd; //转换后的温度值
void Delay_10ms(void);
void InitDS1820(void);
void ROMDS1820(void);
void TMVDS1820(void);
void Delay_510(void);
void TMRDS1820(void);
void ReadDS1820(void);
void V2ToV(void);
void Delay_110(void);
void main(void)
{
THV = 0;
TLV = 0;
TMV = 0;
TM=0;
KeyV = 0;
TempKeyV = 0;
zd=50;
InitDS1820(); //初始化
ROMDS1820(); //跳过ROM
TMRDS1820(); //读出温度指令
ReadDS1820(); //读出温度值和上限值
EA = 1; //允许CPU中断
ET0 = 1; //定时器0中断打开
TMOD = 0x1; //设定时器0为模式1,16位模式
TH0=0xB1;
TL0=0xDF; //设定时值为20000us(20ms)
TR0 = 1; //开始定时
while(1);
}
//定时器0中断外理中键扫描和显示
void KeyAndDis_Time0(void) interrupt 1 using 2
{
TH0=0xb1;
TL0=0xDF; //设定时值为20000us(20ms)
Key_jd=1;
LEDPort = 0x00;
zd++;
if (zd>50)
{
if (!Key_jd)
KeyV = 1;
if (KeyV != 0) //有键按下
{
Delay_10ms(); //延时防抖 按下10ms再测
if (!Key_jd)
TempKeyV = 1;
if (KeyV == TempKeyV) //两次值相等为确定接下了键
{
sign_jd=!sign_jd;
zd=0;
}
}
}
KeyV = 0;
TempKeyV = 0; //清空变量准备下次键扫描
if (DS18B20ON)
{
InitDS1820(); //初始化
ROMDS1820(); //跳过ROM
TMVDS1820(); //温度转换指令
Delay_510();
Delay_510(); //延时等待转换完成
InitDS1820(); //初始化
ROMDS1820(); //跳过ROM
TMRDS1820(); //读出温度指令
ReadDS1820(); //读出温度值
V2ToV();
if (LED_f==1)//转换显示值
LEDf=0;
else
LEDf=1;
LEDPort = ~LED_1;
LED1 = 0;
Delay_510();
Delay_510();
LED1 = 1; //显示百位数
LEDPort = ~LED_2;
LED2 = 0;
Delay_510();
Delay_510();
LED2 = 1; //显示百位数
LEDPort = ~LED_3;
LED3 = 0;
Delay_510();
Delay_510();
LED3 = 1; //显示百位数
LEDPort = ~LED_4;
LED4 = 0;
Delay_510();
Delay_510();
LED4 = 1; //显示百位数
}
}
void V2ToV(void) //数值转换
{
TM=TLV<<4;
TLV = TLV >> 4;
THV = THV << 4; //读出的高低位数值移位
TMV = TLV | THV; //合并高低位放入TM为实际温度值
Sign = 0;
Sign = TMV >> 7;
if (Sign)
{
L_1= (~(TMV-1)) / 100; //转换百位值
L_2= ((~(TMV-1)) - L_1 * 100)/10;
L_3 = (~(TMV-1)) - L_1 * 100 - L_2 * 10;
}
else
{
L_1= (TMV) / 100; //转换百位值
L_2= (TMV - L_1 * 100)/10;
L_3 = TMV - L_1 * 100 - L_2 * 10;
}
if (Sign)
{
TM=~(TM-1);
LED_f=1;
}
else
{
LED_f=0;
}
wd=0;
if (TM & 0x80){wd=wd+5000;}
if (TM & 0x40){wd=wd+2500;}
if (TM & 0x20){wd=wd+1250;}
if (TM & 0x10){wd=wd+625;}
L_4=wd/1000;
L_5=(wd-L_4*1000)/100;
if (sign_jd)
{
LED_1=LEDDis[L_2];
LED_2=LEDDis[L_3]|0x80;
LED_3=LEDDis[L_4];
LED_4=LEDDis[L_5];
}
else
{
LED_1=LEDDis[L_1];
LED_2=LEDDis[L_2];
LED_3=LEDDis[L_3]|0x80;
LED_4=LEDDis[L_4];
}
}
void InitDS1820(void) //初始化DS1820
{
TMPort=1; //拉高TMPort
_nop_(); //保持一个周期
TMPort = 0; //拉低TMPort
Delay_510(); //延时 DS1820复位时间要500us的低电平
TMPort = 1; //拉高TMPort
_nop_(); //保持
_nop_();
_nop_();
Delay_110(); //延时110us 等待DS1820回应
if (!TMPort) //回应信号为低电平
DS18B20ON = 1;
else
DS18B20ON = 0;
Delay_110(); //延时
Delay_110();
TMPort = 1; //拉高TMPort
}
void Delay_510(void) //延时510微秒
{
#pragma asm
MOV R0,#7DH
MOV R1,#02H
TSR1:
DJNZ R0,TSR1
MOV R0,#7DH
DJNZ R1,TSR1
#pragma endasm
}
void Delay_110(void) //延时110微秒
{
#pragma asm
MOV R0,#19H
MOV R1,#02H
TSR2:
DJNZ R0,TSR2
MOV R0,#19H
DJNZ R1,TSR2
#pragma endasm
}
void Delay_10ms(void) //延时10ms
{
#pragma asm
MOV R0,#19H
MOV R1,#0C8H
TSR3:
DJNZ R0,TSR3
MOV R0,#19H
DJNZ R1,TSR3
#pragma endasm
}
void Delay_4s(void) //延时4s
{
#pragma asm
MOV R2,#28H
TSR5:
MOV R0,#0FAH
MOV R1,#0C8H
TSR4:
DJNZ R0,TSR4
MOV R0,#0FAH
DJNZ R1,TSR4
DJNZ R2,TSR5
#pragma endasm
}
void ROMDS1820(void) //跳过ROM匹配
{
#pragma asm
MOV A,#0CCH
MOV R2,#8
CLR C
WR1:
CLR P3_7
MOV R3,#6
DJNZ R3,$
RRC A
MOV P3_7,C
MOV R3,#23
DJNZ R3,$
SETB P3_7
NOP
DJNZ R2,WR1
SETB P3_7
#pragma endasm
}
void TMVDS1820(void) //温度转换指令
{
#pragma asm
MOV A,#44H
MOV R2,#8
CLR C
WR2:
CLR P3_7
MOV R3,#6
DJNZ R3,$
RRC A
MOV P3_7,C
MOV R3,#23
DJNZ R3,$
SETB P3_7
NOP
DJNZ R2,WR2
SETB P3_7
#pragma endasm
}
void TMRDS1820(void) //读出温度指令
{
#pragma asm
MOV A,#0BEH
MOV R2,#8
CLR C
WR3:
CLR P3_7
MOV R3,#6
DJNZ R3,$
RRC A
MOV P3_7,C
MOV R3,#23
DJNZ R3,$
SETB P3_7
NOP
DJNZ R2,WR3
SETB P3_7
#pragma endasm
}
void TMWDS1820(void) //写入温度限制指令
{
#pragma asm
MOV A,#04EH
MOV R2,#8
CLR C
WR13:
CLR P3_7
MOV R3,#6
DJNZ R3,$
RRC A
MOV P3_7,C
MOV R3,#23
DJNZ R3,$
SETB P3_7
NOP
DJNZ R2,WR13
SETB P3_7
#pragma endasm
}
void TMREDS1820(void) //COPY RAM to E2PRAM
{
#pragma asm
MOV A,#48H
MOV R2,#8
CLR C
WR33:
CLR P3_7
MOV R3,#6
DJNZ R3,$
RRC A
MOV P3_7,C
MOV R3,#23
DJNZ R3,$
SETB P3_7
NOP
DJNZ R2,WR33
SETB P3_7
#pragma endasm
}
void TMERDS1820(void) //COPY E2PRAM to RAM
{
#pragma asm
MOV A,#0B8H
MOV R2,#8
CLR C
WR43:
CLR P3_7
MOV R3,#6
DJNZ R3,$
RRC A
MOV P3_7,C
MOV R3,#23
DJNZ R3,$
SETB P3_7
NOP
DJNZ R2,WR43
SETB P3_7
#pragma endasm
}
void WriteDS1820(void) //写入温度限制值
{
#pragma asm
MOV A,26H //发出4EH写ROM指令后连发两个字节分别为上下限
MOV R2,#8
CLR C
WR23:
CLR P3_7
MOV R3,#6
DJNZ R3,$
RRC A
MOV P3_7,C
MOV R3,#23
DJNZ R3,$
SETB P3_7
NOP
DJNZ R2,WR23
SETB P3_7
#pragma endasm
}
void ReadDS1820(void) //读出温度值
{
#pragma asm
MOV R4,#2 ; 将温度高位和低位,高温限制位从DS18B20中读出
MOV R1,#29H ; 低位存入29H(TEMPER_L),高位存入28H(TEMPER_H),高温限制位存入27H(TMRomV)
RE00:
MOV R2,#8
RE01:
CLR C
SETB P3_7
NOP
NOP
CLR P3_7
NOP
NOP
NOP
SETB P3_7
MOV R3,#09
RE10:
DJNZ R3,RE10
MOV C,P3_7
MOV R3,#23
RE20:
DJNZ R3,RE20
RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
#pragma endasm
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -