⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tcmain_sucess.asm

📁 基于TLC2543AD转换芯片的探测仪程序 描述:TLC2543AD芯片为串行12位AD转换芯片,10us的转换时间,11路 模拟输入通道,全串行操作 程序功能:将TLC2543芯片转换得
💻 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 + -