📄 tcmain_sucess.asm
字号:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 基于TLC2543AD转换芯片的探测仪程序
;;描述:TLC2543AD芯片为串行12位AD转换芯片,10us的转换时间,11路
;; 模拟输入通道,全串行操作
;;程序功能:将TLC2543芯片转换得到的数据有条件的发送到PC机
;;附加功能:将采样结果送出到数码管上显示
;;操作说明:该程序根据N(需要采样的通道数)的值来进行通道采样
;; 从0通道开始,最大为10,不能超过10,否则出错,采集到的数据
;; 保存到以DBUF定义的起始地址单元中,数据位数为12位.发送
;; 按键每按一次,在向串口发送当前显示通道数据的同时,显示将
;; 更新到下一通道数据,直到定义的通道数据全部发送完毕后,显
;; 示数据将回到0通道.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;
;; 变量定义
;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;定义TLC2543引脚与2051之间的硬件连接关系
CLK BIT P3.5
DIN BIT P3.4
DOUT BIT P3.3
CS BIT P3.7
N EQU 1 ;定义需要采样的通道数(兼容多通道)
DBUF EQU 30H ;转换数据保存单元的开始单元
;;;;;;;;;;;;;;;;;;;;;;
;;显示程序部分变量定义
;;;;;;;;;;;;;;;;;;;;;;
;定义ETK6201与2051的硬件连接关系
;;;;;;;;;;;;;;;;;;;;;;
DISDIN BIT P1.0
DISCLK BIT P1.1
DISSTB BIT P1.2
SENDKEY BIT P1.5 ;数据发送键
;;;;;;命令定义;;;;;;;
COMMAND1 EQU 03H ;11段*7位模式
COMMAND2 EQU 40H ;显示数据地址自动+1
COMMAND3 EQU 0C0H ;其始地址为00H
COMMAND4 EQU 8AH ;开始显示,亮度等级为4/16(最大16/16)
DISBUF1 DATA 22H ;显示BUF1
DISBUF2 DATA 23H ;**2
DISBUF3 DATA 24H ;**3
DISBUF4 DATA 25H ;**4
CHACKNUM DATA 26H ;对采样数据进行记录
ORG 0000H
AJMP START
ORG 0003H
RETI
ORG 000BH
;AJMP DISPLAY
RETI
ORG 0013H
RETI
ORG 001BH
RETI
ORG 0023H
;LJMP COMM ;串口中断(发送采样数据)
RETI
;;;;;;;;;;;;;;;;;;;
;;程序初始化
;;;;;;;;;;;;;;;;;;;
START: MOV SP,#70H ;定义栈低(向上最大16个字节,注意不要溢出)
MOV P1,#0FFH ;初始化显示端口
ACALL INIT_RS232 ;初始化串口
INIT: MOV DISBUF1,#13H
MOV DISBUF2,#13H
MOV DISBUF3,#13H
MOV DISBUF4,#13H
ACALL DISPLAY ;初始化显示"- - - -"
SETB EA
MAIN: MOV R0,#DBUF ;设置数据缓冲区指针
MOV R1,#N ;设置显示的通道数据个数
MM: MOV CHACKNUM,#200;调节等待时间
ACALL ADCN ;调用A/D转换程序
ACALL DISCOV ;调用数据转换程序
MM2: DJNZ CHACKNUM,MM1;调节等待时间
ACALL DEALY10MS ;延时10MS后继续
SJMP MM ;进行下一次采样
MM1: JB SENDKEY,MM2 ;判断数据发送键是否按下
ACALL DEALY10MS ;延时10MS后继续判断
JB SENDKEY,MM ;如果为高电平,则为干扰,放弃操作,继续采样
JNB SENDKEY,$ ;等待抬起
ACALL DISPLAY ;显示采样数据,然后发送采样数据到串口
MOV R0,#22H
SENDNEX: MOV A,@R0
ADD A,#30H
ACALL TX_CHAR
INC R0
CJNE R0,#27H,SENDNEX
;;;;;;;;;;;;;;;
MOV A,#47 ;'/'
ACALL TX_CHAR
;;;;;;;;;;;;;;;
MOV A,#32 ;' '
ACALL TX_CHAR
;;;;;;;;;;;;;;;
SJMP MAIN
DISCOV: MOV A,@R0 ;读取转换数据高8位
ANL A,#0F0H ;取前四位
SWAP A
MOV R6,A ;存放到转换BUF高字节中
MOV A,@R0
ANL A,#0FH ;取后四位
SWAP A
MOV R7,A ;存放到转换BUF低前半字节中
INC R0 ;调整指针,指向低4位数据字节
MOV A,@R0 ;取数据
SWAP A
ORL A,R7 ;将数据整合到A中
MOV R7,A ;将整合数据给R7
ACALL HB2 ;转换为BCD码
MOV A,R4 ;转换后的数据送显示缓冲区显示
ANL A,#0F0H ;取千位
SWAP A
MOV DISBUF1,A
MOV A,R4
ANL A,#0FH ;取百位
MOV DISBUF2,A
MOV A,R5
ANL A,#0F0H ;取十位
SWAP A
MOV DISBUF3,A
MOV A,R5
ANL A,#0FH ;取个位
MOV DISBUF4,A
DEC R0 ;还原指针
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;4、HB2
;;功能:双字节无符号16进制整数转换为BCD码
;;入口条件:待转换的双字节十六进制整数在R6、R7中。
;;出口信息:转换后的三字节BCD码整数在R3、R4、R5中。
;;影响资源:PSW、A、R2~R7 堆栈需求: 2字节
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
HB2: ;PUSH PSW
;SETB RS1
;SETB RS0 ;使用第三区工作寄存器
CLR A ;BCD码初始化
MOV R3,A
MOV R4,A
MOV R5,A
MOV R2,#10H ;转换双字节十六进制整数
HB3: MOV A,R7 ;从高端移出待转换数的一位到CY中
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R5 ;BCD码带进位自身相加,相当于乘2
ADDC A,R5
DA A ;十进制调整
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
MOV A,R3
ADDC A,R3
MOV R3,A ;双字节十六进制数的万位数不超过6,不用调整
DJNZ R2,HB3 ;处理完16bit
;POP PSW
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; A/D转换子程序
;;程序名: ADCN
;;入口条件: 无
;;出口条件: 转换后的数据保存在40H开始的内存单元中,一个通道的数据占2个
;; 字节
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ADCN: PUSH PSW
SETB RS1
CLR RS0 ;使用第2区工作寄存器
SETB DOUT ;转换开始前初始化信号电平,准备接收数据
SETB CS ;暂时关闭TLC2543
CLR CLK ;初始化时钟脉冲为低电平
MOV R0,#DBUF ;存放数据的缓冲区首地址
MOV R7,#N
MOV R6,#00H ;控制字:通道号、精度(位数)、输出格式(指向0通道)
ACALL ADCS ;读写一次,舍区取得的数据,启动0通道的转换过程
MOV R2,#00 ;清空转换数据缓存单元,准备接收转换数据(高8位)
MOV R3,#00 ;(低4位)
ADCN1: ;ACALL ADCS ;启动转换
MOV R1,#10 ;延时22us
DJNZ R1,$ ;延时22us
ACALL ADCS ;再次读取转换结果,避免偶然误差
MOV A,R2 ;高8位存30H
MOV @R0,A
INC R0 ;调整指针
MOV A,R3
MOV @R0,A ;低4位存31H
INC R0 ;调整指针
MOV A,R6 ;调整通道指针,指向下一个通道
ADD A,#10H
MOV R6,A ;修改通道号,加1
DJNZ R7,ADCN1 ;直到所有通道全部转换完毕
POP PSW ;还原工作区
RET
;//********************;采样转换1个通道***********************//
;入口参数:通道控制字,在R6中
;返回值 :高八位在R2中,低4位在R3中
;//**********************************************************//
ADCS: CLR CLK
CLR CS ;片选信号CS低电平开始采样转换
MOV R5,#8
MOV A,R6 ;取转换结果的同时,送下一个通道的控制字,接收一个字节数据,发送一个字节控制字
ADCS1: MOV C,DOUT
RLC A
MOV DIN,C
SETB CLK
CLR CLK
DJNZ R5,ADCS1
MOV R2,A ;高8位存R2
MOV A,#00
MOV R5,#4
ADCS2: MOV C,DOUT
RLC A
SETB CLK
CLR CLK
DJNZ R5,ADCS2 ;取低4位
SWAP A
MOV R3,A ;低4位存R3
SETB CS ;对一个通道的转换结束,关闭TLC2543
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;RS232初始化
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INIT_RS232:
MOV SCON,#50H
MOV TMOD,#20H
MOV TH1,#0FDH
MOV TL1,#0FDH
SETB TR1
SETB TI ;初始化成发送数据结束,可以继续发送数据
RET
;----------------------------------------------------------------------
;****2、************传送一个字符数据
TX_CHAR:
JNB TI,$
CLR TI
MOV SBUF,A
RET
;----------------------------------------------------------------------
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;ETK6201显示程序,使用RS1=1,RS0=0的1区 2003/4/19
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DISPLAY: PUSH ACC ;保存ACC
PUSH PSW
CLR RS1
SETB RS0 ;使用第一区工作寄存器
MOV P1,#0FFH ;初始化显示端口
CLR DISCLK ;准备
MOV A,#COMMAND2 ;写2号命令字
ACALL DSOUT
SETB DISSTB ;关闭ETK6201
ACALL DS1MS ;延时
MOV A,#COMMAND3 ;写3号命令字
ACALL DSOUT
MOV DPTR,#XSTAB
MOV A,DISBUF1 ;取得数据
MOVC A,@A+DPTR ;提取字模
ACALL DSOUT ;调用送出子程序
MOV A,#00H
ACALL DSOUT ;无用的显示区域填充0
MOV A,DISBUF2
MOVC A,@A+DPTR ;提取字模
ACALL DSOUT ;送出
MOV A,#00H
ACALL DSOUT ;无用的显示区域填充0
MOV A,DISBUF3
MOVC A,@A+DPTR ;提取字模
ACALL DSOUT ;送出
MOV A,#00H
ACALL DSOUT ;无用的显示区域填充0
MOV A,DISBUF4
MOVC A,@A+DPTR ;提取字模
ACALL DSOUT ;送出
MOV A,#00H
ACALL DSOUT ;无用的显示区域填充0
SETB DISSTB ;关闭ETK6201
ACALL DS1MS ;延时
MOV A,#COMMAND1 ;写1号命令字
ACALL DSOUT
SETB DISSTB ;关闭ETK6201
ACALL DS1MS ;延时
MOV A,#COMMAND4 ;写4号命令字
ACALL DSOUT
SETB DISSTB ;关闭ETK6201
POP PSW
POP ACC ;出栈
RET
;---送出循环----------
DSOUT: CLR DISSTB ;启动ETK6201
MOV R0,#8 ;传送一个字节8位
DSLOOP: RRC A ;右移
MOV DISDIN,C ;送数据到数据口
CLR DISCLK
NOP
NOP
SETB DISCLK ;送一时钟
DJNZ R0,DSLOOP
RET
;---显示延时----------
DS1MS: MOV R1,#24
DS1LO: MOV R2,#100
DJNZ R2,$
DJNZ R1,DS1LO
RET ;延时返回
;COMM: CLR EA
; CLR TI ;清除发送标志,准备下一次发送
; SETB EA
; RETI ;是否用查询方式就不用使用中断了?
DEALY10MS:PUSH PSW
SETB RS1
SETB RS0 ;使用第三区工作寄存器
MOV R2,#50H
DS1L00: MOV R3,#0FFH
DJNZ R3,$
DJNZ R2,DS1L00
POP PSW ;还原寄存器区
RET ;延时返回
;显示字表(共阴)
XSTAB: DB 7eH,30H,6dH,79H ;"0","1","2","3"
DB 33H,5bH,5fH,70H ;"4","5","6","7"
DB 7FH,7bH,77H,1fH ;"8","9","A","B"
DB 0dH,3dH,4fH,47H ;"C","D","E","F"
DB 00H,5bH,3eH,01H ;" ","s","U","Z"
; {'0',0x7e},
; {'1',0x30},
; {'2',0x6d},
; {'3',0x79},
; {'4',0x33},
; {'5',0x5b},
; {'6',0x5f},
; {'7',0x70},
; {'8',0x7f},
; {'9',0x7b},
; {' ',0x00},
; {'a',0x77},
; {'b',0x1f},
; {'c',0x0d},
; {'d',0x3d},
; {'e',0x4f},
; {'f',0x47},
; {'s',0x5b},
; {'u',0x3e},
; {'z',0x01} /*中线*/
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -