?? 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 + -