|
硬件:AT89s52開發(fā)板(含4x4數(shù)字鍵盤)
功能: 用按鍵選擇不同頻率方波,由P1.0輸出方波音頻信號
作者:Kxuan163
匯編語言源程序如下:
;;--------------------------------------------
ORG 0000H
AJMP MAIN
;;--------------------------------------------
ORG 001BH ;定時器T1中斷處理入口地址
AJMP T1_INT
;;--------------------------------------------
ORG 0030H ;主程序入口地址
MAIN: MOV SP,#60H
MOV 30H,#16 ;開機(jī)/復(fù)位顯示“-”,16是段碼表"-"偏移址
LOOP1: CALL KEY_SCAN ;掃描鍵盤
CALL KEYPLAER ;顯示按鍵數(shù)字
;;CLR P1.0 ;令輸出的初始狀態(tài)為低電平
MOV A, 30H ;按鍵順序號送至A
CJNE A, #16, OnKeyJmp ;若有按鍵,依鍵號跳轉(zhuǎn)某程序段
JMP LOOP1 ;若無按鍵,繼續(xù)掃描鍵盤
OnKeyJmp: RL A ;每條AJMP指令占2字節(jié),按鍵順序號x2
MOV DPTR, #JmpTab ;散轉(zhuǎn)表首址送DPTR
JMP @A +DPTR ;依按鍵散轉(zhuǎn)
JmpTab: AJMP LOOP1 ;按0鍵,
AJMP OUT100 ;按1鍵,輸出100Hz方波
AJMP OUT200 ;按2鍵,輸出200Hz方波
AJMP OUT300 ;按3鍵,輸出300Hz方波
AJMP OUT400 ;按4鍵,輸出400Hz方波
AJMP OUT500 ;按5鍵, 輸出500Hz方波
AJMP OUT600 ;按6鍵, 輸出600Hz方波
AJMP LOOP1 ;按7鍵,
AJMP LOOP1 ;按8鍵,
AJMP LOOP1 ;按9鍵,
AJMP LOOP1 ;按A鍵,
AJMP LOOP1 ;按b鍵,
AJMP LOOP1 ;按C鍵,
AJMP LOOP1 ;按D鍵,
AJMP LOOP1 ;按E鍵,
AJMP LOOP1 ;按F鍵,
;;---------------------------------------------
KEY_SCAN: MOV P1,#0F0H ;置列線為0,行線為1
MOV A,P1
ANL A,#0F0H
MOV B,A
MOV P1,#0FH ;置列線為1,行線為0
MOV A,P1
ANL A,#0FH
ORL A,B ;高四位與低四位重新組合
CJNE A,#0FFH,KEY_IN1 ;0FFH為末按鍵
RET
KEY_IN1: MOV B,A
MOV DPTR,#KEYTABLE
MOV R3,#0FFH ;
KEY_IN2: INC R3 ;順序碼加1
MOV A,R3
MOVC A,@A+DPTR
CJNE A,B,KEY_IN3
MOV A,R3 ;找到,取順序碼
MOV 30H,A ;送顯示
RET
KEY_IN3: CJNE A,#00H,KEY_IN2 ;末完,繼續(xù)查
RET ;00H為結(jié)束碼
;;-------------------------------------------
KEYPLAER: MOV R3, 30H
MOV A, 30H
MOV DPTR,#TABLE ;取段碼表地址
MOVC A,@A+DPTR ;查顯示數(shù)據(jù)對應(yīng)段碼
MOV P0,A ;段碼放入P0口
CLR P2.7 ;最右數(shù)碼管亮
RET
;;--------------------------------------------
;定時器T1預(yù)裝計數(shù)初值的計算:
;機(jī)器周期 =12/Fosc =12/(11.0592MHz) =1.08506944μs ≈1μs
;100Hz的半周期=(1/100)/2=5ms, 計數(shù)初值=65536-5000=60536=EC78h
;200Hz的半周期=(1/200)/2=2.5ms, 計數(shù)初值=65536-2500=63036=F63Ch
;300Hz的半周期=(1/250)/2=1.667ms,計數(shù)初值=65536-1667=63869=F97Dh
;400Hz的半周期=(1/400)/2=1.25ms, 計數(shù)初值=65536-1250=64286=FB1Eh
;500Hz的半周期=(1/500)/2=1ms, 計數(shù)初值=65536-1000=64536=FC18h
;600Hz的半周期=(1/600)/2=0.833ms,計數(shù)初值=65536-0833=64703=FCBFh
;;--------------------------------------------
OUT100: MOV R3,#0ECh ;;T1初值高8位
MOV R4,#78h ;;T1初值低8位
AJMP SET_T1 ;;T1初始化
;;--------------------------------------------
OUT200: MOV R3,#0F6h
MOV R4,#3Ch
AJMP SET_T1
;;--------------------------------------------
OUT300: MOV R3,#0F9h
MOV R4,#7Dh
AJMP SET_T1
;;--------------------------------------------
OUT400: MOV R3,#0FBh
MOV R4,#1Eh
AJMP SET_T1
;;--------------------------------------------
OUT500: ;;P1.0輸出500Hz方波
MOV R3,#0FCh
MOV R4,#18h
AJMP SET_T1
;;--------------------------------------------
OUT600: ;;P1.0輸出600Hz方波
MOV R3,#0FCh
MOV R4,#0BFh
AJMP SET_T1
;;--------------------------------------------
SET_T1: ;; T1初始化:
MOV TMOD, #00010000b ;; T1,定時模式,方式1,16位計數(shù)器
MOV TH1, R3 ;; 裝入計數(shù)初值高字節(jié)
MOV TL1, R4 ;; 裝入計數(shù)初值低字節(jié)
SETB TR1 ;; 啟動T1
SETB ET1 ;; 允許T1中斷
SETB EA ;; CPU開中斷
SJMP $ ;; 等待T1中斷
;;--------------------------------------------
T1_INT: ;; 定時器T1中斷處理程序
CPL P1.0 ;; 電平反轉(zhuǎn),進(jìn)入方波另半周期
MOV TH1, R3 ;; 重裝初值高8位
MOV TL1, R4 ;; 重裝初值低8位
RETI
;;--------------------------------------------
DLY1ms: MOV R6,#5 ;視覺暫留延時1ms
MOV R7,#100
DLY1msB: DJNZ R7,$
DJNZ R6,DLY1msB
RET
;; 5x100x2(1μs) =1000μs =1ms
;;--------------------------------------------
DLY2s: ;延時2000ms =2s
MOV R7,#16
DLY2sA: MOV R6,#250
DLY2sB: MOV R5,#250
DJNZ R5,$
DJNZ R6,DLY2sB
DJNZ R7,DLY2sA
RET
;; 16x250*250*2(1μs) =2000 0000μs =2s
;;--------------------------------------------
KEYTABLE: DB 0EEH,0EDH,0EBH,0E7H,0DEH ;0,1,2,3,4, 順序碼
DB 0DDH,0DBH,0D7H,0BEH,0BDH ;5,6,7,8,9,
DB 0BBH,0B7H,07EH,07DH,07BH ;A,B,C,D,E,
DB 077H,00H ;F, 00為結(jié)束碼
;;---------------------------------------------
;;共陽極數(shù)碼段碼表:
;;字符 0 1 2 3 4 5 6 7
TABLE: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H
;;------------------------------------------
;;字符 8 9 A b C d E F 中橫 上橫 下橫
DB 80H,90H,88H,83H,0C6H,0A1H,86H,8EH,0BFH,0FEH,0F7H
;;--------------------------------------------
;;字符 . P U Γ Y 8. "滅" Π L J
DB 7FH,82H,0C1H,0CEH,91H,00H,0FFH,0C8H,0C7H,0F1H
;;--------------------------------------------
END ;主程序結(jié)束
|
|