1、温度巡检仪源程序精品文档/*内存分配定义*/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通道温
2、度*/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 /*当前通道采样
3、值*/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
4、.0 /*系统启动标志*/XJ_FLAG BIT 20H.1 /*巡回检测标志*/KEY_FLAG BIT 20H.2 /*有键按下标志*/T_1S BIT 20H.3 /*1秒时间到*/SAMP_1 BIT 20H.4SAMP_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_
5、DOUT BIT P3.3 /*按键输入*/DIS_LOAD BIT P1.0 /*命令输入有效*/DIS_DIN BIT P1.1 /*显示命令输出*/DIS_DCLK BIT P1.2 /*显示时钟输出*/ ORG 0000HSTART: 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: M
6、OV 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_INITNRAM: MOV R0, #7FH /*RAM低128B清零*/NRAM1: M
7、OV R0,#00H DJNZ R0,NRAM1 MOV 30H,#0AAH /*置上电标志*/ MOV 31H,#55H NOP NOPDISP_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
8、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
9、 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 /*显示“CPU51”*/ CLR EA SETB EX1 S
10、ETB 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
11、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*/ /*主循环程序*/
12、 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 /
13、*显示输出*/MAIN_LOOP1: SJMP MAIN_LOOP3MAIN_LOOP2: CLR XJ_FLAG /*如为18键值则清除巡检标志*/ 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 /
14、*采完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,AMAIN_LOOP7: LCALL SEND /*调用串口发送程序*/ LJMP MAIN_LOOP /*数据采样子程序
15、*/ 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转换值*/ IN
16、C 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 /*当前
17、采样值是否为最大值?*/ CLR C SUBB A,SAMP_MAX JC SAMP3 MOV A,SAMP_VAL /*更新最大值*/ MOV SAMP_MAX,A SJMP SAMP4SAMP3: MOV A,SAMP_VAL /*当前采样值是否为最小值?*/ CLR C SUBB A,SAMP_MIN JNC SAMP4 MOV A,SAMP_VAL /*更新最小值*/ MOV SAMP_MIN,ASAMP4: MOV A,SAMP_NUM CJNE A,#0AH,SAMP5 /*是否采样完10次*/ /*去极值平均算术数字滤波*/ CLR C /*从累加和中减去最大值*/ MOV A,
18、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
19、SJMP SAMP6SAMP5: 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
20、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
21、 /*温度值显示子程序*/ 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
22、 /*显示通道号*/ 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
23、 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_CONHDISP_WRITE8: RRC A CLR DIS_DCLK NOP NOP MOV DIS_DIN,C NOP NOP SETB DI
24、S_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
25、 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_VA
26、L,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 /*串口发送子程序
27、*/ 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
28、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 ERREND 收集于网络,如有侵权请联系管理员删除
©2010-2024 宁波自信网络信息技术有限公司 版权所有
客服电话:4008-655-100 投诉/维权电话:4009-655-100