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

📄 adc.asm

📁 选择RAO做为模拟输入通道; 连续转换4次再求平均值做为转换结果 最后结构只取低8位 结果送数码管的低3位显示 硬件要求:拨码开关S14第2位置ON
💻 ASM
字号:
;实验目的:熟悉A/D转换
;软件思路:选择RAO做为模拟输入通道;
;          连续转换4次再求平均值做为转换结果
;          最后结构只取低8位
;          结果送数码管的低3位显示
;硬件要求:拨码开关S14第2位置ON,第1位置OFF
;          拨码开关S6全部置ON,S5第4-6位置ON,第1-3位置OFF
;          为不影响结果,其他拨码开关置OFF。
#INCLUDE<P16F877a.INC>      ;包含芯片头文件
__CONFIG _DEBUG_OFF&_CP_ALL&_WRT_HALF&_CPD_ON&_LVP_OFF&_BODEN_OFF&_PWRTE_ON&_WDT_OFF&_HS_OSC
;*********************寄存器定义*********************
TEMP       EQU    20H      ;临时寄存器
BAI        EQU    21H      ;转换结果的百位
SHI        EQU    22H      ;转换结果的十位
GE         EQU    23H      ;转换结果的个位
;****************************************************
  ORG       00H             ;复位入口地址
  NOP                       ;ICD需要的空指令
  GOTO      MAIN            ;跳转到主程序入口
  ORG       04H             ;中断入口地址
  RETFIE                    ;放置一条中断返回指令,防止以外中断发生

;***********************查表程序*********************
;入口参数:W
;出口参数:W
TABLE
  ADDWF       PCL,1         ;指令寄存器加上偏移地址   
  RETLW       0C0H          ;0的编码(公阳极数码管)                             
  RETLW       0F9H          ;1的编码
  RETLW       0A4H          ;2的编码
  RETLW       0B0H          ;3的编码
  RETLW       99H           ;4的编码
  RETLW       92H           ;5的编码
  RETLW       082H 	        ;6
  RETLW       0F8H 	        ;7
  RETLW       080H 	        ;8
  RETLW       090H 	        ;9

;***********************主程序***********************
MAIN
  MOVLW     30H
  MOVWF     FSR             ;转换结果存放起始地址          
LOOP
  BSF       STATUS,RP0      ;选择体1
  MOVLW     7H              ;A口高3位为输出,低3位输入
  MOVWF     TRISA
  CLRF      TRISD           ;D口设为输出
  MOVLW     8EH
  MOVWF     ADCON1          ;结果左对齐,只选择RA0做ADC口,其余做普通数字口
  BCF       STATUS,RP0      ;回体0
  MOVLW     41H
  MOVWF     ADCON0          ;选择时钟源为fosc/8,允许ADC工作
  CALL      DELAY           ;调用延时程序,保证足够的采样时间
  BSF       ADCON0,GO       ;启动ADC转换
WAIT
  BTFSS     PIR1,ADIF       ;转换是否完成
  GOTO      WAIT            ;等待转换的完成
  BSF       STATUS,RP0
  MOVFW     ADRESL          ;读取转换的结果
  BCF       STATUS,RP0
  MOVWF     INDF            ;保存到临时寄存器里
  INCF      FSR,1
  BTFSS     FSR,2           ;连续转换4次,求平均值
  GOTO      LOOP
  CALL      CHANGE          ;调用结果转换程序
  CALL      DISPLAY         ;调用显示程序
  GOTO      MAIN            ;循环工作

;************************转换程序*********************
;入口参数:30H---33H
;出口参数:BAI,SHI,GE
CHANGE
  CLRF      BAI
  CLRF      SHI
  CLRF      GE              ;先清除结果寄存器
  MOVFW     31H             ;以下8条指令求4次转换结果的平均值
  ADDWF     30H,1
  MOVFW     32H
  ADDWF     30H,1
  MOVFW     33H
  ADDWF     30H,1
  RRF       30H,1
  RRF       30H,0           
  MOVWF     TEMP
  MOVLW     64H	            ;减100,结果保留在W中
  SUBWF     TEMP,0
  BTFSS     STATUS,C        ;判断是否大于100
  GOTO      SHI_VAL         ;否,转求十位结果
  MOVWF     TEMP            ;是,差送回TEMP中
  INCF      BAI,1           ;百位加1
  GOTO      $-6             ;返回继续求百位的值
SHI_VAL
  MOVLW     0AH             ;减10,结果保留在W中
  SUBWF     TEMP,0          
  BTFSS     STATUS,C        ;判断是否大于10
  GOTO      GE_VAL          ;否,转去判断个位结果
  MOVWF     TEMP            ;是,差送回TEMP中
  INCF      SHI,1           ;十位值加1
  GOTO      $-6             ;转会继续求十位的值
GE_VAL
  MOVFW     TEMP
  MOVWF     GE              ;个位的值
  RETURN

;**************************显示程序********************
;入口参数:BAI,SHI,GE
;出口参数:无
DISPLAY
  MOVFW    BAI              ;显示百位
  CALL     TABLE
  MOVWF    PORTD
  BCF      PORTA,3
  CALL     DELAY
  CALL     DELAY
  BSF      PORTA,3
  MOVFW    SHI              ;显示十位
  CALL     TABLE
  MOVWF    PORTD
  BCF      PORTA,4
  CALL     DELAY
  CALL     DELAY
  BSF      PORTA,4
  MOVFW    GE               ;显示个位
  CALL     TABLE
  MOVWF    PORTD
  BCF      PORTA,5
  CALL     DELAY
  CALL     DELAY
  BSF      PORTA,5
  RETURN
 
;***************************延时程序***********************
;入口参数:无
;出口参数:无
DELAY
  MOVLW    5FH
  MOVWF    TEMP
  DECFSZ   TEMP,1
  GOTO     $-1
  RETURN

;*********************************************************
  END                        ;程序结束

⌨️ 快捷键说明

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