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

📄 adc.asm

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


;***********************主程序***********************
MAIN
  MOVLW     30H
  MOVWF     FSR             ;转换结果存放起始地址,文件选择寄存器f4-(FSR),(可直接寻址或间接寻址)         
LOOP
  BSF       STATUS,RP0      ;选择体1,   STATUS--RP2,RP1,RP0,T0, PD,Z,DC,C     RP1,RP0: 01
  MOVLW     07H             ;A口高3位为输出,低3位输入 00 0111
  MOVWF     TRISA           ;A口,共6位I/0口
  CLRF      TRISD           ;D口设8位,为输出
  MOVLW     8EH
  MOVWF     ADCON1          ;结果右对齐,只选择RA0做ADC口,其余做普通数字口  1000 1110
                            ;TRISA,TRISD,ADCON1, 在体1中.
  BCF       STATUS,RP0      ;回体0
  MOVLW     41H
  MOVWF     ADCON0          ;选择时钟源为fosc/8,起用ADC,  0100 0001   ADCON0, 在体0中
; CALL      DELAY           ;调用延时程序,保证足够的采样时间
  BSF       ADCON0,GO       ;启动ADC转换
WAIT
  BTFSS     PIR1,ADIF       ;转换是否完成(中断方式)
  GOTO      WAIT            ;等待转换的完成
  BSF       STATUS,RP0      ;选择体1
  MOVFW     ADRESL          ;读取转换的结果送入W
  BCF       STATUS,RP0      ;回体0
  MOVWF     INDF            ;保存到临时寄存器30H中. (f0=INDF间接寻址)
  INCF      FSR,1
  BTFSS     FSR,2           ;连续转换4次,求平均值,(bit2=0000 0100)  ;位=1跳过下一行 
  GOTO      LOOP
  CALL      CHANGE          ;调用结果转换程序
  CALL      DISPLAY         ;调用显示程序
  GOTO      MAIN            ;循环工作

;************************转换程序*********************
;入口参数:30H---33H
;出口参数:BAI,SHI,GE
CHANGE
  CLRF      2AH
  CLRF      BAI
  CLRF      SHI
  CLRF      GE              ;先清除结果寄存器
  MOVFW     31H             ;以下8条指令求4次转换结果的平均值
  ADDWF     30H,1           ;(31H)+(30H)--(30H)  d=1存入f,d=0存入w
  BTFSC     STATUS,C        ;位=0跳过下一行
  INCF      2AH
  MOVFW     32H
  ADDWF     30H,1
  BTFSC     STATUS,C
  INCF      2AH,1
  MOVFW     33H
  ADDWF     30H,1           ;(33H)+(32H)+(31H)+(30H)--(30H)  d=1存入f
  BTFSC     STATUS,C
  INCF      2AH,1

  RRF       2AH,1           ;除以2,结果送入2AH
  RRF       30H,1           ;除以2,结果送入30H
  RRF       2AH,0           ;=除以4,结果送入W.
  RRF       30H,0           ;=除以4,结果送入W.
  MOVWF     TEMP            ;4次转换结果的平均值送入 TEMP 











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












;***********************查表程序*********************
;入口参数:W
;出口参数:W
TABLE
  ADDWF       PCL,1         ;指令寄存器加上偏移地址  (偏移地址W)+PCL--PCL,   d=1存入PCL, 
  RETLW       0C0H          ;0的编码(公阳极数码管) K--W                            
  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



  MOVLW     64H	            ;减100,结果保留在W中
  SUBWF     TEMP,0          ;TEMP-100 --W
  BTFSS     STATUS,C        ;判断是否大于100  ;位=1跳过下一行====(原程序) 
                      ;BTFSC    STATUS,C        ;判断是否大于100  ;位=0跳过下一行====(应改为)
  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  ====(原程序) 
                      ;BTFSC    STATUS,C        ;判断是否大于10  ;位=0跳过下一行====(应改为)  
  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              ;显示百位  BAI送入W(偏移地址)
  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 

⌨️ 快捷键说明

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