⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 temp_dis.asm

📁 基于PIC 8位机的智能温控仪
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;******************************************************************
;《智能温度显示仪》程序清单                                
;程序文件名为: TEMP_DIS.ASM
;******************************************************************
;==============================寄存器定义===================================
STATUS      EQU 	03H			;定义状态寄存器地址
PORTA       EQU 	05H			;定义端口RA的数据寄存器地址
PORTB       EQU	 	06H			;定义端口RB的数据寄存器地址
PORTC       EQU 	07H 		;定义端口RC的数据寄存器地址
TRISA       EQU 	85H			;定义端口RA的方向控制寄存器地址
TRISB       EQU 	86H			;定义端口RB的方向控制寄存器地址
TRISC       EQU 	87H			;定义端口RC的方向控制寄存器地址
OPTION_REG  EQU 	80H			;定义选项寄存器地址
INTCON      EQU 	0BH			;定义中断控制寄存器地址
TMR0        EQU 	01H			;定义TMR0寄存器地址
PIR1        EQU 	0CH			;定义第一外设中断标志寄存器地址
ADRESH      EQU 	1EH			;定义ADC结果寄存器高字节地址
ADCON0      EQU 	1FH         ;定义ADC控制寄存器0地址
ADCON1      EQU 	9FH			;定义ADC控制寄存器1地址
T1CON       EQU 	10H			;定义TMR1控制寄存器地址
TMR1L       EQU 	0EH      	;定义TMR1低字节地址
TMR1H       EQU 	0FH			;定义TMR1高字节地址
;==============================变量声明=======================================
ADR         EQU 	20H  		;存放标度变换结果
ADR_deci    EQU 	21H  		;存放标度变换小数部分进位
ADR_int     EQU 	22H  		;存放标度变换整数部分
TEMP1       EQU 	23H  		;暂存寄存器1
TEMP2       EQU 	24H  		;暂存寄存器2
BCD_count   EQU 	25H  		;存放BCD码转换计数
DISP_count  EQU 	26H  		;数码管显示移位计数
TMR1_count  EQU 	27H  		;15秒中断外循环计数值
MAX         EQU 	28H  		;报警上限值
MIN         EQU 	29H  		;报警下限值
MAX?_temp    EQU     30H         ;报警上限值暂存寄存器
MIN_temp    EQU     31H         ;报警下限值暂存寄存器
DISP_dig    EQU 	32H  		;显示"位"寄存器
DISP_seg    EQU 	33H  		;显示"段"寄存器
;==============================常量声明=======================================
TMR1LB      EQU 	0DCH 		;定义TMR1低字节寄存器初始值 (定时500毫秒)
TMR1HB      EQU 	0BH  		;定义TMR1高字节寄存器初始值
;****************************复位矢量和中断矢量**************************            
 				ORG     000H
 				NOP
 				GOTO    MAIN
 				ORG     004H
;*****************************TMR1中断服务程序***************************
TMR1_int 	BCF   		PIR1,0          ;清中断溢出标志位
 				BCF   		T1CON,0         ;关闭TMR1定时器
 				MOVLW 		TMR1LB      	;500ms定时初值
 				MOVWF 		TMR1L
 				MOVLW 		TMR1HB
 				MOVWF 		TMR1H
 				DECFSZ  	TMR1_count,1    ;外循环数减到零?
 				RETFIE                      ;否,中断返回
 				GOTO 		AGAIN           ;是,转至正常显示
;******************************主程序************************************
MAIN 		CALL        INITIAL   	    ;调用初始化子程序
AGAIN 		BTFSC 		PORTB,0        	;K1键是否按下
 				GOTO  		NEXT1        	;否,转检测K2
 				CALL  		DELAY10         ;调10ms延时子程序,消除抖动影响
BTFSC 		PORTB,0         ;再次检测K1键是否按下
 		        GOTO        NEXT1           ;否,转检测K2
 				CALL  		Change_Max      ;是,调上限修改子程序 
NEXT1  		BTFSC  		PORTB,1   	    ;K2键是否按下
 				GOTO        NEXT2           ;否,转采样子程序
 				CALL        DELAY10         ;是,调10ms延时子程序,消除抖动影响
 		    BTFSC 		PORTB,1         ;再次检测K2键是否按下
				GOTO        NEXT2           ;否,转采样子程序
