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

📄 ad.asm

📁 使用实验板上PORTD上的八个LED 表示数据采集输入端的电压值,电压值越大,显示的LED数越多,且按顺序递增.
💻 ASM
字号:
;程序名:  AD转化实验小程序(练习)
;创建人:  魏鸿林
;创建时间:2003/11/18
;修改人:  
;描  述:  使用实验板上PORTD上的八个LED 表示数据采集输入端的电压值,电压值越大,显示的LED数越多,且按顺序递增.  
;	  AD参考电压为单片机工作电源   
;	  光线越强,点亮的LED数越多


	LIST  P=16F877
	#INCLUDE<P16F877.INC>

;;;;;;;;;;;;;;;;;;;;;;;;;变量定义;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ADH		EQU 	20H	;保存AD转化高字节数据
ADL		EQU 	21H	;保存AD转化低字节数据

W_TEMP		EQU	22H	;中断暂存W
STATUS_TEMP	EQU	23H	;中断暂存STATUS
COUNT		EQU	24H	;记录中断次数

;;;;;;;;;;;;;;;;;;;;;;;;;程序体;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	ORG	00H
	NOP
	GOTO 	MAIN
	ORG	04H
	GOTO	INTSVR
	ORG	10
MAIN:
	LCALL	SYSCONFIG_FOR_PORT	;调用I/O口设置配置
	LCALL	SYSCONFIG_FOR_AD	;调用AD模块配置

	MOVLW	64			;初始化滤波参数
	MOVWF	COUNT			;64意味着对AD转化得到的连继的64个数据取平均值
	CLRF	ADL			;初始化AD转化数据的高低字节
	CLRF	ADH
LOOP_M					;等待中断
	NOP
	GOTO	LOOP_M

;;;;;;;;;;;;;;;;;;;;;;;中断服务程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INTSVR:
	BCF	INTCON,GIE
	MOVWF	W_TEMP
	SWAPF	STATUS,W
	MOVWF	STATUS_TEMP
	LCALL	ADSVR			;因为在本练习中只可能产生一种中断,,故不作判断,直接进入中断数据处理序
	SWAPF	STATUS_TEMP,W
	MOVWF	STATUS
	SWAPF	W_TEMP,F
	SWAPF	W_TEMP,W
	BSF	ADCON0,GO
	BSF	INTCON,GIE
	RETFIE

;AD转化模块配置
SYSCONFIG_FOR_AD:
	BCF	ADCON0,ADCS1	;选择时钟源的频率(一般是越快越好)
	BCF	ADCON0,ADCS0	
	BCF	ADCON0,CHS2	;通道选择(选择通道 2)
	BSF	ADCON0,CHS1	;(RA0是滑变输出端,RA1是温度传感器输出端,RA2是光传感器输出端)
	BCF	ADCON0,CHS0	;这里选用光传感器
	BSF	ADCON0,ADON	;打开AD模块

	BSF	STATUS,RP0
	MOVLW	80H		;AD转化的结果靠左存放,所有PORTA通道都设置为模拟信号通道
	MOVWF	ADCON1		;参考电压使用Vdd   Vss
	BCF	STATUS,RP0
	BCF	PIR1,ADIF	;清除AD中断标志位,,
	BSF	STATUS,RP0
	BSF	PIE1,ADIE	;AD中断使能打开
	BSF	INTCON,PEIE	;外围总中断使能打开
	BSF	INTCON,GIE	;总中断使能打开
	BCF	STATUS,RP0	
	BSF	ADCON0,GO	;发出转化指令(当转化完成时,会被硬件自动清零,在查询法中可用)
	RETURN

;I/O口配置
SYSCONFIG_FOR_PORT:
	BSF	STATUS,RP0	;在设置端口时注意选择BANK1
	CLRF	TRISD		;D口作为输出端口
	MOVLW	0FFH		;A口作为输出口
	MOVWF	TRISA
	BCF	STATUS,RP0
	RETURN


;;;;;;;;;;;;;;;;;;AD数据处理子程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ADSVR:
	BCF	PIR1,ADIF	;如果总是出现堆栈溢出,,,这里可能是原因之一哦,,,
	BSF	STATUS,RP0	;AD低字节保存在BANK1
	MOVF	ADRESL,0	;把AD转化结果 低位数据累加
	BCF	STATUS,RP0
	ADDWF	ADL,F
	BTFSC	STATUS,C	;如果有出现进位,向高字节加1
	INCF	ADH,F
	MOVF	ADRESH,0	;把AD转化结果 高位数据累加
	ADDWF	ADH,F		
	DECFSZ	COUNT		;这里使用了 软件平均值滤波
	GOTO	AD_EXIT		;在没有达到采样次数时,不把转化结果反映到LED输出
				;只是简单地进行数据堆积
	NOP
	;SWAPF	ADH,F		;AD转化结果数据处理 (这段代码具体解释,请见说明)
	RRF	ADH,F
	;RRF	ADH,F		
	MOVLW	B'00000111'
	ANDWF	ADH,F
	MOVF	ADH,0
	LCALL	TAB
	MOVWF	PORTD
				;存储区复原,准备下一次AD数据处理
	CLRF	ADH		
	CLRF	ADL
	MOVLW	64
	MOVWF	COUNT
AD_EXIT:
	RETURN	
	
;LED显示表
TAB:
	ADDWF	PCL,F
	;RETLW	00H
	RETLW	01H
	RETLW	03H
	RETLW	07H
	RETLW	0FH
	RETLW	1FH
	RETLW	3FH
	RETLW	7FH
	RETLW	0FFH
	RETLW	0FFH		;表中共有九行,,,多余的行,,,是为了防止程序跑到意料之外的地方去

	END

⌨️ 快捷键说明

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