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