CALL  		Change_Min      ;是,调下限修改子程序
NEXT2  		CALL 		AD_trans        ;调采样转换子程序
 ;========================判断温度是否为100℃================================
 				MOVF  		ADR,0
 				SUBLW 		0FEH
 				BTFSC 		STATUS,0        ;采样结果大于0FEH(对应100℃)?
 				CALL  		BCD_trans       ;否,调标度转换子程序
 				BSF   		PORTA,3         ;是,点亮上限报警灯
 				MOVLW 		01H 
 				MOVWF 		DISP_dig        ;数码管第一位显示
 				MOVLW 		00H
 				MOVWF 		DISP_seg        ;数码管第一位显示数值
 				CALL  		Display         ;调显示子程序显示这一位(个位)
 				MOVLW 		02H 
 				MOVWF 		DISP_dig       
 				MOVLW 		00H
 				MOVWF 		DISP_seg       
 				CALL  		Display         ;显示十位
 				MOVLW 		03H 
 				MOVWF 		DISP_dig 
 				MOVLW 		01H
 				MOVWF 		DISP_seg 
 				CALL  	 	Display         ;显示百位
 				MOVLW 		04H 
 				MOVWF 		DISP_dig 
 				MOVLW 		00H
 				MOVWF 		DISP_seg 
 				CALL  		Display         ;显示最高位
 ;==========================上下限报警及数据显示==========================
 				MOVF  		MAX,0          
 				SUBWF 		ADR,0           ;采样结果是否大于上限值
 				BTFSS 		STATUS,0
 				GOTO  		NEXT3           ;否;转NEXT2       
 				BSF   		PORTA,3         ;是;点亮上限报警灯
 				GOTO  		NEXT5
NEXT3  		MOVF 		ADR,0
 				SUBWF 		MIN,0           ;采样结果是否低于下限值
 				BTFSS 		STATUS,0
 				GOTO  		NEXT4           ;否,转NEXT3
 				BSF   		PORTA,5         ;是,点亮下限报警灯
 				GOTO  		NEXT5
				NEXT4  		BCF PORTA,3     ;熄灭上限报警灯
 				BCF   		PORTA,5         ;熄灭下限报警灯
NEXT5  		MOVLW 		01H
 				MOVWF 		DISP_dig        ;显示个位
 				MOVF  		ADR,0
 				ANDLW 		0FH             ;显示ADR中低四位值(BCD码的个位值)
 				MOVWF 		DISP_seg
				CALL  		Display
 				SWAPF 		ADR,0           ;交换ADR的高四位和低四位值
 				ANDLW 		0FH
 				MOVWF 		DISP_seg        ;显示ADR中高四位值(BCD码的十位值)
 				MOVLW 		02H
 				MOVWF		DISP_dig 
 				CALL  		Display			;显示十位
 				MOVLW 		03H 
 				MOVWF 		DISP_dig  
 				MOVLW 		00H
				MOVWF 		DISP_seg 
				CALL  		Display         ;显示百位
 				MOVLW 		04H 
 			MOVWF 		DISP_dig 
 				MOVLW 		00H
 				MOVWF 		DISP_seg 
				CALL  		Display         ;显示最高位 
 				CALL  		DELAY30			;延时
 				CALL  		DELAY30
 				CALL  		DELAY30
 				GOTO  		AGAIN
;******************************延时10ms子程序***************************
DELAY10     BCF 		INTCON,2        ;TMR0溢出标志位清零
				MOVLW 		0B2H
 				MOVWF 		TMR0            ;装入初值,启动计时
L1 				BTFSS 		INTCON,2        ;定时溢出?
 				GOTO 		L1              ;否,循环检测标志位
 				RETURN                      ;是,返回
;*******************************延时30ms子程序**************************
DELAY30		BCF 		INTCON,2        ;TMR0溢出标志位清零
 				MOVLW 		16H 
 				MOVWF 		TMR0            ;赋初值,启动计时
L2 				BTFSS 		INTCON,2        ;检测溢出标志位
 				GOTO 		L2
 				RETURN
;*******************************初始化子程序******************************
INITIAL    
;=============================输入输出口初始化============================
 BSF   		STATUS,5
 				MOVLW 		01H
 				MOVWF 		TRISA           ;置RA0输入,RA4、RA5输出
 				MOVLW 		17H
 				MOVWF 		TRISB           ;置RB输入方式
 				MOVLW 		00H
 				MOVWF 		TRISC           ;置RC输出方式
 				MOVLW 		07H
 				MOVWF 		OPTION_REG      ;TMR0初始化,预设分频比1:256
 ;==============================TMR1初始化==============================
 				BSF 		PIR1,0         	;开放TMR1中断使能位
 				BCF 		STATUS,5
 				MOVLW 		34H          	;设置分频比为1:8
 				MOVWF 		T1CON
 				MOVLW 		0C0H         	;开放总中断和外设中断使能位
 				MOVWF 		INTCON  
 				MOVLW 		TMR1LB       	;TMR1低字节赋初值
 				MOVWF 		TMR1L
 				MOVLW 		TMR1HB       	;TMR1高字节赋初值
 				MOVWF 		TMR1H
 				MOVLW 		1EH          	;TMR1中断"30"次则自动跳出上下限值修改
 				MOVWF 		TMR1_count
 				MOVLW 		60H          	;报警上限赋初值
 				MOVWF 		MAX 
 				MOVLW 		20H          	;报警下限赋初值
 				MOVWF 		MIN
