?? amperage.asm
字號(hào):
;---------------------------
; 電流檢測(cè)實(shí)例
;功能:通過(guò)定時(shí)器定時(shí)從AD上讀取電壓數(shù)據(jù),將電壓數(shù)據(jù)通過(guò)
; 數(shù)碼管顯示出來(lái)
;---------------------------
ORG 0000H
LJMP START
ORG 0003H
LJMP EXTERN_INT ; 外中斷入口
ORG 000BH
LJMP TIMER0_INT
A_BIT EQU 20h ; 數(shù)碼管個(gè)位數(shù)存放內(nèi)存位置
B_BIT EQU 21h ; 數(shù)碼管十位數(shù)存放內(nèi)存位置
;-----------------------
;進(jìn)入初始化程序,初始化各個(gè)標(biāo)志位,定時(shí)器
;-----------------------
START:
;-----------------------
;分配內(nèi)存單元
;-----------------------
MOV SP,#050H ; 設(shè)置堆棧
MOV R0,#030H ; 設(shè)置AD存儲(chǔ)單元初始地址
MOV IE,#0FFH ; 打開(kāi)所有中斷
MOV DPTR,#78FFH ; 采集通道首地址,只使用一路AD就可以
MOV R0,#30H
MOV @R0,#00H ; 清除AD采集來(lái)的電流
MOV R0,#31H
MOV @R0,#00H ; 清除發(fā)送緩存中的數(shù)據(jù)
MOV R0,#41H
MOV @R0,#00H ; 清除定時(shí)器每500毫秒的選擇觸發(fā)位
MOV R1,#042H
MOV @R0,#00H ; 清除定時(shí)器計(jì)數(shù)器
LCALL TIMER1_INIT ; 初始化定時(shí)器0和定時(shí)器1
;---------------------------
;進(jìn)入主循環(huán),如果查詢(xún)到發(fā)送標(biāo)志位就把采集的數(shù)據(jù)發(fā)送出去
;---------------------------
LOOP:
MOV R0,#30H ; 30H是AD轉(zhuǎn)換的地址,把數(shù)據(jù)采集后存進(jìn)30H中
MOV A,@R0
MOV R0,#31H ; 將30H中的數(shù)據(jù)存放到發(fā)送緩存中去
MOV @R0,A ; 將AD轉(zhuǎn)換后的數(shù)據(jù)存儲(chǔ)進(jìn)發(fā)送緩存中去
MOV R0,#41H ; 判斷定時(shí)器是否來(lái)索要數(shù)據(jù),
MOV A,@R1
JNZ DISPLAY
MOV R0,#41H ; 清除定時(shí)器觸發(fā)標(biāo)志位
MOV @R1,#00H
SJMP LOOP ; 如果沒(méi)有,返回循環(huán)繼續(xù)查詢(xún)標(biāo)志位
;----------------------------------
;顯示子程序
;----------------------------------
DISPLAY:
MOV A,31H ; 將29H中的十六進(jìn)制數(shù)轉(zhuǎn)換成10進(jìn)制
MOV B,#10 ; 10進(jìn)制/10=10進(jìn)制
DIV AB
MOV B_BIT,A ;十位在A
MOV A_BIT,B ;個(gè)位在B
MOV DPTR,#NUMTAB ; 指定查表啟始地址
MOV R0,#4
DPL1:
MOV R1,#250 ; 顯示1000次
DPLOP:
MOV A,A_BIT ; 取個(gè)位數(shù)
MOVC A,@A+DPTR ; 查個(gè)位數(shù)的7段代碼
MOV P0,A ; 送出個(gè)位的7段代碼
CLR P2.0 ; 開(kāi)個(gè)位顯示
ACALL D1MS ; 顯示1ms
SETB P2.0
MOV A,B_BIT ; 取十位數(shù)
MOVC A,@A+DPTR ; 查十位數(shù)的7段代碼
MOV P0,A ; 送出十位的7段代碼
CLR P2.1 ; 開(kāi)十位顯示
ACALL D1MS ;顯示1ms
SETB P2.1
DJNZ R1,DPLOP ;100次沒(méi)完循環(huán)
DJNZ R0,DPL1 ;4個(gè)100次沒(méi)完循環(huán)
RET
;1MS延時(shí)
D1MS:
MOV R7,#80
DJNZ R7,$
RET
;實(shí)驗(yàn)板上的7段數(shù)碼管0~9數(shù)字的共陰顯示代碼
NUMTAB: DB 03FH,06H,5BH,4FH,66H,06DH,07DH,07H,07FH,06FH
;-----------------------
; 初始化定時(shí)器,定時(shí)器0作為定時(shí)的觸發(fā)
;-----------------------
TIMER1_INIT:
ANL TMOD,#0FH ; 設(shè)置定時(shí)器1為方式2
ORL TMOD,#10H
MOV TMOD,#21H ; 定時(shí)器0工作在方式1
MOV PCON,#080H
CLR TR1 ; 禁止定時(shí)器1
SETB EA ; 使能全部定時(shí)器
SETB ET1 ; 允許定時(shí)器1中斷
SETB ET0 ; 允許定時(shí)器0中斷
SETB PT0 ; 定時(shí)器0中斷優(yōu)于其余中斷
CLR TF1 ; 清除定時(shí)器1中斷標(biāo)志位
MOV TL0,#00H
MOV TH0,#01FH ; 定時(shí)器0中斷發(fā)生時(shí)間為62.5毫秒
MOV TH1,#0FFH ; 定時(shí)器1波特率的設(shè)定為57600bps
SETB TR0 ; 使能定時(shí)器0
CLR TF0 ; 清除中斷標(biāo)志位
SETB TR1 ; 使能定時(shí)器1
RET
;-----------------------
; 進(jìn)入定時(shí)器中斷,每500毫秒設(shè)置一次標(biāo)志位
;-----------------------
TIMER0_INT:
PUSH ACC ; 累加器入棧
PUSH PSW ; 程序狀態(tài)字入棧
MOV PSW,#10H ; 更換寄存器區(qū)域
CLR TF0
CLR TR0
MOV TL0,#00H
MOV TH0,#01FH ; 定時(shí)器0中斷發(fā)生時(shí)間為6
CLR TF0 ; 清除溢出中斷位
MOV R1,#042H
INC @R1 ; 增加計(jì)數(shù)器的值,到8為止,這樣達(dá)到500毫秒
CJNE @R1,#08H,TIMER0_READY
MOV @R1,#00H ; 清除計(jì)數(shù)器的值
MOV R1,#041H ; 設(shè)置標(biāo)志位,每500毫秒采集一次數(shù)據(jù)
MOV @R1,#01H
TIMER0_READY:
SETB TR0 ; 使能定時(shí)器0
POP PSW ; 程序狀態(tài)字出棧
POP ACC ; 累加器出棧
RETI
;-----------------------
; 進(jìn)入外部中斷,每進(jìn)入一次讀取ADC的值
;-----------------------
EXTERN_INT:
PUSH ACC ; 累加器入棧
PUSH PSW ; 程序狀態(tài)字入棧
MOV PSW,#018H ; 更換寄存器區(qū)域
MOV DPTR,#78FFH ; AD轉(zhuǎn)換器首地址
MOVX A,@DPTR
MOV R1,#030H ; 存儲(chǔ)AD轉(zhuǎn)換器的數(shù)據(jù)的地址
MOV @R1,A
POP PSW ; 程序狀態(tài)字出棧
POP ACC ; 累加器出棧
RETI
END
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -