PIC单片机AD转换汇编程序

发布者:HarmoniousVibes最新更新时间:2012-12-11 来源: 51hei关键字:PIC单片机  AD转换  汇编程序 手机看文章 扫描二维码
随时随地手机看文章

;此汇编程序实现A/D转换功能,应用于pic单片机上,A/D采用中断方式。该程序通过单片机的RA2模拟通道送入
;一直流电压,当送入的直流电压大于2.5V时,8个LED闪动,当直流电压恢复到2.5V以下
;时,LED停止闪动。为了防止干扰,本程序对直流电压采样10次后再作判断,中间的采样结
;果用间接寻址的方式存取。

LIST P=18F458
INCLUDE "P18F458.INC"

TIMES EQU 0X20
DEY EQU TIMES+1
ACCALO EQU TIMES+2 ;ACCA为双精度加数寄存器
ACCAHI EQU TIMES+3
ACCBLO EQU TIMES+4 ;ACCB为双精度加法的结果寄存器
ACCBHI EQU TIMES+5
FLAG EQU TIMES+6
DEYH EQU TIMES+7
DEYL EQU TIMES+9
BEGFSR EQU 0X30 ;间接寻址FSR的起始值(宏定义方式给出)

ORG 0X0000
GOTO MAIN
ORG 0X0008
GOTO INTSERVE ;转向中断服务子程序
ORG 0X30

;***双字节减法子程序,入口地址ACCB-ACCA,出口地址ACCB***
D_SUB
CALL NEG_A ;求ACCA的补码

;***双字节加法子程序,入口地址ACCB+ACCA,出口地址ACCB***
D_ADD
MOVF ACCALO,0 ;ACCB和ACCA低半字节相加
ADDWF ACCBLO
BTFSC STATUS,C ;有进位否?
INCF ACCBHI ;有,ACCB高字节加1,再加ACCAHI
MOVF ACCAHI,0 ;ACCA、ACCB高半字节相加
ADDWF ACCBHI
RETURN ;子程序返回

;************** ACCA取补子程序*****************
NEG_A
COMF ACCALO ;ACCALO取反加1
INCF ACCALO
BTFSC STATUS,Z ;低8位有进位吗?
DECF ACCAHI ;有,ACCAHI减1,再取反
COMF ACCAHI ;否则ACCAHI直接取反
RETURN ;子程序返回

;*********初始化子程序***************
INITIAL
CLRF INTCON ;禁止总中断和外围中断
MOVLW 0X51
MOVWF ADCON0 ;选择AD通道为RA2,且打开A/D转换器
;在工作状态,且使AD转换时钟为8Tosc
MOVLW 0X80
MOVWF ADCON1 ;转换结果右移,即ADRESH寄存器的高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 ;置RA5为输出方式,以输出锁存信号
BCF TRISC,5
BCF TRISC,3 ;设置SCK与SDO为输出方式
MOVLW 0XC0
MOVWF SSPSTAT ;设置SSPSTAT寄存器
MOVLW 0X30
MOVWF SSPCON1 ;设置SPI的控制方式,允许SSP方式,并
;且时钟下降沿发送,与"74HC595当其
;SCLK从低到高电平跳变时,串行输入数据
;(DI)移入寄存器"的特点相应
CLRF FLAG
RETURN[page]

;*********软件延时子程序****************
DELAY
MOVLW 0XFF
MOVWF DEYH
AGAIN1 MOVLW 0XFF
MOVWF DEYL
AGAIN2 NOP
DECFSZ DEYL
GOTO AGAIN2
DECFSZ DEYH
GOTO AGAIN1
RETURN

;*************** A/D中断服务子程序*****************
INTSERVE
BCF PIR1,ADIF ;清除A/D转换标志
MOVF ADRESH,W
MOVWF INDF0 ;读取并存储A/D转换结果的高两位
INCF FSR0L
MOVF ADRESL,W
MOVWF INDF0
INCF FSR0L ;读取并存储A/D转换结果的低8位
DECF TIMES,1 ;A/D转换次数减1
MOVLW 0X02
MOVWF DEY
LOOP13 DECFSZ DEY,1
GOTO LOOP13 ;给予一定的延时,保证两次A/D转换期间
;2Tad的间隔时间和电容的采样时间
BSF ADCON0,2 ;启动下一次A/D转换
RETFIE ;中断返回

;********** LED闪烁报警子程序*************
ALARM
MOVLW 0X01
XORWF FLAG,1
BTFSS FLAG,0
CALL DISPLAY0 ;调用显“0”子程序
NOP
BTFSC FLAG,0
CALL DISPDARK ;调用显“DARK”子程序
RETURN

