📄 adc.asm
字号:
;------------------------------------------------
;ADC测试程序。在四位共阳动态LED上显示ADC 转换数据
;20H~23H是显示缓冲区
;------------------------------------------------
ORG 0000H
LJMP INIT
ORG 000BH
LJMP ADC ;T0中断服务程序
INIT: MOV 28H,#0 ;储存转换数据
MOV SP,#60H ;初始化SP
MOV 20H,#0ffh ;给显示区赋值
MOV 21H,#0ffh
MOV 22H,#0ffh
MOV 23H,#0ffh
MOV 30H,#0 ;0.3秒计时用
MOV R0,#20H ;显示缓冲区起点
MOV R5,#0FEH ;扫描位选起始值
MOV TMOD,#01H ;T0 方式1
MOV TH0,#3CH ;(65536-50000)/256 ;赋初值
MOV TL0,#0B0H ;65536-((65536-50000)/256*256)
SETB EA ;开中断
SETB ET0
SETB TR0 ;开定时器
MAIN: LCALL DISPLAY ;主程序只要完成扫描显示功能
LJMP MAIN
;-------------------------------------
;T0中断服务程序,读取ADC数据并且拆字
;占用资源:30H
;-------------------------------------
ADC: INC 30H
MOV A,30H
CJNE A,#7,ADC_QUIT ;计时50MS*6=300MS
MOV 30H,#0
LCALL READ_ADC
LCALL CONVERSE
ADC_QUIT:
RETI
;-----------------------------------------------
;程序功能:读出ADC TLC548 的数据
;占用资源:R1,28H
;硬件连接:P35---CLK, P36---DO, P37---CS
;转换结果储存在28H单元
;-----------------------------------------------
READ_ADC:NOP ;初始化
SETB P3.7 ;CS置高电平
CLR P3.5 ;CLK产生下降沿
MOV R1,#00H ;移位计数标志清零
ADP: CLR P3.7 ;CS为0,开始读前一个转换完毕的数值
NOP ;延时1.4uS,具体视单片机时钟而定
NOP
NEXT: SETB P3.5 ;置I/O CLOCK为1
MOV C,P3.6
RLC A
CLR P3.5 ;置I/O CLOCK为零
INC R1 ;移位计数
CJNE R1,#8,NEXT ;判断是否满8次
MOV R1,#0 ;计数寄存器重置
SETB P3.7 ;CS为1,停止读数
MOV 28H,A ;28H:储存转换数据.
RET
;------------------------------------------
;三位数的拆字程序
;入口地址:28H(要拆分的数字)
;出口地址:22~20H(拆分后的百位,十位和个位数)
;------------------------------------------
CONVERSE: ;拆字程序,拆分成BCD码并储存在显示缓冲区
MOV R1,#22H ;显示缓冲区首地址(三位数)
MOV A,28H ;读入要拆分的数据
MOV B,#100 ;除于100得到百位数
DIV AB
MOV @R1,A ;保存百位数
DEC R1 ;修改缓冲区地址
MOV A,B ;读入要拆分的数据(余数)
MOV B,#10 ;除于10得到十位数
DIV AB
MOV @R1,A ;保存十位数
DEC R1 ;修改缓冲区地址
MOV @R1,B ;保存个位数
RET
;-----------------------------------------------
;使用资源:R0,R5,20H~24H 占用P0,P2口
;-------------------------------------------------------
DISPLAY: ;每次只显示一位
MOV P0,#0FFH
CJNE R0,#24H,DISPLAY1 ;如果四位都已经扫描完毕
MOV R0,#20H ;则从第一位重新扫描显示
MOV R5,#0FEH
DISPLAY1:
MOV DPTR,#TABLE
MOV A,@R0 ;根据要显示的数字查找字符表
MOVC A,@A+DPTR
;********************************
; CJNE R0,#22H,X10 ;给第三位LED加上小数点
; ANL A,#01111111B
;X10: NOP
;CJNE R0,#24H,X11 ;给第五位LED加上小数点
;ANL A,#01111111B
X11: MOV P0,A ;送显示信号
MOV P2,R5 ;送位选信号
LCALL DELAY5MS ;每次扫描延时5ms
X3: MOV A,R5 ;位选码移位
RL A
MOV R5,A
INC R0 ;指向下一个要显示的字符
RET
DELAY5MS:
MOV R6,#25 ;5毫秒延时
D1: MOV R7,#100
DJNZ R7,$
DJNZ R6,D1
RET
TABLE: ;显示字型码(共阳)
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -