单片机汇编语言基于AT89C52和DAC0808按键控制的多档数字调压器设计 举例程序
时间: 2023-06-20 12:06:52 浏览: 163
以下是基于AT89C52和DAC0808的按键控制多档数字调压器的汇编语言示例程序:
```
; AT89C52和DAC0808按键控制的多档数字调压器设计
; 程序实现:按键K1/K2控制输出电压,在液晶屏上显示当前电压值
; 定义I/O端口
PORT_A equ P1
PORT_B equ P2
PORT_C equ P0
; 定义液晶显示的I/O口
LCD_DATA_PORT equ PORT_A
LCD_CTL_PORT equ PORT_B
; 定义DAC0808的控制字节
DAC_CS equ 01h ;DAC芯片选择位,P3.0
DAC_CLK equ 02h ;DAC时钟输入,P3.1
DAC_DIN equ 04h ;DAC数据输入,P3.2
DAC_LDAC equ 08h ;DAC加载输入,P3.3
; 定义按键的I/O口
K1 equ P0.0
K2 equ P0.1
; 定义变量
VOUT equ 20h ;DAC0808的输出电压值
VREF equ 80h ;DAC0808的参考电压值
VMAX equ 0FFh ;DAC0808的最大输出电压值
VMIN equ 00h ;DAC0808的最小输出电压值
VSTEP equ 08h ;DAC0808的输出电压步长
VLEVEL equ 08h ;每步增加的电压值
; 定义初始化过程
INIT:
MOV PORT_C, #00h ;P0端口初始化为0
MOV PORT_B, #00h ;P2端口初始化为0
MOV PORT_A, #00h ;P1端口初始化为0
MOV TMOD, #01h ;定时器0模式1,16位计数器
MOV TH0, #4Ch ;设定定时器初值
MOV TL0, #00h ;设定定时器初值
SETB TR0 ;启动定时器0
SETB DAC_CS ;DAC芯片选择位置高
SETB DAC_CLK ;DAC时钟输入置高
SETB DAC_DIN ;DAC数据输入置高
CLR DAC_LDAC ;DAC加载输入置低
RET
; 定义读取ADC0809的子程序
READ_ADC0809:
SETB P3.5 ;启动ADC0809转换
WAIT_ADC0809:
JB P3.6, WAIT_ADC0809 ;等待ADC0809转换完成
MOV A, P1 ;读取ADC0809输出值
CLR P3.5 ;停止ADC0809转换
RET
; 定义DAC0808输出子程序
DAC_OUTPUT:
MOV A, VOUT ;将输出电压值VOUT赋给累加器A
DIV AB, VREF ;将A:B除以VREF,商存入A,余数存入B
MOV A, B ;将余数存入A
MUL AB, VMAX ;将A:B乘以VMAX,积存入A:B
DIV AB, 256 ;将A:B除以256,商存入A,余数存入B
MOV A, B ;将余数存入A
ADD A, VMIN ;将A加上VMIN,得到最终输出电压值
MOV VOUT, A ;将最终输出电压值存入VOUT
MOV A, #0FFh ;将A设为0FFh
SUBB A, VOUT ;将0FFh减去VOUT,得到DAC的控制字节
MOV P3, A ;将控制字节输出到P3端口
SETB DAC_CLK ;DAC时钟输入置高
CLR DAC_CLK ;DAC时钟输入置低
SETB DAC_LDAC ;DAC加载输入置高
CLR DAC_LDAC ;DAC加载输入置低
RET
; 定义主程序
MAIN:
CALL INIT ;调用初始化过程
LOOP:
CALL READ_ADC0809 ;读取ADC0809的输出电压值
CALL DAC_OUTPUT ;根据输出电压值计算DAC控制字节并输出
MOV A, VOUT ;将输出电压值赋给累加器A
MOV LCD_DATA_PORT, A ;将输出电压值输出到液晶屏
ACALL DELAY ;调用延时过程
CJNE K1, #0, K1_CHANGE ;如果按键K1被按下,则跳转到K1_CHANGE处理
CJNE K2, #0, K2_CHANGE ;如果按键K2被按下,则跳转到K2_CHANGE处理
JMP LOOP ;如果没有按键被按下,则继续循环
K1_CHANGE:
ADD A, VLEVEL ;将输出电压值加上VLEVEL
CJNE A, #VMAX, NO_OVERFLOW ;如果加上VLEVEL后没有溢出,则跳转到NO_OVERFLOW处理
MOV A, #VMAX ;如果加上VLEVEL后溢出了,则将输出电压值设为VMAX
SJMP CHANGE_DONE ;跳转到CHANGE_DONE处理
NO_OVERFLOW:
MOV VOUT, A ;将新的输出电压值存入VOUT
JMP CHANGE_DONE ;跳转到CHANGE_DONE处理
K2_CHANGE:
SUBB A, VLEVEL ;将输出电压值减去VLEVEL
CJNE A, #VMIN, NO_UNDERFLOW ;如果减去VLEVEL后没有下溢,则跳转到NO_UNDERFLOW处理
MOV A, #VMIN ;如果减去VLEVEL后下溢了,则将输出电压值设为VMIN
SJMP CHANGE_DONE ;跳转到CHANGE_DONE处理
NO_UNDERFLOW:
MOV VOUT, A ;将新的输出电压值存入VOUT
CHANGE_DONE:
MOV LCD_DATA_PORT, A ;将新的输出电压值输出到液晶屏
ACALL DELAY ;调用延时过程
JMP LOOP ;跳转回LOOP处理
; 定义延时过程
DELAY:
MOV R7, #20h ;设定延时时间
DELAY_LOOP:
DJNZ R7, DELAY_LOOP ;循环延时
RET
END
```
该程序实现了按键K1/K2控制输出电压,在液晶屏上显示当前电压值。程序通过DAC0808芯片将数字信号转换为模拟信号,实现输出电压的控制。同时,程序通过ADC0809芯片读取输出电压值,通过液晶屏显示当前电压值。程序中还定义了一个延时过程,用于控制按键响应的时间间隔。
阅读全文