;**********显全0子程序*************
DISPLAY0
TRANSMIT ;SPI发送显示子模块
CLRF PORTA ;LACK送低电平,为锁存做准备
MOVLW 0X08
MOVWF TIMES
LOOP80 MOVLW 0XC0 ;显示值为0,C0H为0的段码
MOVWF SSPBUF ;启动发送
WAIT
BTFSS PIR1,SSPIF
GOTO WAIT ;等待发送结束
BCF PIR1,SSPIF ;清除中断标志
DECFSZ TIMES
GOTO LOOP80 ;一次要发送完8个数据
BSF PORTA,5 ;最后给一个锁存信号,代表一次显示任务完成
RETURN

;**********显示全DARK子程序*************
DISPDARK
TRANSMIT1 ;SPI发送显示子模块
CLRF PORTA ;LACK送低电平,为锁存做准备
MOVLW 0X08
MOVWF TIMES
LOOP8D MOVLW 0XFF ;显示值为0,FFH为DARK的段码
MOVWF SSPBUF ;启动发送
WAIT1
BTFSS PIR1,SSPIF
GOTO WAIT1 ;等待发送结束
BCF PIR1,SSPIF ;清除中断标志
DECFSZ TIMES
GOTO LOOP8D ;一次要发送完8个数据
BSF PORTA,5 ;最后给一个锁存信号,代表一次显示任务完成
RETURN

;*********PIC单片机A/D转换汇编程序主程序************
;转载请保留文章原始出处http://www.51hei.com 单片机网
MAIN NOP
CALL INITIAL ;初始化
LOOP
MOVLW 0X80 ;转换结果右移,及ADRESH寄存器的高6位为"0"
;且把RA2口设置为模拟量输入式(注意后面要把
; RA5改成数据I/O方式,以输出显示琐存信号)
MOVWF ADCON1
MOVLW BEGFSR
MOVWF FSR0L ;给出间接寻址时FSR的初值
MOVLW 0X0A
MOVWF TIMES ;每一轮A/D连续采样10次
BSF INTCON,GIE ;总中断打开,及可以进行A/D转换中断
BSF ADCON0,2 ;启动A/D转换
LOOP1 MOVF TIMES,W
BTFSS STATUS,Z
GOTO LOOP1 ;等待A/D转换中断
BCF INTCON,GIE ;A/D转换次数到10次,关闭中断
NOP
CLRF ACCBHI
CLRF ACCBLO ;双精度加法的结果寄存器清0,为后面准备
MOVLW 0X0A
MOVWF TIMES
MOVLW BEGFSR
MOVWF FSR0L
LOOP15 MOVF INDF0,W
MOVWF ACCAHI
INCF FSR0L
MOVF INDF0,W
MOVWF ACCALO
INCF FSR0L
CALL D_ADD
DECFSZ TIMES
GOTO LOOP15
NOP ;计算得到10次A/D转换的和
MOVLW 0X84
MOVWF ADCON1 ;把RA5设成数字I/O,以输出显示锁存信号
MOVLW 0X14
MOVWF ACCAHI
CLRF ACCALO
CALL D_SUB ;通过双精度减判断模拟量是否达到报警限
;度(1400H=200H*0AH,200H与2.5V对应)
BTFSS ACCBHI,7
CALL ALARM ;若ACCBHI的最高位为1,则证明减法结
;果为负,即直流电压值超过2.5V,则报警
NOP
BTFSC ACCBHI,7
CALL DISPLAY0 ;若没有超过2.5V,则不报警,8个LED
;同时显示0
CALL DELAY ;软件延时,使电压检测不要过于频繁
GOTO LOOP ;重复检测输入的直流电压值
END

关键字:PIC单片机  AD转换  汇编程序 引用地址:PIC单片机AD转换汇编程序

上一篇:基于单片机的简易红外遥控密码锁设计与实现
下一篇:单片机驱动DS1302时间DS18B20温度12864液晶显示完整程序设计

推荐阅读最新更新时间:2024-03-16 13:14

基于PIC单片机的多种厨房设备智能组合控制设计
本文介绍了真空荧光屏显示器在多功能厨房控制系统中的软硬件设计方法。系统以PIC16F72单片机为主控制芯片,对外围传感器检测模块和按键扫描电路等采集信号进行处理,发送指令驱动继电器控制天然气灶、抽油烟机、消毒柜、烘干机等多种厨房设备进行工作。该系统采用真空荧光屏显示各种工作状态。具有漏气报警、按键童锁等功能。 随着智能家电控制技术的不断发展,具有多功能和智能化的厨房控制器成为厨房电器设备发展的主流。和传统单一厨房设备控制器相比,多功能厨房控制器具有占用空间小、成本低、功能多、便于设备统一管理,使用安全、方便等优点。 系统以PIC单片机作为主控制芯片,选用VFD(Vacuum Fluorescent Display)
[单片机]
基于<font color='red'>PIC单片机</font>的多种厨房设备智能组合控制设计
CAN接口汇编程序
CAN接口汇编程序 ORG 0000H LJMP MAIN ORG 0003H LJMP CANINT0 ORG 000BH LJMP T0-INTERRUPT ORG 0100H MAIN: MOV R0,#07FH CLR A MOV @R0,A DJNZ R0,$_1 MOV @R0,A MOV SP,#60H LCALL SJA1000_INIT0 LCALL DISPLAY_INIT LCALL T0INIT SETB PX0
[单片机]
pic单片机,链接描述文件(*.lkr)含义
结合18f4620.lkr来说明链接描述文件中代码的含义 // $Id: 18f4620.lkr,v 1.3 2004/04/26 18:09:00 curtiss Exp $ // File: 18f4620.lkr // Sample linker script for the PIC18F4620 processor //将当前目录library/object搜索路径,.代表当前目录 LIBPATH . //FILES伪指令指定链接的目标或库文件 //注:可以在一个单独的 FILES 伪指令中指定多个目标或库文件。 FILES c018i.o FILES clib.lib FILES p18f4620.l
[单片机]
PIC单片机-利用Timer2定时器的溢出中断实现动态扫描数码管
编写程序,令数码管的显示顺序为:0123,1230,2301,3012。 数码管显示分静态扫描和动态扫描,动态扫描显示一般分两种方式 1、选用一个数码管位,写断码显示,延时一定的时间,关闭显示,选择下一位,依次类推,完成数码管的多位扫描显示,这种方式比较耗CPU资源。 2、利用定时器,每隔一个固定的时间去选通,写断码,这种方式可以降低CPU的占用时间,同时,每个数码管显示时间固定,不存在“抖”的现象。 本程序中使用第二种方式,利用Timer2定时器的溢出中断实现动态扫描,Timer2包含一个周期控制寄存器,可以自动控制溢出周期。周期控制寄存器PR2的存在使得TIMER2的计数值有一个可以自由设定的上限。当TIMER
[单片机]
汇编程序模块化设计
单片机程序设计虽然小,可能很多人并不去注意项目开发的一些方法,方案拿到手就开始写,然后是想到什么地方,就写到什么地方,思绪凌乱,要将项目按时完成倒是没有问题,但是如果说后期的维护,修改等,就是噩梦了,更不用说让别人来维护代码了,因为自己看起来都吃力。 单片机程序很容易写,但是怎么写的好确实需要经验积累,技巧的积累。很多时就是一个新手和一个老手的区别所在。好的单片机程序要做到以下几点: C语言的话还是有些书去介绍怎么设计程序,但是汇编的书籍除了介绍指令集,根本没有去介绍汇编程序的一些设计思想,小技巧等。掌握一些技巧后,发现学习汇编其实并不难。 可能学C语言的时候接触过模块化的概念,其实汇编也需要模块化。代码应该是一个 bl
[单片机]
PIC单片机C语言程序设计(2)
  五、C语言的标识符和关键字   一个完整的PIC单片机C语言程序,通常由包含文件(即头文件1,变量定义、变量说明、函数定义、函数体和注释等六部分等组成。   1.C语言的标识符   所谓标识符,实际上是一些由程序编写者自定义的名称,类似于PIC单片机汇编语言中给寄存器(RAM)的命名。C语言中所用到的变量名、函数名、数组名、文件名等都是由标识符组成的。   标识符是由一串字母(常指英语字母)、数字和下线符(或称下划线)组成的字符串。标识符的第一个字符必须是字母或下线符。按照惯例,以下线符开头的标识符是系统程序专用的,程序员最好不用。程序员可将下线符作为分段符使用,如SUM_1。   同一字母的大小写被视为不同的标识符
[单片机]
<font color='red'>PIC单片机</font>C语言程序设计(2)
锂离子电池智能充电器硬件的设计(图)
  锂离子电池具有较高的能量重量和能量体积比,无记忆效应,可重复充电次数多,使用寿命长,价格也越来越低。一个良好的充电器可使电池具有较长的寿命。利用C8051F310单片机设计的智能充电器,具有较高的测量精度,可很好的控制充电电流的大小,适时的调整,并可根据充电的状态判断充电的时间,及时终止充电,以避免电池的过充。   本文讨论使用C8051F310器件设计锂离子电池充电器的。利用PWM脉宽调制产生可用软件控制的充电电源,以适应不同阶段的充电电流的要求。温度传感器对电池温度进行监测,并通过AD转换和相关计算检测电池充电电压和电流,以判断电池到达哪个阶段。使电池具有更长的使用寿命,更有效的充电方法。    设计过程    1
[电源管理]
锂离子电池智能充电器硬件的设计(图)
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved