×
嵌入式 > 技术百科 > 详情

合泰单片机ADC转换程序

发布时间:2020-06-15 发布时间:
|
;内容:旋转变阻器改变AD转换的数通过4为LED显示出来

;数码管段码接法A-PD0,B-PD1....G-PD6,H-PD7
;数码管位码接法OM0-PC0...COM4-PC3
;完整源码下载:http://www.51hei.com/f/htadzh.rar
;;AD输入脚-PA0
include HT66F50.inc

ORG 0000H
JMP A1
ORG 0014H ;多功能中断入口地址
JMP ZD1
ORG 1CH  ;ADC中断入口地址
JMP ISR_ADC
ORG 0030H
Q1:
DC 03FH ; 0
DC 006H ; 1
DC 05BH ; 2
DC 04FH ; 3
DC 066H ; 4
DC 06DH ; 5
DC 07DH ; 6
DC 007H ; 7
DC 07FH ; 8
DC 06FH ; 9
DC 077H ; A
DC 07CH ; B
DC 039H ; C
DC 05EH ; D
DC 079H ; E
DC 071H ; F 
A1: 
CLR [98H] ;AD数据高8位存储器
CLR [99H] ;AD数据低8位存储器

MOV A,0 ;显示内容
MOV [8AH],A ;第一位数码管段码显示内容寄存器
MOV A,0 ;显示内容
MOV [8BH],A ;第二位数码管段码显示内容寄存器
MOV A,0 ;显示内容
MOV [8CH],A ;第三位数码管段码显示内容寄存器
MOV A,0 ;显示内容
MOV [8DH],A ;第四位数码管显示内容寄存器 
MOV A,08H ;跟CP1C寄存器设置要求选择数据
MOV CP1C,A ;设置PC口为I/0口而不是中断口
CLR PBC ;设置pc 口为输出口
CLR PDC ;设置PD 口为输出口
MOV A,1 ;设置初始显示位码显示第一位
MOV [80H],A ;位码寄存器
MOV A,8AH ;设置对应第一位段码寄存器
MOV MP0,A ;间接寄存器指针
MOV A,00000000B ;设置TM2 计数时钟位为fSYS/4
MOV TM2C0,A
MOV A,11000001B ;设置TM2中断为定时/计数模式选择比较器A匹配
MOV TM2C1,A
MOV A,LOW  5000 ;设置中断时间为5000个时钟周期
MOV TM2AL,A ;低8位
MOV A,HIGH 5000 ;设置中断时间为5000个时钟周期
MOV TM2AH,A ;高8位
MOV A,00010000B ;打开AD电源 并ADRFS=1                     
MOV ADCR0,A ;ADRH为bit 3~bit 0,ADRL为bit 7~bit 0  
MOV A,00000110B ;AD转换时钟为fSYS/64,    
MOV ADCR1,A ;VREFS=0选择内部参考电压 
MOV A,00000001B ;选择AD通道为AN0
MOV ACERL,A
clr   START     ; 启动AD转换 0→1→0 启动
set   START   ; 
clr START   ;
CLR ADF ;清标志
SET ADE ;开AD中断
CLR MF0F ;清多功能中断0标志
CLR T2AF ;清定时器2较器A中断标志
SET MF0E ;使能多功能0中断
SET T2AE ;使能定时器2较器A中断
SET EMI ;使能总中断
SET T2ON ;开始计数
A2: 
CALL CL1 ;调用2位16进制数转换为5位10进制数子程序
MOV A,[9DH] ;显示内容
MOV [8AH],A ;第一位数码管段码显示内容寄存器
MOV A,[9CH] ;显示内容
MOV [8BH],A ;第二位数码管段码显示内容寄存器
MOV A,[9BH] ;显示内容
MOV [8CH],A ;第三位数码管段码显示内容寄存器
MOV A,[9AH] ;显示内容
MOV [8DH],A ;第四位数码管显示内容寄存器 
JMP A2
;*******************************************************
;2位16进制数转换为5为10进制数子程序(0ffh=65535)
;******************************************************* 
CL1: 
MOV A,[98H]
MOV [9AH],A
MOV A,[99H]
MOV [9BH],A
CALL CL2
MOV A,00001111B
AND A,[9EH]
MOV [9AH],A
SWAP [9EH]
MOV A,00001111B
AND A,[9EH]
MOV [9BH],A
MOV A,[9CH]
MOV [9EH],A
MOV A,00001111B
AND A,[9DH]
MOV [9CH],A
SWAP [9DH]
MOV A,00001111B
ANDM A,[9DH]
RET
CL2:
CLR [9CH] 
CLR [9DH]
CLR [9EH]
MOV A,16
MOV [9FH],A
CL3:
CLR C
RLC [9BH]
RLC [9AH]
MOV A,[9EH]
ADC A,[9EH]
DAA [9EH]
MOV A,[9DH]
ADC A,[9DH]
DAA [9DH]
MOV A,[9CH]
ADC A,[9CH]
DAA [9CH]
SDZ [9FH]
JMP CL3
RET
;*******************************************************
; 中断服务子程序
;******************************************************* 
ZD1: 
MOV [0F0H],A ;压栈ACC到0F0H
MOV A,STATUS ;
MOV [0F1H],A ;压栈status标志寄存器到0F1H
CLR PB ;清PC(清屏幕) 
MOV A,Q1 ;数据表地址
CLR TBHP ;清数据表地址高位否则出错
ADD A,IAR0 ;利用间接寄存器找到要显示段码所在数据表的地址 
MOV TBLP,A ;表格指针寄存器TBLP
TABRD PD ;查表并将数据存到PD口寄存器
MOV A,[80H] ;位码寄存器
MOV PB,A ;将位码寄存器的数存到PC口寄存器
;段码和位码的数都有了所以数码管被点亮
INC MP0 ;间接寄存器指针加1指向下一个段码寄存器
RL [80H] ;左移位码寄存器控制下一个数码管
SNZ [80H].5 ;判断是否控制完4个数码管
JMP ZD2 ;退出中断继续
MOV A,1 ;是则从新初始化寄存器数据
MOV [80H],A ; 
MOV A,8AH ;千位数码管对应寄存器
MOV MP0,A ;存到间接寄存器0
ZD2: 
MOV A,[0F1H] ;弹栈后进先出先进后出 
MOV STATUS,A ;弹栈0F1H的数到标志寄存器
MOV A,[0F0H] ;弹栈0F0H的数到acc
CLR MF0F ;清多功能标志
CLR T2AF ;清定时器2比较器A标志
RETI ;中断返回
ISR_ADC: 
MOV [0F0H],A ;压栈ACC到0F0H
MOV A,STATUS ;
MOV [0F1H],A ;压栈status标志寄存器到0F1H
MOV A,ADRH
MOV [98H],A
MOV A,ADRL
MOV [99H],A

MOV A,[0F1H] ;弹栈后进先出先进后出 
MOV STATUS,A ;弹栈0F1H的数到标志寄存器
MOV A,[0F0H] ;弹栈0F0H的数到acc
clr   START       ;high pulse on start bit to initiate conversion 
set   START   ;reset A/D 
clr START     ;start A/D 
RETI ;中断返回
;*******************************************************
; 延时子程序
;******************************************************* 
M001: 
MOV A,1
MOV [85H],A
M002: 
MOV A,200
MOV [86H],A
M003: 
MOV A,250 
MOV [87H],A
M004: 
SDZ [87H]
JMP M004
SDZ [86H]
JMP M003
SDZ [85H]
JMP M002 
    RET 
END




『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
实时控制.安全.如何加速实现未来工厂落地?