1、间接寻址FSR的起始值(宏定义方式给出)0RG 0X0000GOTO NfAIXORG 0X0008GOTO INTSERVE ;转向中断服务子程序*双字节减法子程序,入口地址ACCB-ACCA,出口地址ACCB* D_SUBCALL NEG_A ;求人“人的补码*衬双字节加法子程序,入口地址ACCB+ACCA,出口地址ACCB* D_ADDMOVF ACCALO, 0 ;ACCB和ACCA低半字节相加ADDWF ACCBLOBTFSC STATUS, C ;有进位否?INCF ACCBHI ;有,ACCB 高字节加I 1,再加 ACCAHIMOVF ACCAHI, 0 ;ACCA、ACCB
2、高半字节相加ADDWF ACCBHIRETURN ;子程序返回f*NEG_ACOMF ACCALO ;ACCALO 取反加 1INCF ACCALOBTFSC STATUS, Z ;低8位有进位吗?DECF ACCAHI ;有,ACCAHI 减 1,再取反COMF ACCAHI ;否则ACCAHI直接取反;* *初女台化子程序* * *CLRF INTCON ;禁止总中断和外围中断MOVLW 0X51MOVWF ADCONO ;选择AD通道为RA2,且打开A/D转换器;在工作状态,且使AD 转换时钟为SToscMOVLW 0X80MOVWF ADC0N1 ;转换结果右移,即ADRESH寄存器的
3、高6 ;位为0,且把RA2口设置为模拟量输入式(注意后面要把RA5改成数据I/O方式,以输出显示琐存信号)BCF PIR1, ADIF ;清除A/D转换标志BSF PIE1,ADIE ;A/D转换中断允许BSF INTCON, PEIE ;外围中断允许BSF IPR1,ADIP ;B 口变位中断高优先级BSF RCON, 7 ;使能中断优先级BSF TRISA, 2 ;设置RA2为输入方式BCF TRISA, 5 ;置RA3为输出方式,以输出锁存信号BCF TRISC,5BCF TRISC, 3 ;设置SCK与SDO为输出方式MOVLW OXCOMOVWF SSPSTAT ;设置 SSPSTA
4、T 寄存器MOVLW 0X30MOVWF SSPCON1 ;设置SPI的控制方式,允许SSP方式,并;且时钟下降沿发送, 与74HC595当其SCLK从低到高电平跳变时,串行输入数据(DI)移入寄存器的特点相应CLRF FLAGRETURN* * 软件延时子程序 * *DELAYMOVLW OXFFMOVWF DEYHAGAIN1 MOVLW OXFFMOVWF DEYLAGAIX2 NOPDECFSZ DEYLGOTO AGAIN2DECFSZ DEYHGOTO AGAIN1* a/D 中断服务子程序* INTSERVEBCF PIR1,ADIF ;MOVF ADRESH,WMOVWF IN
5、DFO ;读取并存储A/D转换结果的高两位INCF FSROLMOVF ADRESL,WMOVWF INDFOINCF FSROL ;读取并存储A/D转换结果的低8位DECF TIMES, 1 ;A/D 转换次数减 1MOVLW 0X02MOVWF DEYLOOP13 DECFSZ DEY,1GOTO L00P13 ;给予一定的延时,保证两次A/D转换期间;2Tad的间隔时间和电容的采样时间BSF ADCONO, 2 ;启动下一次A/D转换RETFIE ;中断返回* led 闪烁报警子程序*ALARMMOVLW 0X01XORWF FLAG,1BTFSS FLAG,0CALL DISPLAYO
6、 ;调用显“0”子程序NOPBTFSC FLAG,0CALL DISPDARK ;调用显 “DARK” 子程序*显全 o F程序*DISPLAYOTRANSMIT ;SPI发送显示子模块CLRF PORTA ;LACK送低电平,为锁存做准备MOVLW 0X08MOVWF TIMESL00P80 MOVLW OXCO ;显示值为0, COH为0的段码MOVWF SSPBUF ;启动发送WAITBTFSS PIR1,SSPIFGOTO WAIT ;等待发送结束BCF PIR1,SSPIF ;清除中断标志DECFSZ TIMESGOTO L00P80 ;一次要发送完8个数据BSF PORTA, 5
7、;最后给一个锁存信号,代表一次显示任务完成RETURN* 显示全 DARK程序 *DISPDARKTRANSMIT1 ;LACK送低电平,为锁存做准备L00P8D MOVLW OXFF ;显示值为 0, FFH 为 DARK 的段码 MOVWF SSPBUF ;启动发WAIT1GOTO WAIT1 ;GOTO L00P8D ; 一次要发送完8个数据*PIC单片机A/D转换汇编程序主程丿了;*转载www. olhei. com单片机网MAIN NOPCALL INITIAL ;初始化LOOPMOVLW 0X80 ;转换结果右移,及ADRESH寄存器的高6位为0且把RA2 口设 置为模拟量输入式(
8、注意后面要把RA5改成数据I/O方式,以输出显示琐存信号)MOVWF ADC0N1MOVLW BEGFSRMOVWF FSROL ;给出间接寻址时FSR的初值MOVWF TIMES ;每一轮A/D连续采样10次BSF IXTCON, GIE ;总中断打开,及可以进行A/D转换中断BSF ADC0N0, 2 ;启 动A/D转换L00P1 MOVF TIMES,WBTFSS STATUS,ZGOTO L00P1 ;等待A/D转换中断BCF INTCON, GIE ;A/D转换次数到10次,关闭中断NOPCLRF ACCBHICLRF ACCBLO ;双精度加法的结果寄存器清0,为后面准备MOVLW
9、 OXOAMOVWF FSROLLOOP15 MOVF INDFO, WMOVWF ACCAHIMOVF INDFO, WMOVWF ACCALOCALL D_ADDGOTO LOOP15NOP ;计算得到10次A/D转换的和MOVLW 0X84把RA3设成数字I/O,以输出显示锁存信号MOVLW 0X14CLRF ACCALOCALL D_SUB ;通过双精度减判断模拟量是否达到报警限度(1400H=200H*0AH, 200H 与 2. 5V 对应)BTFSS ACCBHI,7CALL ALARM ;若ACCBHI的最高位为1,则证明减法结果为负,即直流电压值超过2. 5V,则报警BTFSC ACCBHI,7若没有超过2. 5V,则不报警,8个LED同时显示0CALL DELAY ;软件延时,使电压检测不要过于频繁GOTO LOOP ;重复检测输入的直流电压值END
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1