📄 dac0832.asm
字号:
;实验名称:串口发送一个要输出的电压(00--FF)
; 功能:模数转换输出一个当前串口发出的电压
;输出的电压为V=5*KK/255。其中KK为串口接收到的二进制数
; 作者:http://www.mcuprog.com
; 05-02-01
;***********************************************************
;***********************************************************
E BIT P2.2 ;LCD口线的定义
RW BIT P2.1
RS BIT P2.0
LCDPORT EQU P0
;DAC0832的引脚
DAC_WR BIT P3.4
DAC_CS BIT P3.3
CMD_BYTE EQU 2EH
DAT_BYTE EQU 2FH
DABL EQU 30H ;当前DA的变量(00到255间),从串口接收
LEDBAI EQU 31H ;显示的百
LEDSHI EQU 32H ;显示的十
LEDGE EQU 33H ;显示的个
KEYTIME EQU 35H
KEYBIT BIT 00H ;
RS232OKBIT BIT 01H ;串口接收到数据
ORG 0000H
AJMP MAIN
ORG 000BH
AJMP TIME0_1
ORG 0023H
RS232: CLR RI
MOV A,SBUF
MOV DABL,A
SETB RS232OKBIT
RETI
;以下为主程序的开始
ORG 0030H
MAIN: MOV 20H,#00H
LCALL INITLCD
MOV DABL,#20
MOV KEYTIME,#04H
MOV CMD_BYTE,#80H //设置DDRAM的地址
LCALL WRITE_CMD
LCALL DELAY0
MOV DAT_BYTE,#"D"
LCALL WRITE_DAT
MOV DAT_BYTE,#"A"
LCALL WRITE_DAT
MOV DAT_BYTE,#"C"
LCALL WRITE_DAT
MOV DAT_BYTE,#":"
LCALL WRITE_DAT
MOV TH0,#0EEH ;16位的定时器,定时5MS
MOV TL0,#00H
MOV TMOD,#21H
MOV TH1,#0FDH ;波特率9600
MOV TL1,#0FDH
MOV SCON,#50H
SETB TR1
SETB REN
SETB TR0
MOV IE,#92H ;定时器0中断
SETB RS232OKBIT
SJMP $
ORG 0100H
TIME0_1: MOV TH0,#0EEH
MOV TL0,#00H
DJNZ KEYTIME,TIME0_RE
MOV KEYTIME,#04H
MOV P1,#0DFH
LCALL KEYSCAN
LCALL DAC0832
LCALL JSDPBL
LCALL DISPDPBL
TIME0_RE: RETI
;按键扫描
KEYSCAN: MOV P1,#0FFH
NEXT_UP: JB P1.0,NEXT_DN ;+键
JB KEYBIT,SCAN_RE
SETB KEYBIT
INC DABL
MOV A,DABL
CJNE A,#201,SCAN_RE ;大于200反回20
MOV DABL,#10
AJMP SCAN_RE
NEXT_DN: JB P1.1,NEXT_NC ;-键
JB KEYBIT,SCAN_RE
SETB KEYBIT
DEC DABL
MOV A,DABL
CJNE A,#19,SCAN_RE ;小于20反回200
MOV DABL,#200
AJMP SCAN_RE
NEXT_NC: CLR KEYBIT ;清标志用于等待下一次按键
SCAN_RE: MOV P1,#0FFH
RET
;以下为AD转换程序
DAC0832 : CLR DAC_CS
MOV A,DABL
MOV P0,A
CLR DAC_WR
NOP
NOP
SETB DAC_WR
SETB DAC_CS
RET
;LCD1602要用到的一些子程序
;写命令(入口参数CMD_BYTE)
WRITE_CMD: CLR RS
CLR RW
MOV A,CMD_BYTE
MOV LCDPORT,A
SETB E
NOP
NOP
CLR E
LCALL DELAY0
RET
;写显示数据(入口参数DAT_BYTE)
WRITE_DAT: SETB RS
CLR RW
MOV A,DAT_BYTE
MOV LCDPORT,A
SETB E
NOP
NOP
CLR E
LCALL DELAY0
RET
;LCD显示初始化
INITLCD: MOV CMD_BYTE,#30H
LCALL WRITE_CMD
MOV CMD_BYTE,#30H
LCALL WRITE_CMD
MOV CMD_BYTE,#30H
LCALL WRITE_CMD
MOV CMD_BYTE,#38H ;设定工作方式
LCALL WRITE_CMD
MOV CMD_BYTE,#0CH ;显示状态设置
LCALL WRITE_CMD
MOV CMD_BYTE,#01H ;清屏
LCALL WRITE_CMD
MOV CMD_BYTE,#06H ;输入方式设置
LCALL WRITE_CMD
RET
;延时子程序
DELAY0: MOV R5,#0A0H
DELAY1: NOP
DJNZ R5,DELAY1
RET
;显示变量
DISPDPBL: MOV CMD_BYTE,#85H //设置DDRAM的地址
LCALL WRITE_CMD
MOV DAT_BYTE,LEDBAI
LCALL WRITE_DAT
MOV DAT_BYTE,LEDSHI
LCALL WRITE_DAT
MOV DAT_BYTE,LEDGE
LCALL WRITE_DAT
RET
;计算显示的值
JSDPBL: MOV A,DABL
MOV B,#64H
DIV AB
ORL A,#30H
MOV LEDBAI,A
MOV A,B
MOV B,#0AH
DIV AB
ORL A,#30H
MOV LEDSHI,A
MOV A,B
ORL A,#30H
MOV LEDGE,A
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -