?? 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 //上調(diào)溫度
#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為負(fù)號
static unsigned char bdata StateREG; //可位尋址的狀態(tài)寄存器
sbit DS18B20ON = StateREG^0; //DS1820是否存在
sbit SetTF = StateREG^1; //是否是在溫度設(shè)置狀態(tài)
static signed char LED_f,LED_1,LED_2,LED_3,LED_4; //LED的顯示位 LED_One為十位,LED_Two為個(gè)位
static signed char L_1,L_2,L_3,L_4,L_5; //LED的顯示位 LED_One為十位,LED_Two為個(gè)位
static unsigned char Sign; //負(fù)號標(biāo)識
static unsigned char sign_jd; //精度標(biāo)識
static unsigned char KeyV,TempKeyV; //鍵值
static unsigned char bdata TLV _at_ 0x0029; //溫度變量高低位
static unsigned char bdata THV _at_ 0x0028;
static signed char TMV; //轉(zhuǎn)換后的溫度值
static signed char TM; //轉(zhuǎn)換后的溫度值
static signed int wd; //轉(zhuǎn)換后的溫度值
static signed int zd; //轉(zhuǎn)換后的溫度值
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; //定時(shí)器0中斷打開
TMOD = 0x1; //設(shè)定時(shí)器0為模式1,16位模式
TH0=0xB1;
TL0=0xDF; //設(shè)定時(shí)值為20000us(20ms)
TR0 = 1; //開始定時(shí)
while(1);
}
//定時(shí)器0中斷外理中鍵掃描和顯示
void KeyAndDis_Time0(void) interrupt 1 using 2
{
TH0=0xb1;
TL0=0xDF; //設(shè)定時(shí)值為20000us(20ms)
Key_jd=1;
LEDPort = 0x00;
zd++;
if (zd>50)
{
if (!Key_jd)
KeyV = 1;
if (KeyV != 0) //有鍵按下
{
Delay_10ms(); //延時(shí)防抖 按下10ms再測
if (!Key_jd)
TempKeyV = 1;
if (KeyV == TempKeyV) //兩次值相等為確定接下了鍵
{
sign_jd=!sign_jd;
zd=0;
}
}
}
KeyV = 0;
TempKeyV = 0; //清空變量準(zhǔn)備下次鍵掃描
if (DS18B20ON)
{
InitDS1820(); //初始化
ROMDS1820(); //跳過ROM
TMVDS1820(); //溫度轉(zhuǎn)換指令
Delay_510();
Delay_510(); //延時(shí)等待轉(zhuǎn)換完成
InitDS1820(); //初始化
ROMDS1820(); //跳過ROM
TMRDS1820(); //讀出溫度指令
ReadDS1820(); //讀出溫度值
V2ToV();
if (LED_f==1)//轉(zhuǎn)換顯示值
LEDf=0;
else
LEDf=1;
LEDPort = ~LED_1;
LED1 = 0;
Delay_510();
Delay_510();
LED1 = 1; //顯示百位數(shù)
LEDPort = ~LED_2;
LED2 = 0;
Delay_510();
Delay_510();
LED2 = 1; //顯示百位數(shù)
LEDPort = ~LED_3;
LED3 = 0;
Delay_510();
Delay_510();
LED3 = 1; //顯示百位數(shù)
LEDPort = ~LED_4;
LED4 = 0;
Delay_510();
Delay_510();
LED4 = 1; //顯示百位數(shù)
}
}
void V2ToV(void) //數(shù)值轉(zhuǎn)換
{
TM=TLV<<4;
TLV = TLV >> 4;
THV = THV << 4; //讀出的高低位數(shù)值移位
TMV = TLV | THV; //合并高低位放入TM為實(shí)際溫度值
Sign = 0;
Sign = TMV >> 7;
if (Sign)
{
L_1= (~(TMV-1)) / 100; //轉(zhuǎn)換百位值
L_2= ((~(TMV-1)) - L_1 * 100)/10;
L_3 = (~(TMV-1)) - L_1 * 100 - L_2 * 10;
}
else
{
L_1= (TMV) / 100; //轉(zhuǎn)換百位值
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_(); //保持一個(gè)周期
TMPort = 0; //拉低TMPort
Delay_510(); //延時(shí) DS1820復(fù)位時(shí)間要500us的低電平
TMPort = 1; //拉高TMPort
_nop_(); //保持
_nop_();
_nop_();
Delay_110(); //延時(shí)110us 等待DS1820回應(yīng)
if (!TMPort) //回應(yīng)信號為低電平
DS18B20ON = 1;
else
DS18B20ON = 0;
Delay_110(); //延時(shí)
Delay_110();
TMPort = 1; //拉高TMPort
}
void Delay_510(void) //延時(shí)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) //延時(shí)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) //延時(shí)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) //延時(shí)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) //溫度轉(zhuǎn)換指令
{
#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 //發(fā)出4EH寫ROM指令后連發(fā)兩個(gè)字節(jié)分別為上下限
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
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -