最新温度巡检仪源程序

  • 格式:doc
  • 大小:46.00 KB
  • 文档页数:13

/*内存分配定义*/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.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_DOUT BIT P3.3 /*按键输入*/DIS_LOAD BIT P1.0 /*命令输入有效*/DIS_DIN BIT P1.1 /*显示命令输出*/DIS_DCLK BIT P1.2 /*显示时钟输出*/ORG 0000HSTART: LJMP MAINORG 0003H /*AD转换结束中断入口*/NOPNOPNOPNOPLJMP ERRORG 000BH /*定时器0中断入口*/LJMP TIME0NOPNOPLJMP ERRORG 0013H /*键盘中断入口*/LJMP KEY_INNOPNOPLJMP ERRORG 0040HMAIN: MOV SP,#60HMOV TMOD,#21H /*定时器0为方式1工作,定时器2为方式2工作*/ MOV TH0,#3CH /*定时器0定时值为500ms*/MOV TL0,#0AFHMOV TH1,#0FDH /*通信波特率为4800b/s*/MOV TL1,#0FDHMOV SCON,#01000000B /*串口方式为工作方式1*/MOV A,30HCJNE A,#0AAH,NRAMMOV A,31HCJNE A,#55H,NRAM /*判断是否上电复位*/SJMP DISP_INITNRAM: MOV R0, #7FH /*RAM低128B清零*/NRAM1: MOV @R0,#00HDJNZ R0,NRAM1MOV 30H,#0AAH /*置上电标志*/MOV 31H,#55HNOPNOPDISP_INIT:NOPMOV 20H,#00H /*内部状态位清零*/MOV DIS_BUF1,#0111001BMOV DIS_BUF2,#1110011BMOV DIS_BUF3,#0111110BMOV DIS_BUF4,#1000000BMOV DIS_BUF5,#1101101BMOV DIS_BUF6,#0000110B /*cpu-51写入显示缓冲区*/SETB DIS_DIN /*CH451串口方式设为四线制*/NOPNOPCLR DIS_DINNOPNOPSETB DIS_DINMOV TIME_CONT,#1HMOV SAMP_NUM,#00HMOV CHAN_NUM,#00HMOV CHAN_NUM1,#01HMOV TIME_COUNT,TIME_CONT/*定时时间设为100毫秒*/SETB IT1 /*键盘中断设为边沿触发方式*/SETB PX1 /*键盘中断设为高优先级*/SETB ET0 /*允许定时器0中断*/SETB EA /*开中断*/SETB TR0 /*启动定时器0*/SETB SAMP_NO1MOV SAMP_NUM,#00HMAIN1: JNB T_1S,MAIN1 /*快速检测1通道温度值*/CLR T_1SLCALL SAMP /*采样一次*/MAIN2: JNB SAMP_END10,MAIN1 /*采完10次*/CLR SAMP_END10MOV DIS_CONH,#5H /*设定显示参数,不译码,扫描6位*/ MOV DIS_CONL,#60HLCALL DISP_WRITEMOV DIS_CONH,#4H /*设定系统参数,启用显示及键盘功能*/ MOV DIS_CONL,#03HLCALL DISP_WRITELCALL DISP_OUT /*显示“CPU-51”*/CLR EASETB EX1SETB EAWAIT: JNB KEY_FLAG,WAITCLR KEY_FLAGMOV A,KEY_VALCJNE A,#8,WAIT1SETB ST_FLAGWAIT1: JNB ST_FLAG,WAIT /*系统是否启动*//*巡检仪主程序*/CLR EX1 /*关键盘中断*/MOV DIS_CONH,#04H /*关显示器*/MOV DIS_CONL,#02HLCALL DISP_WRITEMOV DIS_CONH,#5H /*译码方式转为BCD方式*/MOV DIS_CONL,#0E0HLCALL DISP_WRITEMOV CHAN_NUM,#00HLCALL DISP_OUT /*输出显示数据*/MOV DIS_CONH,#4H /*开显示器*/MOV DIS_CONL,#03HLCALL DISP_WRITECLR EASETB EX1 /*开键盘中断*/SETB EAMOV TIME_CONT,#0AH /*定时时间设为1秒*/MOV TIME_COUNT,TIME_CONTMOV CHAN_NUM,#01H /*初始化检测通道,从第2通道开始*/SETB XJ_FLAG /*设为巡回检测状态*/SETB SAMP_NO1CLR SAMP_END10SETB TR1 /*启动定时器1*//*主循环程序*/MAIN_LOOP: JNB KEY_FLAG,MAIN_LOOP3 /*是否有键按下*/CLR KEY_FLAG /*处理键盘命令*/MOV A,KEY_VALSETB 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,#00HSETB SAMP_NO1LCALL DISP_OUT /*显示输出*/MAIN_LOOP1: SJMP MAIN_LOOP3MAIN_LOOP2: CLR XJ_FLAG /*如为1-8键值则清除巡检标志*/ SETB DD_FLAG /*改为定点检测方式*/MOV SAMP_NUM,#00HSETB SAMP_NO1MOV CHAN_NUM,KEY_VAL /*将按键值写入当前通道寄存器*/ LCALL DISP_OUT /*显示该通道温度值*/MAIN_LOOP3: JNB T_1S,MAIN_LOOP7 /*1秒时间到*/LCALL SAMP /*启动AD转换*/CLR T_1SJNB SAMP_END10,MAIN_LOOP7 /*采完10次*/MOV SAMP_NUM,#00HCLR SAMP_END10SETB SAMP_NO1LCALL DISP_OUT /*显示温度值*/JNB XJ_FLAG,MAIN_LOOP7 /*巡检标志置位*/ MOV A,CHAN_NUM /*当前通道号加1*/ADD A,#1MOV CHAN_NUM,ACJNE A,#8H,MAIN_LOOP7 /*当前通道号为8*/MOV A,#00H /*当前通道号复归为1号*/MOV CHAN_NUM,AMAIN_LOOP7: LCALL SEND /*调用串口发送程序*/LJMP MAIN_LOOP/*数据采样子程序*/SAMP: PUSH ACCPUSH PSWSETB RS0MOV A,CHAN_NUMMOV DPTR,#CHAN_ADD0 /*输出温度检测通道,发采样脉冲*/ADD A,DPLMOV DPL,AMOVX @DPTR,ANOPNOPMOV A,CHAN_NUMMOV DPTR,#AD_ADD0 /*根据通道号计算出对应的AD地址*/ADD A,DPLMOV DPL,AMOVX @DPTR,A /*启动AD转换器*/NOPNOPNOPSAMP1: 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,AMOV SAMP_MAX,A /*最大值赋初值*/MOV SAMP_MIN,A /*最小值赋初值*/CLR SAMP_NO1SJMP SAMP4SAMP2:MOV SAMP_VAL,A /*每次采样值累加*/ADD A,SAMP_SUMLMOV SAMP_SUML,ACLR AADDC A,SAMP_SUMHMOV SAMP_SUMH,AMOV A,SAMP_VAL /*当前采样值是否为最大值?*/ CLR CSUBB A,SAMP_MAXJC SAMP3MOV A,SAMP_VAL /*更新最大值*/MOV SAMP_MAX,ASJMP SAMP4SAMP3: MOV A,SAMP_VAL /*当前采样值是否为最小值?*/ CLR CSUBB A,SAMP_MINJNC SAMP4MOV A,SAMP_VAL /*更新最小值*/MOV SAMP_MIN,ASAMP4: MOV A,SAMP_NUMCJNE A,#0AH,SAMP5 /*是否采样完10次*//*去极值平均算术数字滤波*/CLR C /*从累加和中减去最大值*/MOV A,SAMP_SUMLSUBB A,SAMP_MAXXCH A,SAMP_SUMHSUBB A,#00HXCH A,SAMP_SUMH /*再从累加和中减去最小值*/SUBB A,SAMP_MINMOV SAMP_SUML,AMOV A,SAMP_SUMHSUBB A,#00HSWAP A /*剩余数值除以8*/RL AXCH A,SAMP_SUMLSWAP ARL AADD A,#80H /*结果四舍五入*/ANL A,#1FHADDC A,SAMP_SUMLMOV SAMP_AVG,A /*保存去极值平均滤波后的最终采样值*/ SETB SAMP_END10SJMP SAMP6SAMP5: AJMP SAMP8/*采样值转为温度值*/SAMP6: MOV R2,#00HMOV R3,SAMP_AVGMOV R6,#0C7H /* r6r7为定点小数0.779*/MOV R7,#6CHMOV A,R3 /* r3*r6r7 小数部分四舍五入取整*/MOV B,R7MUL ABMOV R4,BMOV R5,AMOV A,R3MOV B,R6MUL ABADD A,R4MOV R4,ACLR AADDC A,BMOV R3,AMOV A,R2MOV B,R7MUL ABADD A,R4MOV R4,AMOV A,R3ADDC A,BMOV R3,ACLR ARLC AXCH A,R2MOV B,R6MUL ABADD A,R3MOV R3,AMOV A,R2ADDC A,BMOV R2,AMOV A,R4JNB ACC.7,SAMP7INC R3CJNE R3,#0,SAMP7INC R2SAMP7: MOV TEMP_VAL,R3 /*将温度值存入TEMP_VAL*/MOV A,CHAN_NUMMOV R0,#TEMP1ADD A,R0MOV R0,AMOV @R0,TEMP_VALSAMP8: CLR RS0POP PSWPOP ACCRET/*温度值显示子程序*/DISP_OUT: PUSH ACCPUSH PSWPUSH BPUSH 00HJNB ST_FLAG,DISP_OUT0 /*系统在工作状态,将温度值写入显示缓冲区*/ MOV A,CHAN_NUMADD A,#1HMOV CHAN_NUM1,AMOV A,CHAN_NUMMOV R1,#TEMP1ADD A,R1MOV R1,A/*将温度值转为三位BCD码,存入R3,A,B*/MOV A,@R1MOV B,#100DIV ABMOV R3,AMOV A,#10XCH A,BDIV ABMOV 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,@R0MOV A,R2ORL A,#8HMOV DIS_CONH,AACALL DISP_WRITE /*将数据写入显示芯片*/ INC R0DEC R2DJNZ R1,DISP_OUT1 /*共写6位数据*/POP 00HPOP BPOP PSWPOP ACCRET/*显示芯片命令写入子程序*/DISP_WRITE: PUSH ACCPUSH BPUSH 07HPUSH 00HCLR EX1CLR DIS_LOADMOV R7,#08HMOV A,DIS_CONLMOV B,DIS_CONHDISP_WRITE8: RRC ACLR DIS_DCLKNOPNOPMOV DIS_DIN,CNOPNOPSETB DIS_DCLKDJNZ R7,DISP_WRITE8MOV A,BMOV R7,#04HDISP_WRITE4: RRC ACLR DIS_DCLKNOPNOPMOV DIS_DIN,CNOPNOPSETB DIS_DCLKDJNZ R7,DISP_WRITE4NOPNOPSETB DIS_LOADSETB EX1POP 00HPOP 07HPOP BPOP ACCRET/*键盘中断程序*/KEY_IN: PUSH PSWPUSH ACCPUSH DPHPUSH DPLPUSH 06HCLR EX1MOV SAMP_NUM,#00HCLR DIS_LOADMOV A,#07HMOV R7,#04HDIS_READ4: RRC A /*发送读键码命令*/ CLR DIS_DCLKNOPNOPMOV DIS_DIN,CNOPNOPSETB DIS_DCLKDJNZ R7,DIS_READ4SETB DIS_LOADCLR AMOV R7,#07HDIS_READ7: MOV C,DIS_DOUT /*读出键码*/CLR DIS_DCLKRLC ASETB DIS_DCLKDJNZ R7,DIS_READ7CLR IE1MOV KEY_CODE,ASUBB A,#40HMOV KEY_VAL,ASETB KEY_FLAGSETB EX1POP 06HPOP DPLPOP DPHPOP ACCPOP PSWRETI/*100MS定时中断程序*/TIME0:PUSH PSWPUSH ACCMOV TH0,#3CH /*计数器重新赋值*/MOV TL0,#0AFHCLR AMOV A,TIME_COUNTDEC AMOV TIME_COUNT,AJZ TIME1SJMP TIME0_1TIME1: MOV TIME_COUNT,TIME_CONTSETB T_1STIME0_1:POP ACCPOP PSWRETI/*串口发送子程序*/SEND: PUSH ACCPUSH PSWMOV R0,#80HMOV R1,#TEMP1MOV @R0,#0DBH /*数据起始标志,DBDB写入发送缓冲区*/ INC R0MOV @R0,#0DBHINC R0MOV R2,#8HMOV R3,#00HSEND1: MOV A,@R1 /*温度值写入发送缓冲区*/MOV @R0,AADD A,@R0MOV R3,AINC R1INC R0DJNZ R2,SEND1MOV A,R3MOV @R0,AINC R0MOV @R0,#0EEHMOV R0,#80H /*发送缓冲区中数据*/MOV R4,#0BHSEND2:MOV SBUF,@R0SEND3:JNB TI,SEND3 /*查寻方式发送*/CLR TIINC R0DJNZ R4,SEND2POP PSWPOP ACCRET/*程序出错恢复子程序*/ERR: CLR EA /*关中断*/MOV DPTR,#ERR1 /*准备返回地址*/PUSH DPLPUSH DPHRETI /*清除高级中断激活标志*/ERR1: MOV 30H,#0AAH /*重建上电标志*/MOV 31H,#55HCLR APUSH ACC /*压入复位地址*/PUSH ACCRETI /*清除低级中断标志*/ORG 1FFAHNOPNOPNOPLJMP ERREND。