?? adctest.asm
字號:
;*****************************************************************************************
; MCS8051-III學習板演示程序
;
; (c) Copyright 2007-2007,廣州恒芯電子
; All Rights Reserved
;*****************************************************************************************
;*****************************************************************************************
;程序說明
;*****************************************************************************************
;名稱: MCS8051-III學習板演示程序(AD轉換測試)
;功能: 實現AD轉換模塊接收,并在數碼管顯示
;版本:2007-07-01
;*****************************************************************************************
;硬件說明
;*****************************************************************************************
;單片機: 兼容MCS-51單片機/STC89C51
;晶振頻率: 12MHz
;*****************************************************************************************
;說明:程序預定義
;*****************************************************************************************
LED7A_CTRL EQU P1.7 ;數碼管第一位控制引腳(0為有效,1為無效)
LED7B_CTRL EQU P1.6 ;數碼管第二位控制引腳(0為有效,1為無效)
LED7C_CTRL EQU P1.5 ;數碼管第三位控制引腳(0為有效,1為無效)
LED7D_CTRL EQU P1.4 ;數碼管第四位控制引腳(0為有效,1為無效)
LED7_STATUS EQU P0 ;數碼管狀態引腳(0為有效,1為無效)
LED7A_DATA EQU 70H ;數碼管第一位顯示值(千位)
LED7B_DATA EQU 71H ;數碼管第二位顯示值(百位)
LED7C_DATA EQU 72H ;數碼管第三位顯示值(十位)
LED7D_DATA EQU 73H ;數碼管第四位顯示值(個位)
LED7_NUM EQU 74H ;數碼管動態掃描值(值為從0到3)
AD_SDA EQU P1.2 ;A/D轉換的數據端
AD_CLK EQU P1.0 ;A/D轉換的時鐘端
AD_BUF EQU 30H
;*****************************************************************************************
;說明:程序開始
;*****************************************************************************************
ORG 0000H ;程序首地址 PC=0000H
JMP START ;程序跳轉到START PC=0030H
ORG 000BH ;T0中斷程序入口
JMP LED7SCAN ;跳到數碼管動態掃描處理程序
ORG 0030H ;程序開始
START:
MOV DPTR, #LED7TAB ;數碼管顯示碼表地址送DPTR
MOV LED7_NUM, #0 ;數碼管動態掃描值至0,掃描第一位
;T0中斷設定
MOV TMOD, #00000001B ;使用T0:GATE=0,C/T=0(定時),M1 M0=01(工作方式1)
MOV TH0, #0ECH ;中斷時間為5毫秒
MOV TL0, #078H
SETB ET0 ;允許T0中斷
SETB TR0 ;使T0工作
SETB EA ;總中斷開啟
L1:
MOV LED7A_DATA, #16 ;數碼管第一位初始值
MOV LED7B_DATA, #16 ;數碼管第二位初始值
MOV LED7C_DATA, #0 ;數碼管第三位初始值
MOV LED7D_DATA, #0 ;數碼管第四位初始值
L2:
CLR AD_SDA
CLR AD_CLK
ACALL DELAY
CLR TR0
SETB AD_SDA
CLR C
MOV A, #000H
MOV R1, #08H
CLR AD_CLK
NOP
NOP
L3: SETB AD_CLK
NOP
MOV C, AD_SDA
RLC A
CLR AD_CLK
NOP
DJNZ R1, L3
MOV AD_BUF, A
SETB TR0
CLR AD_SDA
CLR AD_CLK
MOV A, AD_BUF
ANL A, #0FH
MOV LED7D_DATA, A
MOV A, AD_BUF
SWAP A
ANL A, #0FH
MOV LED7C_DATA, A
ACALL DELAY
JMP L2 ;循環
;*****************************************************************************************
;函數:LEDSCAN
;說明: 數碼管動態掃描處理程序
;參數: 無
;返回; 無
;*****************************************************************************************
LED7SCAN:
PUSH ACC ;ACC入棧
PUSH PSW ;PSW入棧
PUSH DPH
PUSH DPL
MOV DPTR, #LED7TAB
MOV A, LED7_NUM ;數碼管動態掃描值送A
CJNE A, #0, LED7SCAN_1 ;若數碼管動態掃描值為0,則處理數碼管的第一位,否則跳轉到LED7SCAN_1
SETB LED7D_CTRL ;設置數碼管第四位無效
MOV A, LED7A_DATA ;將千位值送A
MOVC A, @A+DPTR ;將顯示碼送A
CLR LED7A_CTRL ;設置數碼管第一位有效
JMP LED7SCAN_4 ;跳轉到LED7SCAN_4
LED7SCAN_1:
CJNE A, #1, LED7SCAN_2 ;若數碼管動態掃描值為1,則處理數碼管的第二位,否則跳轉到LED7SCAN_2
SETB LED7A_CTRL ;設置數碼管第一位無效
MOV A, LED7B_DATA ;將百位值送A
MOVC A, @A+DPTR ;將顯示碼送A
CLR LED7B_CTRL ;設置數碼管第二位有效
JMP LED7SCAN_4 ;跳轉到LED7SCAN_4
LED7SCAN_2:
CJNE A, #2, LED7SCAN_3 ;若數碼管動態掃描值為2,則處理數碼管的第三位,否則跳轉到LED7SCAN_3
SETB LED7B_CTRL ;設置數碼管第二位無效
MOV A, LED7C_DATA ;將十位值送A
MOVC A, @A+DPTR ;將顯示碼送A
CLR LED7C_CTRL ;設置數碼管第三位有效
JMP LED7SCAN_4 ;跳轉到LED7SCAN_4
LED7SCAN_3:
SETB LED7C_CTRL ;設置數碼管第三位無效
MOV A, LED7D_DATA ;將個位值送A
MOVC A, @A+DPTR ;將顯示碼送A
CLR LED7D_CTRL ;設置數碼管第四位有效
MOV LED7_NUM, #0 ;數碼管動態掃描值置0
JMP LED7SCAN_5 ;跳轉到LED7SCAN_5
LED7SCAN_4:
INC LED7_NUM ;數碼管動態掃描值加1
LED7SCAN_5:
MOV LED7_STATUS, A ;顯示碼送數碼管狀態引腳
MOV TH0, #0ECH ;重新設置T0定時值
MOV TL0, #078H
POP DPL
POP DPH
POP PSW ;PSW出棧
POP ACC ;ACC出棧
RETI ;中斷返回
;*****************************************************************************************
;函數:DELAY
;說明:程序延時
;參數: 無
;返回: 無
;*****************************************************************************************
DELAY:
MOV R5, #06H
DELAY_1:
MOV R6, #0FFH
DELAY_2:
MOV R7, #0FFH
DJNZ R7, $
DJNZ R6, DELAY_2
DJNZ R5, DELAY_1
RET
;*****************************************************************************************
;說明:七段數碼管十六進制顯示碼表
;*****************************************************************************************
LED7TAB:
DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H,080H,090H ;從'0'到'9'
DB 088H,083H,0C6H,0A1H,086H,08EH,0FFH ;從'A'到'F'
;*****************************************************************************************
;說明:程序結束
;*****************************************************************************************
END ;程序結束
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -