📄 4.src
字号:
; .\4.SRC generated from: 4.C
; COMPILER INVOKED BY:
; C:\Keil\C51\BIN\C51.EXE 4.C BROWSE DEBUG OBJECTEXTEND SRC(.\4.SRC)
$NOMOD51
NAME _4
P0 DATA 080H
P1 DATA 090H
AA BIT 090H.1
P2 DATA 0A0H
P3 DATA 0B0H
BB BIT 090H.2
T0 BIT 0B0H.4
AC BIT 0D0H.6
T1 BIT 0B0H.5
CC BIT 090H.3
T2 BIT 090H.0
EA BIT 0A8H.7
IE DATA 0A8H
LEDThreeC BIT 0A0H.2
EXF2 BIT 0C8H.6
RD BIT 0B0H.7
ES BIT 0A8H.4
IP DATA 0B8H
RI BIT 098H.0
INT0 BIT 0B0H.2
CY BIT 0D0H.7
TI BIT 098H.1
INT1 BIT 0B0H.3
RCAP2H DATA 0CBH
PS BIT 0B8H.4
SP DATA 081H
T2EX BIT 090H.1
OV BIT 0D0H.2
RCAP2L DATA 0CAH
C_T2 BIT 0C8H.1
WR BIT 0B0H.6
RCLK BIT 0C8H.5
TCLK BIT 0C8H.4
Key_UP BIT 0A0H.7
SBUF DATA 099H
PCON DATA 087H
SCON DATA 098H
TMOD DATA 089H
TCON DATA 088H
LEDOneC BIT 0A0H.4
IE0 BIT 088H.1
IE1 BIT 088H.3
B DATA 0F0H
Key_DOWN BIT 0A0H.6
CP_RL2 BIT 0C8H.0
ACC DATA 0E0H
TMPort BIT 090H.0
ET0 BIT 0A8H.1
key BIT 0B0H.3
ET1 BIT 0A8H.3
TF0 BIT 088H.5
ET2 BIT 0A8H.5
TF1 BIT 088H.7
TF2 BIT 0C8H.7
RB8 BIT 098H.2
TH0 DATA 08CH
EX0 BIT 0A8H.0
IT0 BIT 088H.0
TH1 DATA 08DH
TB8 BIT 098H.3
EX1 BIT 0A8H.2
IT1 BIT 088H.2
TH2 DATA 0CDH
P BIT 0D0H.0
SM0 BIT 098H.7
TL0 DATA 08AH
SM1 BIT 098H.6
TL1 DATA 08BH
SM2 BIT 098H.5
TL2 DATA 0CCH
PT0 BIT 0B8H.1
LEDTwoC BIT 0A0H.3
PT1 BIT 0B8H.3
RS0 BIT 0D0H.3
PT2 BIT 0B8H.5
TR0 BIT 088H.4
RS1 BIT 0D0H.4
TR1 BIT 088H.6
TR2 BIT 0C8H.2
PX0 BIT 0B8H.0
PX1 BIT 0B8H.2
DPH DATA 083H
DPL DATA 082H
RelayOutPort BIT 090H.7
EXEN2 BIT 0C8H.3
REN BIT 098H.4
T2CON DATA 0C8H
RXD BIT 0B0H.0
TXD BIT 0B0H.1
F0 BIT 0D0H.5
Key_SET BIT 0A0H.5
PSW DATA 0D0H
?PR?main?4 SEGMENT CODE
?PR?KeyAndDis_Time0?4 SEGMENT CODE
?PR?V2ToV?4 SEGMENT CODE
?PR?InitDS1820?4 SEGMENT CODE
?PR?ROMDS1820?4 SEGMENT CODE
?PR?TMVDS1820?4 SEGMENT CODE
?PR?TMRDS1820?4 SEGMENT CODE
?PR?TMWDS1820?4 SEGMENT CODE
?PR?TMREDS1820?4 SEGMENT CODE
?PR?TMERDS1820?4 SEGMENT CODE
?PR?WriteDS1820?4 SEGMENT CODE
?PR?ReadDS1820?4 SEGMENT CODE
?PR?Delay_510?4 SEGMENT CODE
?PR?Delay_110?4 SEGMENT CODE
?PR?Delay_10ms?4 SEGMENT CODE
?PR?Delay_4s?4 SEGMENT CODE
?CO?4 SEGMENT CODE
?DT?4 SEGMENT DATA
?BA?4 SEGMENT DATA BITADDRESSABLE
EXTRN CODE (?C_STARTUP)
EXTRN CODE (?C?SCDIV)
PUBLIC KeySETDowning
PUBLIC PowTF
PUBLIC SetTF
PUBLIC KeyTF
PUBLIC KeySETDown
PUBLIC DS1820ON
PUBLIC LEDDis
PUBLIC Delay_4s
PUBLIC Delay_10ms
PUBLIC Delay_110
PUBLIC Delay_510
PUBLIC ReadDS1820
PUBLIC WriteDS1820
PUBLIC TMERDS1820
PUBLIC TMREDS1820
PUBLIC TMWDS1820
PUBLIC TMRDS1820
PUBLIC TMVDS1820
PUBLIC ROMDS1820
PUBLIC InitDS1820
PUBLIC V2ToV
PUBLIC KeyAndDis_Time0
PUBLIC main
DSEG AT 026H
TMSetV: DS 1
DSEG AT 027H
TMRomV: DS 1
DSEG AT 028H
THV: DS 1
DSEG AT 029H
TLV: DS 1
RSEG ?DT?4
KeyV: DS 1
IntNum2: DS 1
IntNum3: DS 1
Sign: DS 1
KSDNum: DS 1
TempKeyV: DS 1
LED_Three: DS 1
LED_One: DS 1
IntNum: DS 1
LED_Two: DS 1
TMV: DS 1
RSEG ?BA?4
StateREG: DS 1
DS1820ON EQU (StateREG+0).0
KeySETDown EQU (StateREG+0).2
KeyTF EQU (StateREG+0).4
SetTF EQU (StateREG+0).1
PowTF EQU (StateREG+0).3
KeySETDowning EQU (StateREG+0).5
RSEG ?CO?4
LEDDis:
DB 0C0H
DB 0F9H
DB 0A4H
DB 0B0H
DB 099H
DB 092H
DB 082H
DB 0F8H
DB 080H
DB 090H
DB 0FFH
DB 0BFH
; /*-------------------------------
;
; 温度控制器V1.51
; 显示为三个共阳极LED
; 温度传感器用单总线DS18B20
; CPU为2051,三个按键,分别为UP,DOWN,SET
; 温度调节上限为125度,下限为-55度
; 只能用于单只18B20
;
; 本软件仅供学习与参考,引用时请注明版权
;
; http://www.cdle.net
; 明浩 2004/9/13
; pnzwzw@cdle.net
; -------------------------------*/
;
; #include <reg52.H>
; //#include<reg52.h>
; #include <intrins.h>
; #define uchar unsigned char
; #define uint unsigned int
; #define ulong unsigned long
; //#define Key_UP P3^0 //上调温度
; //#define Key_DOWN P3^1 //下调温度
; //#define Key_SET P1^7 //设定键(温度设定,长按开电源)
; //#define RelayOutPort P3^5 //继电器输出
; #define LEDPort P0 //LED控制口
; //#define LEDOneC P3^2 //LED DS1控制(百位)
; //#define LEDTwoC P3^3 //LED DS2控制(十位)
; //#define LEDThreeC P3^4 //LED DS3控制(个位)
;
; //#define TMPort P1^0 //DS1820 DataPort
; sbit Key_UP = P2^7; //上调温度
; sbit Key_DOWN= P2^6; //下调温度
; sbit Key_SET= P2^5; //设定键(温度设定,长按开电源)
; sbit RelayOutPort= P1^7; //继电器输出
; //sbit LEDPort = P0 ; //LED控制口
; sbit LEDOneC = P2^4; //LED DS1控制(百位)
; sbit LEDTwoC = P2^3 ; //LED DS2控制(十位)
; sbit LEDThreeC= P2^2 ; //LED DS3控制(个位)
; sbit TMPort = P1^0; //DS1820 DataPort
; sbit AA = P1^1;
; sbit BB = P1^2;
; sbit CC = P1^3;
; sbit key = P3^3;
;
;
;
;
; unsigned char code LEDDis[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF,0xBF}; //0-9的LED笔划,0xFF为空,0xF7为负号
;
; static unsigned char bdata StateREG; //可位寻址的状态寄存器
; sbit DS1820ON = StateREG^0; //DS1820是否存在
; sbit SetTF = StateREG^1; //是否是在温度设置状态
; sbit KeySETDown = StateREG^2; //是否已按过SET键标识
; sbit PowTF = StateREG^3; //电源电源标识
; sbit KeyTF = StateREG^4; //键盘是否允许
;
; sbit KeySETDowning = StateREG^5; //SET是否正在按下
; static unsigned char bdata TLV _at_ 0x0029; //温度变量高低位
; static unsigned char bdata THV _at_ 0x0028;
; static signed char TMV; //转换后的温度值
; static unsigned char KeyV,TempKeyV; //键值
; static signed char TMRomV _at_ 0x0027; //高温限制
; static signed char TMSetV _at_ 0x0026; //温度设定值
; static unsigned char KSDNum; //SET键连按时的采集次数
; static unsigned char IntNum,IntNum2,IntNum3; //中断发生次数,IntNum用于SET长按检测,IntNum2用于设定状态时LED闪烁
; static signed char LED_One,LED_Two,LED_Three; //LED的显示位 LED_One为十位,LED_Two为个位
; static unsigned char Sign; //负号标识
;
; void main(void)
RSEG ?PR?main?4
main:
USING 0
; SOURCE LINE # 71
; {
; SOURCE LINE # 72
;
; void InitDS1820(void); //定义函数
;
; void ROMDS1820(void);
; void TMVDS1820(void);
; void TMRDS1820(void);
; void TMWDS1820(void);
; void TMREDS1820(void);
; void TMERDS1820(void);
; void ReadDS1820(void);
; void WriteDS1820(void);
; void Delay_510(void);
; void Delay_110(void);
; void Delay_10ms(void);
; void Delay_4s(void);
; void V2ToV(void);
;
;
; StateREG = 0; //初始化变量
; SOURCE LINE # 91
CLR A
MOV StateREG,A
; SetTF = 1;
; SOURCE LINE # 92
SETB SetTF
; PowTF = 1; //关电源
; SOURCE LINE # 93
SETB PowTF
; THV = 0;
; SOURCE LINE # 94
MOV THV,A
; TLV = 0;
; SOURCE LINE # 95
MOV TLV,A
; TMV = 0;
; SOURCE LINE # 96
MOV TMV,A
; KeyV = 0;
; SOURCE LINE # 97
MOV KeyV,A
; TempKeyV = 0;
; SOURCE LINE # 98
MOV TempKeyV,A
; KSDNum = 0;
; SOURCE LINE # 99
MOV KSDNum,A
; IntNum = 0;
; SOURCE LINE # 100
MOV IntNum,A
; IntNum2 = 0;
; SOURCE LINE # 101
MOV IntNum2,A
; IntNum3 = 0;
; SOURCE LINE # 102
MOV IntNum3,A
; LED_One = 0;
; SOURCE LINE # 103
MOV LED_One,A
; LED_Two = 0;
; SOURCE LINE # 104
MOV LED_Two,A
; key = 0;
; SOURCE LINE # 105
CLR key
;
; InitDS1820(); //初始化
; SOURCE LINE # 107
LCALL InitDS1820
; ROMDS1820(); //跳过ROM
; SOURCE LINE # 108
LCALL ROMDS1820
; TMERDS1820(); //E2PRAM中温度上限值调入RAM
; SOURCE LINE # 109
LCALL TMERDS1820
; InitDS1820(); //初始化
; SOURCE LINE # 110
LCALL InitDS1820
; ROMDS1820(); //跳过ROM
; SOURCE LINE # 111
LCALL ROMDS1820
; TMRDS1820(); //读出温度指令
; SOURCE LINE # 112
LCALL TMRDS1820
; ReadDS1820(); //读出温度值和上限值
; SOURCE LINE # 113
LCALL ReadDS1820
; TMSetV = TMRomV; //拷贝保存在DS18B20ROM里的上限值到TMSetV
; SOURCE LINE # 114
MOV TMSetV,TMRomV
;
; EA = 1; //允许CPU中断
; SOURCE LINE # 116
SETB EA
; ET0 = 1; //定时器0中断打开
; SOURCE LINE # 117
SETB ET0
; TMOD = 0x1; //设定时器0为模式1,16位模式
; SOURCE LINE # 118
MOV TMOD,#01H
; TH0=0xB1;
; SOURCE LINE # 119
MOV TH0,#0B1H
; TL0=0xDF; //设定时值为20000us(20ms)
; SOURCE LINE # 120
MOV TL0,#0DFH
; TR0 = 1; //开始定时
; SOURCE LINE # 121
SETB TR0
?C0001:
; while(1);
; SOURCE LINE # 122
SJMP ?C0001
; END OF main
CSEG AT 0000BH
LJMP KeyAndDis_Time0
; }
;
; //定时器0中断外理中键扫描和显示
; void KeyAndDis_Time0(void) interrupt 1 using 2
RSEG ?PR?KeyAndDis_Time0?4
USING 2
KeyAndDis_Time0:
PUSH ACC
PUSH B
PUSH DPH
PUSH DPL
PUSH PSW
USING 2
MOV PSW,#010H
; SOURCE LINE # 126
; {
;
; TH0=0xB1;
; SOURCE LINE # 129
MOV TH0,#0B1H
; TL0=0xDF; //设定时值为20000us(20ms)
; SOURCE LINE # 130
MOV TL0,#0DFH
;
; LEDPort = 0xff;
; SOURCE LINE # 132
MOV P0,#0FFH
?C0004:
; while(key);
; SOURCE LINE # 133
JB key,?C0004
?C0005:
;
; if (!Key_UP)
; SOURCE LINE # 135
JB Key_UP,?C0006
; //AA=0;
; KeyV = 1;
; SOURCE LINE # 137
MOV KeyV,#01H
?C0006:
; if (!Key_DOWN)
; SOURCE LINE # 138
JB Key_DOWN,?C0007
; //AA=0;
; //BB=0;
;
; KeyV = 2;
; SOURCE LINE # 142
MOV KeyV,#02H
?C0007:
; if (!Key_SET)
; SOURCE LINE # 143
JB Key_SET,?C0008
; //AA=0;
; //BB=0;
; //CC=0;
;
;
; KeyV = 3;
; SOURCE LINE # 149
MOV KeyV,#03H
?C0008:
; //KeySETDowning = 0; //清除
; if (KeyV != 0) //有键按下
; SOURCE LINE # 151
MOV A,KeyV
JNZ $ + 5H
LJMP ?C0009
; {
; SOURCE LINE # 152
; Delay_10ms(); //延时防抖 按下10ms再测
; SOURCE LINE # 153
LCALL Delay_10ms
; if (!Key_UP)
; SOURCE LINE # 154
JB Key_UP,?C0010
; TempKeyV = 1;
; SOURCE LINE # 155
MOV TempKeyV,#01H
?C0010:
; if (!Key_DOWN)
; SOURCE LINE # 156
JB Key_DOWN,?C0011
; TempKeyV = 2;
; SOURCE LINE # 157
MOV TempKeyV,#02H
?C0011:
; if (!Key_SET)
; SOURCE LINE # 158
JB Key_SET,?C0012
; TempKeyV = 3;
; SOURCE LINE # 159
MOV TempKeyV,#03H
?C0012:
; if (KeyV == TempKeyV) //两次值相等为确定接下了键
; SOURCE LINE # 160
MOV A,KeyV
XRL A,TempKeyV
JNZ ?C0013
; {
; SOURCE LINE # 161
; if (KeyV == 3) //按下SET键,如在SET状态就退出,否则进入
; SOURCE LINE # 162
MOV A,KeyV
XRL A,#03H
JNZ ?C0014
; {
; SOURCE LINE # 163
; //KeySETDowning = 1; //表明SET正在按下
; PowTF = 0; //电源标识开
; SOURCE LINE # 165
CLR PowTF
; if (!KeyTF)
; SOURCE LINE # 166
JB KeyTF,?C0015
; if (SetTF)
; SOURCE LINE # 167
JNB SetTF,?C0016
; {
; SOURCE LINE # 168
; SetTF = 0; //标识位标识退出设定
; SOURCE LINE # 169
CLR SetTF
; InitDS1820(); //初始化
; SOURCE LINE # 170
LCALL InitDS1820
; ROMDS1820(); //跳过ROM
; SOURCE LINE # 171
LCALL ROMDS1820
; TMWDS1820(); //写温度上限指令
; SOURCE LINE # 172
LCALL TMWDS1820
; WriteDS1820(); //写温度上限到DS18B20ROM
; SOURCE LINE # 173
LCALL WriteDS1820
; WriteDS1820(); //写温度上限到DS18B20ROM
; SOURCE LINE # 174
LCALL WriteDS1820
; WriteDS1820(); //写温度上限到DS18B20ROM
; SOURCE LINE # 175
LCALL WriteDS1820
; InitDS1820(); //初始化
; SOURCE LINE # 176
LCALL InitDS1820
; ROMDS1820(); //跳过ROM
; SOURCE LINE # 177
LCALL ROMDS1820
; TMREDS1820(); //温度上限值COPY回E2PRAM
; SOURCE LINE # 178
LCALL TMREDS1820
; }
; SOURCE LINE # 179
SJMP ?C0015
?C0016:
; else
; SetTF = 1;
; SOURCE LINE # 181
SETB SetTF
?C0015:
; if (!KeySETDown) //没有第一次按下SET时,KeySETDown标识置1
; SOURCE LINE # 182
JB KeySETDown,?C0018
; KeySETDown = 1;
; SOURCE LINE # 183
SETB KeySETDown
SJMP ?C0014
?C0018:
; else
; KSDNum = KSDNum + 1; //前一秒内有按过SET则开始计数
; SOURCE LINE # 185
INC KSDNum
; }
; SOURCE LINE # 186
?C0014:
; if (SetTF) //在SET状态下
; SOURCE LINE # 187
JNB SetTF,?C0020
; {
; SOURCE LINE # 188
; if ((KeyV == 1) && (!KeyTF))
; SOURCE LINE # 189
MOV A,KeyV
CJNE A,#01H,?C0021
JB KeyTF,?C0021
; TMSetV = TMSetV + 1; //上调温度
; SOURCE LINE # 190
INC TMSetV
?C0021:
; if ((KeyV == 2) && (!KeyTF))
; SOURCE LINE # 191
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -