?? voltage.asm
字號:
;----------------------------------
; 數字電壓表實例
; 功能:單片機通過ADC0804實現簡單的數字電壓表
;-----------------------------------
;//定義ADC的連接端口
ad_wr equ P3.6 ;芯片選擇
ad_cs equ P2.0 ;轉換開始
ad_rd equ P3.7 ;RD=LOW,數字信號輸出
ad_input_port equ p1 ;定義數據位
Counter EQU 59H ;計數器,顯示程序通過它得知現正顯示哪個數碼管
FIRST EQU P2.4 ;第一位數碼管的位控制
SECOND EQU P2.5 ;第二位數碼管的位控制
THEER EQU P2.6 ; 第三位數碼管的位控制
DISPBUF EQU 5AH ;顯示緩沖區為5AH和5BH
ORG 0000h
AJMP main
ORG 000BH ;定時器T0的入口
AJMP DISP ;顯示程序
ORG 0030h
MAIN:
MOV SP,#5FH ;設置堆棧
MOV P1,#0FFH
MOV P0,#0FFH
MOV P2,#0FFH ;初始化,所顯示器,LED滅
MOV TMOD,#00000001B ;定時器T0工作于模式1(16位定時/計數模式)
MOV TH0,#HIGH(65536-2000)
MOV TL0,#LOW(65536-2000)
SETB TR0 ;開定時器0
SETB EA ;開總中斷
SETB ET0 ;開定時器0中斷
MOV Counter,#0 ;計數器初始化
LOOP:
LCALL adc_demo ;調用AD子程序
AJMP LOOP
;―――――――――――――――――――――――――
; 啟動AD轉換
;―――――――――――――――――――――――――
Adc_Start:
CLR ad_cs
NOP
CLR ad_wr
NOP
SETB ad_wr
NOP
SETB ad_cs
NOP
RET
;―――――――――――――――――――――――――
; 讀AD轉換
;―――――――――――――――――――――――――
Adc_Read:
MOV AD_INPUT_PORT,#0FFH
CLR ad_cs
NOP
CLR ad_rd
NOP
NOP
MOV A,AD_INPUT_PORT
NOP
SETB ad_rd
NOP
SETB ad_cs
RET
;―――――――――――――――――――――――
; AD轉換讀取延時程序,顯示讀到的數值
;―――――――――――――――――――――――
Adc_Demo:
LCALL Adc_Start
LCALL delay1ms
LCALL adc_read
MOV B,#100 ; AD轉換出的值除100商為百位數
DIV AB ; 取百位數 余數在B寄存器
MOV DISPBUF,A ; 把百位存入百位寄存器DISPBUF
MOV A,B ; 余數再送A
MOV B,#10 ; 余數除10商為十位數
DIV AB ; 除法,余數在寄存器B
MOV DISPBUF+1,A ; A是十位數存第二位顯示寄存器
MOV DISPBUF+2,B ; B是個位數存第三位顯示寄存器
RET
;――――――――――――――――――――――――――――
; ; 定時器T0的中斷響應,通過中斷服務程序動態掃描
;――――――――――――――――――――――――――――――
DISP:
PUSH ACC ; ACC入棧
PUSH PSW ; PSW入棧
MOV TH0,#HIGH(65536-2000); 定時時間為2000個周期,約2170微秒
MOV TL0,#LOW(65536-2000)
SETB FIRST
SETB SECOND ; 關顯示
SETB THEER
MOV A,#DISPBUF ; 顯示緩沖區首地址
ADD A,Counter
MOV R0,A
MOV A,@R0 ; 根據計數器的值取相應的顯示緩沖區的值
MOV DPTR,#DISPTAB ; 字形表首地址
MOVC A,@A+DPTR ; 取字形碼
MOV P0,A ; 將字形碼送P0位(段口)
MOV A,Counter ; 取計數器的值
JZ DISPFIRST ; 如果是0則顯示第一位
DEC A
JZ DISPSECOND ; 如果是1顯示第二位
CLR THEER ; 否則顯示第3位
AJMP DISPNEXT
DISPFIRST:
CLR FIRST ; 顯示第一位
AJMP DISPNEXT
DISPSECOND:
CLR SECOND
DISPNEXT:
INC Counter ; 計數器加1
MOV A,Counter
DEC A ; 如果計數器計到3,則讓它回0
DEC A
DEC A
JZ RSTCOUNT
AJMP DISPEXIT
RSTCOUNT:
MOV Counter,#0 ; 計數器的值回0
DISPEXIT:
POP PSW
POP ACC
RETI
DISPTAB:DB 28h,7eh,0a2h,62h,74h,61h,21h,7ah,20h,60h ; 字形代碼表
;0 1 2 3 4 5 6 7 8 9
DELAY1ms: ; 延時子程序
MOV R7,#10
MM:
MOV R6,#50
DJNZ R6,$ ;2us
DJNZ R7,MM
RET
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -