资源描述
温度巡检仪源程序
精品文档
/*内存分配定义*/
TIME_CONT EQU 33H /*定时时间*/
TIME_COUNT EQU 34H /*100ms中断次数*/
KEY_CODE EQU 35H /*按键代码*/
KEY_VAL EQU 36H /*按键数值*/
CHAN_NUM EQU 37H /*当前采样通道号*/
SAMP_NUM EQU 38H /*采样次数*/
CHAN_NUM1 EQU 39H /*当前显示通道号*/
TEMP1 EQU 40H /*1通道温度*/
TEMP2 EQU 41H /*2通道温度*/
TEMP3 EQU 42H /*3通道温度*/
TEMP4 EQU 43H /*4通道温度*/
TEMP5 EQU 44H /*5通道温度*/
TEMP6 EQU 45H /*6通道温度*/
TEMP7 EQU 46H /*7通道温度*/
TEMP8 EQU 47H /*8通道温度*/
SAMP_MAX EQU 48H /*当前通道10次采样最大值*/
SAMP_MIN EQU 49H /*当前通道10次采样最小值*/
SAMP_SUMH EQU 4AH /*当前通道10次采样累加值高位*/
SAMP_SUML EQU 4BH /*当前通道10次采样累加值低位*/
SAMP_AVG EQU 4CH /*当前通道去掉最大值和最小值后8次采样平均值*/
SAMP_VAL EQU 4DH /*当前通道采样值*/
TEMP_VAL EQU 4EH /*当前通道温度值*/
DIS_BUF1 EQU 50H /*显示缓冲区1*/
DIS_BUF2 EQU 51H /*显示缓冲区2*/
DIS_BUF3 EQU 52H /*显示缓冲区3*/
DIS_BUF4 EQU 53H /*显示缓冲区4*/
DIS_BUF5 EQU 54H /*显示缓冲区5*/
DIS_BUF6 EQU 55H /*显示缓冲区6*/
DIS_NUM EQU 57H /*显示通道号寄存器*/
DIS_CONH EQU 58H /*CH451操作命令高位*/
DIS_CONL EQU 59H /*CH451操作命令低位*/
ST_FLAG BIT 20H.0 /*系统启动标志*/
XJ_FLAG BIT 20H.1 /*巡回检测标志*/
KEY_FLAG BIT 20H.2 /*有键按下标志*/
T_1S BIT 20H.3 /*1秒时间到*/
SAMP_1 BIT 20H.4
SAMP_END10 BIT 20H.5 /*10次采样结束标志*/
SAMP_NO1 BIT 20H.6 /*每通道采样开始标志*/
DD_FLAG BIT 20H.7 /*定点检测标志*/
CHAN_ADD0 EQU 0FF80H /*温度检测通道首地址*/
AD_ADD0 EQU 0FE00H /*AD通道首地址*/
AD_END BIT P3.2 /*AD转换结束标志*/
DIS_DOUT BIT P3.3 /*按键输入*/
DIS_LOAD BIT P1.0 /*命令输入有效*/
DIS_DIN BIT P1.1 /*显示命令输出*/
DIS_DCLK BIT P1.2 /*显示时钟输出*/
ORG 0000H
START: LJMP MAIN
ORG 0003H /*AD转换结束中断入口*/
NOP
NOP
NOP
NOP
LJMP ERR
ORG 000BH /*定时器0中断入口*/
LJMP TIME0
NOP
NOP
LJMP ERR
ORG 0013H /*键盘中断入口*/
LJMP KEY_IN
NOP
NOP
LJMP ERR
ORG 0040H
MAIN: MOV SP,#60H
MOV TMOD,#21H /*定时器0为方式1工作,定时器2为方式2工作*/
MOV TH0,#3CH /*定时器0定时值为500ms*/
MOV TL0,#0AFH
MOV TH1,#0FDH /*通信波特率为4800b/s*/
MOV TL1,#0FDH
MOV SCON,#01000000B /*串口方式为工作方式1*/
MOV A,30H
CJNE A,#0AAH,NRAM
MOV A,31H
CJNE A,#55H,NRAM /*判断是否上电复位*/
SJMP DISP_INIT
NRAM: MOV R0, #7FH /*RAM低128B清零*/
NRAM1: MOV @R0,#00H
DJNZ R0,NRAM1
MOV 30H,#0AAH /*置上电标志*/
MOV 31H,#55H
NOP
NOP
DISP_INIT:NOP
MOV 20H,#00H /*内部状态位清零*/
MOV DIS_BUF1,#0111001B
MOV DIS_BUF2,#1110011B
MOV DIS_BUF3,#0111110B
MOV DIS_BUF4,#1000000B
MOV DIS_BUF5,#1101101B
MOV DIS_BUF6,#0000110B /*cpu-51写入显示缓冲区*/
SETB DIS_DIN /*CH451串口方式设为四线制*/
NOP
NOP
CLR DIS_DIN
NOP
NOP
SETB DIS_DIN
MOV TIME_CONT,#1H
MOV SAMP_NUM,#00H
MOV CHAN_NUM,#00H
MOV CHAN_NUM1,#01H
MOV TIME_COUNT,TIME_CONT/*定时时间设为100毫秒*/
SETB IT1 /*键盘中断设为边沿触发方式*/
SETB PX1 /*键盘中断设为高优先级*/
SETB ET0 /*允许定时器0中断*/
SETB EA /*开中断*/
SETB TR0 /*启动定时器0*/
SETB SAMP_NO1
MOV SAMP_NUM,#00H
MAIN1: JNB T_1S,MAIN1 /*快速检测1通道温度值*/
CLR T_1S
LCALL SAMP /*采样一次*/
MAIN2: JNB SAMP_END10,MAIN1 /*采完10次*/
CLR SAMP_END10
MOV DIS_CONH,#5H /*设定显示参数,不译码,扫描6位*/
MOV DIS_CONL,#60H
LCALL DISP_WRITE
MOV DIS_CONH,#4H /*设定系统参数,启用显示及键盘功能*/
MOV DIS_CONL,#03H
LCALL DISP_WRITE
LCALL DISP_OUT /*显示“CPU-51”*/
CLR EA
SETB EX1
SETB EA
WAIT: JNB KEY_FLAG,WAIT
CLR KEY_FLAG
MOV A,KEY_VAL
CJNE A,#8,WAIT1
SETB ST_FLAG
WAIT1: JNB ST_FLAG,WAIT /*系统是否启动*/
/*巡检仪主程序*/
CLR EX1 /*关键盘中断*/
MOV DIS_CONH,#04H /*关显示器*/
MOV DIS_CONL,#02H
LCALL DISP_WRITE
MOV DIS_CONH,#5H /*译码方式转为BCD方式*/
MOV DIS_CONL,#0E0H
LCALL DISP_WRITE
MOV CHAN_NUM,#00H
LCALL DISP_OUT /*输出显示数据*/
MOV DIS_CONH,#4H /*开显示器*/
MOV DIS_CONL,#03H
LCALL DISP_WRITE
CLR EA
SETB EX1 /*开键盘中断*/
SETB EA
MOV TIME_CONT,#0AH /*定时时间设为1秒*/
MOV TIME_COUNT,TIME_CONT
MOV CHAN_NUM,#01H /*初始化检测通道,从第2通道开始*/
SETB XJ_FLAG /*设为巡回检测状态*/
SETB SAMP_NO1
CLR SAMP_END10
SETB TR1 /*启动定时器1*/
/*主循环程序*/
MAIN_LOOP: JNB KEY_FLAG,MAIN_LOOP3 /*是否有键按下*/
CLR KEY_FLAG /*处理键盘命令*/
MOV A,KEY_VAL
SETB EX1 /*开键盘中断*/
CJNE A,#8,MAIN_LOOP2 /*是启动键?*/
JNB DD_FLAG,MAIN_LOOP1 /*当前状态是定点检测方式*/
SETB XJ_FLAG /*改为巡检方式*/
CLR DD_FLAG /*清除定点标志*/
MOV CHAN_NUM,#00H /*从1通道开始工作*/
MOV SAMP_NUM,#00H
SETB SAMP_NO1
LCALL DISP_OUT /*显示输出*/
MAIN_LOOP1: SJMP MAIN_LOOP3
MAIN_LOOP2: CLR XJ_FLAG /*如为1-8键值则清除巡检标志*/
SETB DD_FLAG /*改为定点检测方式*/
MOV SAMP_NUM,#00H
SETB SAMP_NO1
MOV CHAN_NUM,KEY_VAL /*将按键值写入当前通道寄存器*/
LCALL DISP_OUT /*显示该通道温度值*/
MAIN_LOOP3: JNB T_1S,MAIN_LOOP7 /*1秒时间到*/
LCALL SAMP /*启动AD转换*/
CLR T_1S
JNB SAMP_END10,MAIN_LOOP7 /*采完10次*/
MOV SAMP_NUM,#00H
CLR SAMP_END10
SETB SAMP_NO1
LCALL DISP_OUT /*显示温度值*/
JNB XJ_FLAG,MAIN_LOOP7 /*巡检标志置位*/
MOV A,CHAN_NUM /*当前通道号加1*/
ADD A,#1
MOV CHAN_NUM,A
CJNE A,#8H,MAIN_LOOP7 /*当前通道号为8*/
MOV A,#00H /*当前通道号复归为1号*/
MOV CHAN_NUM,A
MAIN_LOOP7: LCALL SEND /*调用串口发送程序*/
LJMP MAIN_LOOP
/*数据采样子程序*/
SAMP: PUSH ACC
PUSH PSW
SETB RS0
MOV A,CHAN_NUM
MOV DPTR,#CHAN_ADD0 /*输出温度检测通道,发采样脉冲*/
ADD A,DPL
MOV DPL,A
MOVX @DPTR,A
NOP
NOP
MOV A,CHAN_NUM
MOV DPTR,#AD_ADD0 /*根据通道号计算出对应的AD地址*/
ADD A,DPL
MOV DPL,A
MOVX @DPTR,A /*启动AD转换器*/
NOP
NOP
NOP
SAMP1: JB AD_END,SAMP1 /*等待AD转换结束*/
MOVX A,@DPTR /*读AD转换值*/
INC SAMP_NUM /*采样次数加1*/
JNB SAMP_NO1,SAMP2 /*是否首次采样*/
MOV SAMP_SUMH,#00H /*10次累加和赋初值*/
MOV SAMP_SUML,A
MOV SAMP_MAX,A /*最大值赋初值*/
MOV SAMP_MIN,A /*最小值赋初值*/
CLR SAMP_NO1
SJMP SAMP4
SAMP2:MOV SAMP_VAL,A /*每次采样值累加*/
ADD A,SAMP_SUML
MOV SAMP_SUML,A
CLR A
ADDC A,SAMP_SUMH
MOV SAMP_SUMH,A
MOV A,SAMP_VAL /*当前采样值是否为最大值?*/
CLR C
SUBB A,SAMP_MAX
JC SAMP3
MOV A,SAMP_VAL /*更新最大值*/
MOV SAMP_MAX,A
SJMP SAMP4
SAMP3: MOV A,SAMP_VAL /*当前采样值是否为最小值?*/
CLR C
SUBB A,SAMP_MIN
JNC SAMP4
MOV A,SAMP_VAL /*更新最小值*/
MOV SAMP_MIN,A
SAMP4: MOV A,SAMP_NUM
CJNE A,#0AH,SAMP5 /*是否采样完10次*/
/*去极值平均算术数字滤波*/
CLR C /*从累加和中减去最大值*/
MOV A,SAMP_SUML
SUBB A,SAMP_MAX
XCH A,SAMP_SUMH
SUBB A,#00H
XCH A,SAMP_SUMH /*再从累加和中减去最小值*/
SUBB A,SAMP_MIN
MOV SAMP_SUML,A
MOV A,SAMP_SUMH
SUBB A,#00H
SWAP A /*剩余数值除以8*/
RL A
XCH A,SAMP_SUML
SWAP A
RL A
ADD A,#80H /*结果四舍五入*/
ANL A,#1FH
ADDC A,SAMP_SUML
MOV SAMP_AVG,A /*保存去极值平均滤波后的最终采样值*/
SETB SAMP_END10
SJMP SAMP6
SAMP5: AJMP SAMP8
/*采样值转为温度值*/
SAMP6: MOV R2,#00H
MOV R3,SAMP_AVG
MOV R6,#0C7H /* r6r7为定点小数0.779*/
MOV R7,#6CH
MOV A,R3 /* r3*r6r7 小数部分四舍五入取整*/
MOV B,R7
MUL AB
MOV R4,B
MOV R5,A
MOV A,R3
MOV B,R6
MUL AB
ADD A,R4
MOV R4,A
CLR A
ADDC A,B
MOV R3,A
MOV A,R2
MOV B,R7
MUL AB
ADD A,R4
MOV R4,A
MOV A,R3
ADDC A,B
MOV R3,A
CLR A
RLC A
XCH A,R2
MOV B,R6
MUL AB
ADD A,R3
MOV R3,A
MOV A,R2
ADDC A,B
MOV R2,A
MOV A,R4
JNB ACC.7,SAMP7
INC R3
CJNE R3,#0,SAMP7
INC R2
SAMP7: MOV TEMP_VAL,R3 /*将温度值存入TEMP_VAL*/
MOV A,CHAN_NUM
MOV R0,#TEMP1
ADD A,R0
MOV R0,A
MOV @R0,TEMP_VAL
SAMP8: CLR RS0
POP PSW
POP ACC
RET
/*温度值显示子程序*/
DISP_OUT: PUSH ACC
PUSH PSW
PUSH B
PUSH 00H
JNB ST_FLAG,DISP_OUT0 /*系统在工作状态,将温度值写入显示缓冲区*/
MOV A,CHAN_NUM
ADD A,#1H
MOV CHAN_NUM1,A
MOV A,CHAN_NUM
MOV R1,#TEMP1
ADD A,R1
MOV R1,A
/*将温度值转为三位BCD码,存入R3,A,B*/
MOV A,@R1
MOV B,#100
DIV AB
MOV R3,A
MOV A,#10
XCH A,B
DIV AB
MOV DIS_BUF1,CHAN_NUM1 /*显示通道号*/
MOV DIS_BUF2,#10010B /*显示“-” */
MOV DIS_BUF3,#00H /*显示温度千位*/
MOV DIS_BUF4,R3 /*显示温度百位*/
MOV DIS_BUF5,A /*显示温度十位*/
MOV DIS_BUF6,B /*显示温度个位*/
/*数据显示输出*/
DISP_OUT0: MOV R1,#7H /*显示位数为6位*/
MOV R2,#0DH /*从左至右开始描扫*/
MOV R0,#50H /*显示区首址*/
DISP_OUT1: MOV DIS_CONL,@R0
MOV A,R2
ORL A,#8H
MOV DIS_CONH,A
ACALL DISP_WRITE /*将数据写入显示芯片*/
INC R0
DEC R2
DJNZ R1,DISP_OUT1 /*共写6位数据*/
POP 00H
POP B
POP PSW
POP ACC
RET
/*显示芯片命令写入子程序*/
DISP_WRITE: PUSH ACC
PUSH B
PUSH 07H
PUSH 00H
CLR EX1
CLR DIS_LOAD
MOV R7,#08H
MOV A,DIS_CONL
MOV B,DIS_CONH
DISP_WRITE8: RRC A
CLR DIS_DCLK
NOP
NOP
MOV DIS_DIN,C
NOP
NOP
SETB DIS_DCLK
DJNZ R7,DISP_WRITE8
MOV A,B
MOV R7,#04H
DISP_WRITE4: RRC A
CLR DIS_DCLK
NOP
NOP
MOV DIS_DIN,C
NOP
NOP
SETB DIS_DCLK
DJNZ R7,DISP_WRITE4
NOP
NOP
SETB DIS_LOAD
SETB EX1
POP 00H
POP 07H
POP B
POP ACC
RET
/*键盘中断程序*/
KEY_IN: PUSH PSW
PUSH ACC
PUSH DPH
PUSH DPL
PUSH 06H
CLR EX1
MOV SAMP_NUM,#00H
CLR DIS_LOAD
MOV A,#07H
MOV R7,#04H
DIS_READ4: RRC A /*发送读键码命令*/
CLR DIS_DCLK
NOP
NOP
MOV DIS_DIN,C
NOP
NOP
SETB DIS_DCLK
DJNZ R7,DIS_READ4
SETB DIS_LOAD
CLR A
MOV R7,#07H
DIS_READ7: MOV C,DIS_DOUT /*读出键码*/
CLR DIS_DCLK
RLC A
SETB DIS_DCLK
DJNZ R7,DIS_READ7
CLR IE1
MOV KEY_CODE,A
SUBB A,#40H
MOV KEY_VAL,A
SETB KEY_FLAG
SETB EX1
POP 06H
POP DPL
POP DPH
POP ACC
POP PSW
RETI
/*100MS定时中断程序*/
TIME0:
PUSH PSW
PUSH ACC
MOV TH0,#3CH /*计数器重新赋值*/
MOV TL0,#0AFH
CLR A
MOV A,TIME_COUNT
DEC A
MOV TIME_COUNT,A
JZ TIME1
SJMP TIME0_1
TIME1: MOV TIME_COUNT,TIME_CONT
SETB T_1S
TIME0_1:
POP ACC
POP PSW
RETI
/*串口发送子程序*/
SEND: PUSH ACC
PUSH PSW
MOV R0,#80H
MOV R1,#TEMP1
MOV @R0,#0DBH /*数据起始标志,DBDB写入发送缓冲区*/
INC R0
MOV @R0,#0DBH
INC R0
MOV R2,#8H
MOV R3,#00H
SEND1: MOV A,@R1 /*温度值写入发送缓冲区*/
MOV @R0,A
ADD A,@R0
MOV R3,A
INC R1
INC R0
DJNZ R2,SEND1
MOV A,R3
MOV @R0,A
INC R0
MOV @R0,#0EEH
MOV R0,#80H /*发送缓冲区中数据*/
MOV R4,#0BH
SEND2:MOV SBUF,@R0
SEND3:JNB TI,SEND3 /*查寻方式发送*/
CLR TI
INC R0
DJNZ R4,SEND2
POP PSW
POP ACC
RET
/*程序出错恢复子程序*/
ERR: CLR EA /*关中断*/
MOV DPTR,#ERR1 /*准备返回地址*/
PUSH DPL
PUSH DPH
RETI /*清除高级中断激活标志*/
ERR1: MOV 30H,#0AAH /*重建上电标志*/
MOV 31H,#55H
CLR A
PUSH ACC /*压入复位地址*/
PUSH ACC
RETI /*清除低级中断标志*/
ORG 1FFAH
NOP
NOP
NOP
LJMP ERR
END
收集于网络,如有侵权请联系管理员删除
展开阅读全文