;===============================7219初始化================================
	MOVLW 		0CH 
 				MOVWF 		DISP_dig 		;选中寄存器"SHUTDOWN",其地址为0CH
 				MOVLW 		01H
 				MOVWF 		DISP_seg        ;寄存器"SHUTDOWN"赋初值
 				CALL  		Display         ;设为正常显示状态
 				MOVLW 		0FH
 				MOVWF 		DISP_dig		;选中寄存器"DISPLAY TEST",其地址为0FH
 				MOVLW 		00H
 				MOVWF 		DISP_seg		;寄存器"DISPLAY TEST"赋初值
 				CALL  		Display         ;设为正常显示状态
 				MOVLW 		0BH
 				MOVWF 		DISP_dig		;选中寄存器"SCAN LIMIT",其地址为0BH
 				MOVLW 		03H
 				MOVWF 		DISP_seg		;寄存器"SCAN LIMIT"赋初值
 				CALL  		Display         ;点亮0-3四个数码管
 				MOVLW 		09H
 				MOVWF 		DISP_dig		;选中寄存器"DECODE MODE",其地址为09H
 				MOVLW 		0FFH
 				MOVWF 		DISP_seg		;寄存器"DECODE MODE"赋初值
 				CALL  		Display         ;选B码译码方式
 				MOVLW 		0AH
 				MOVWF 		DISP_dig		;选中寄存器"INTENSITY",其地址为0AH
 				MOVLW 		0FH
 				MOVWF 		DISP_seg		;寄存器"INTENSITY"赋初值
 				CALL  		Display         ;显示亮度选择最亮
            RETURN
;***************************A/D转换子程序************************************
AD_trans	BSF   		STATUS,5       
 				MOVLW 		0EH
 				MOVWF 		ADCON1          ;设RA0为模拟输入,采样结果左对齐
 				BCF   		STATUS,5
 				MOVLW 		41H
 				    MOVWF 	    ADCON0          ;选择A/D转换时钟,选择采样通道0,开
	;采样允许位
 				BSF   		ADCON0,2        ;采样开始
LOOP_AD 	NOP 
				BTFSC 		ADCON0,2        ;采样结束?
 				GOTO  		LOOP_AD         ;否,转LOOP_AD
 				MOVF  		ADRESH,0        ;是,读取采样结果
 				MOVWF 		ADR      		
 				RETURN
;***************************标度变换转换子程序*******************************
BCD_trans  
;===========================小数进位部分处理=================================
 				MOVF  		ADR,0
 				MOVWF 		TEMP1
 				MOVWF 		TEMP2
 				RLF   		TEMP1,1
 				RLF   		TEMP1,1
 				RLF   		TEMP1,1
 				MOVF  		TEMP1,0
 				MOVWF 		TEMP2           ;采样结果左移3位送TEMP2
 				RLF   		TEMP1,1         ;采样结果左移4位送TEMP1
 				MOVLW 		30H
 				ANDWF 		TEMP1,1   	    ;左移4位结果屏蔽高2位和低4位
 				MOVLW 		38H
 				ANDWF 		TEMP2,1   	    ;左移3位结果屏蔽高2位和低3位
 				MOVF  		TEMP2,0
 				ADDWF 		TEMP1,1
 				MOVF  		ADR,0
 				MOVWF 		TEMP2
 				MOVLW 		3FH        
 				ANDWF 		TEMP2,1   		;采样结果屏蔽高2位
 				MOVF  		TEMP2,0
 				ADDWF 		TEMP1,0
 				MOVWF 		ADR_deci
;=============================整数部分处理===============================
 				MOVF  		ADR,0
 				MOVWF 		TEMP1
 				MOVWF 		TEMP2
 				RRF   		TEMP1,1
 				RRF   		TEMP1,1   		;采样结果右移2位送TEMP1
 				MOVLW 		3FH 
 				ANDWF 		TEMP1,1  		;屏蔽高2位
 				RRF   		TEMP2,1
 				RRF   		TEMP2,1
 				RRF   		TEMP2,1   		;采样结果右移3位送TEMP2
 				MOVLW 		1FH 
 				ANDWF 		TEMP2,1   		;屏蔽高3位
 				MOVF  		TEMP2,0
 				ADDWF 		TEMP1,1
 				MOVF  		ADR,0
 				MOVWF 		TEMP2

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -