?? 單片機應用技術講座(17)源程序.txt
字號:
單片機應用技術講座(17)源程序
例1:
主程序通信參數的初始化:
M_Address DATA 76H
Syn DATA 0EBH
ORG 0000H
AJMP MAIN
ORG 0023H
AJMP Serial-com
MAIN:.......
ORL SCON, #50H
MOV TMOD,#21H ;
MOV PCON, #80H
MOV TH1, #0E6H;定義通信速率
CLR ET1 ;禁止定時器中斷
....... 略
SETB EA
SETB ES ;開中斷
SETB TR1 ;啟動定時器1
.......略。
上述代碼中,“M_Address EQU 76H”是偽指令定義,定義地址為76H,“Syn”同步字的定義同上。在單片機的中斷系統那一講里,我們曾向讀者介紹,89C51單片機的串行通信口的中斷入口地址是0023H,因此在0023H地址處安排跳轉指令 AJMP Serial-com,當中斷發生時執行Serial-com中斷子程序的任務。
串行ADC TLC2543與單片機的接口源程序
進行AD采樣的51匯編程序如下:
;管腳定義
CLK EQU P1.3
DIN EQU P1.1
DOUT EQU P1.2
CS EQU P1.0
MOV R1,#00H ;0通道方式/通道數據
CLR CLK ;
SETB CS ;
CLR CS ;
MOV R4,#08 ;
MOV A, R1 ;
LOOP1:
MOV C,DOUT ;讀轉換結果
RLC A ;A寄存器左移,移入結果數據位,移出方式/通道控制位
MOV DIN,C ;輸出方式/通道位
SETB CLK ;設置I/O時鐘為高
CLR CLK ;清I/O時鐘
DJNZ R4,LOOP1 ;R4不為0,則返回LOOP1
MOV R2,A ;轉換結果的高8位放到R2中
MOV A,#00H ;復位A寄存器
MOV R4,#04 ;再讀低4位
LOOP2:
MOV C,DOUT ;讀轉換結果
RLC A ;A寄存器左移,移入結果數據位
SETB CLK ;設置I/O時鐘為高
CLR CLK ;清I/O時鐘
DJNZ R4,LOOP2 ;R4不為0,則返回LOOP2
MOV R3,A ;轉換結果的低4位放到R3中
SETB CS ;
STOP:AJMP STOP
介紹一種4×4鍵盤程序的設計源程序
附:源程序KeyBord.asm
K0 equ 01h
K1 equ 02h
K2 equ 03h
K3 equ 04h
K4 equ 05h
K5 equ 06h
K6 equ 07h
K7 equ 08h
K8 equ 09h
K9 equ 0ah
Ka equ 0bh
Kb equ 0ch
Kc equ 0dh
Kd equ 0eh
Ke equ 0fh
Kf equ 010h
;***************************************************************變量定義
KeyData equ 30h ;存放鍵碼
KeyClick equ KeyData+1 ;去抖動延時變量
KeyDBClick equ KeyClick+1 ;連擊延時變量
KeyMode equ KeyDBClick+1;鍵譯程序的任務指針
;***************************************************************常量定義
Click20mS equ 2 ;20mS延時(主程序執行時間=10mS)
DBClick3S equ 0 ;連擊延時3S
DBClick100mS equ 10 ;連擊間隔時間100mS
KeyPort equ p1 ;鍵盤連接的端口
KeyAnlData equ 0f0h ;掩膜碼
;*************************************************************************
KeyBord:
mov a,KeyMode
cjne a,#0,key_bo1
;read port for key
mov KeyData,#0
mov r2,#04d
mov r3,#01d
scan:
mov a,r3
cpl a
mov KeyPort,a
mov a,KeyPort
anl a,#KeyAnlData
cjne a,#KeyAnlData,key_bo12
mov a,r3
rl a
mov r3,a
djnz r2,scan
ret
key_bo12:
mov KeyClick,#Click20mS
mov KeyMode,#01
ret
;****************************
key_bo1:
cjne a,#1,key_bo2
;jb Click20mS
djnz KeyClick,key_bo1_end
;count KeyData
mov KeyData,#0
mov r2,#04d
mov r3,#01d
scan1:
mov a,r3
cpl a
mov KeyPort,a
mov a,KeyPort
anl a,#KeyAnlData
cjne a,#KeyAnlData,key_bo24
mov a,r3
rl a
mov r3,a
djnz r2,scan1
mov KeyMode,#0
setb beep;12.10
key_bo1_end:
ret
key_bo24:
;*** beep
clr Beep ;打開蜂鳴器
;****count KeyData
call CountKeyData
mov KeyClick,KeyDubClick ;3s
mov KeyMode,#02
key_bo22:
ret
;*****************************
key_bo2:
cjne a,#2,key_bo3
djnz KeyClick,key_bo32
;********setb KeyData.6=1
mov a,KeyData
setb acc.6
;**** d7 =1
setb acc.7
;************
mov KeyData,a
;****
mov KeyDubClick,#DBClick100mS
sjmp key_bo33
key_bo32:
;***** 判別釋放
;;;;!!!!!!!!!!!!
mov r2,#04d
mov r3,#01d
scan2:
mov a,r3
cpl a
mov KeyPort,a
mov a,KeyPort
anl a,#KeyAnlData
cjne a,#KeyAnlData,key_bo3;沒有釋放
mov a,r3
rl a
mov r3,a
djnz r2,scan2
;***** use KeyData
mov a,KeyData
setb acc.7
mov KeyData,a
mov KeyDubClick,#DBClick3S
key_bo33:
mov KeyMode,#0
key_bo3:
ret
;***********************************
CountKeyData:
cpl a
add a,r3
mov r4,a
mov a,r4
cjne a,#97h,no_1
mov KeyData,#K0
no_1:
cjne a,#57h,no_2
mov KeyData,#k1
no_2:
cjne a,#37h,no_3
mov KeyData,#k2
no_3:
cjne a,#93h,no_4
mov KeyData,#k3
no_4:
cjne a,#53h,no_5
mov KeyData,#k4
no_5:
cjne a,#33h,no_6
mov KeyData,#k5
no_6:
cjne a,#91h,no_7
mov KeyData,#k6
no_7:
cjne a,#51h,no_8
mov KeyData,#k7
no_8:
cjne a,#31h,no_9
mov KeyData,#k8
no_9:
cjne a,#90h,no_10
mov KeyData,#k9
no_10:
cjne a,#23h,no_11
mov KeyData,#ka
no_11:
cjne a,#21h,no_12
mov KeyData,#kb
no_12:
cjne a,#50h,no_13
mov KeyData,#Kc
no_13:
cjne a,#30h,no_14
mov KeyData,#Kd
no_14:
cjne a,#27h,no_15
mov KeyData,#Kf
no_15:
ret
;***************************************************
proc KeyJmp ;用戶鍵功能處理程序
KeyJmp:
;*****************
mov a,KeyData
jbc acc.7 ,use_k1
ret
use_k1:
jbc acc.6 ,use_k_3s
;*** click do
mov KeyData,#0
;單擊處理。。。
use_k_3s: ;delay 3s click do
mov KeyData,#0
;** DubClick Kc 0.1s
;連擊處理。。。
key_jmpend:
ret
end
程序使用說明
(1) 為了便于修改各按鍵對應的功能,以及提高鍵掃描的效率,在程序的開頭定義了一個鍵值表,只需改動K0-Kf的上下位置即可(右邊的十進制代碼,不能改動!)。在用戶的鍵散轉處理程序中,用#K0-#Kf代替按鍵值。
K0 equ 01h
K1 equ 02h
K2 equ 03h
K3 equ 04h
K4 equ 05h
K5 equ 06h
K6 equ 07h
K7 equ 08h
K8 equ 09h
K9 equ 0ah
Ka equ 0bh
Kb equ 0ch
Kc equ 0dh
Kd equ 0eh
Ke equ 0fh
Kf equ 010h
(2)鍵譯程序使用的變量、常量說明
;*******變量定義
KeyData ;存放鍵碼
KeyClick ;去抖動延時變量
KeyDBClick ;連擊延時變量
KeyMode ;鍵譯程序的任務指針
;******常量定義
Click20mS ;20mS延時(主程序執行時間=10mS)
DBClick3S ;連擊延時3S
DBClick100mS ;連擊間隔時間100mS
KeyPort ;鍵盤連接的端口
(3) 單擊、連擊的判別
在KeyData變量的D6位代表:0=單擊、1=連擊;D7位代表此鍵碼是否有效。(見圖四)
(4)在主程序中蘊涵鍵譯程序:include “KeyBord.asm”
(5)根據實際情況修改常量的數值。
作者聯系信箱:E-mail:lj87c196@163.com
程序說明:此文檔是該系統操作運行的所有程序,所提供的程序均在DICE-51單片仿真機上調試仿真,并已經全部通過。
源程序:
ORG 0000H
AJMP MAIN
ORG 0003H
AJMP KEYS
ORG 000BH
AJMP PTT0
ORG 001BH
AJMP PTT1 ;中斷入口及優先級
MAIN: MOV SP,#60H
CLR 5EH
CLR 5FH ;清上、下限越限標志
MOV A,#00H
MOV R7,#09H
MOV R0,#28H
LP1: MOV @R0,A
INC R0
DJNZ R7,LP1
MOV R7,#06H
MOV R0,#39H
LP2: MOV @R0,A
INC R0
DJNZ R7,LP2 ;清變量暫存單元
MOV R7,#06H
MOV R0,#50H
LP3: MOV @R0,A
INC R0
DJNZ R7,LP3 ;清顯示緩沖區
MOV 33H,#H
MOV 34H,#H ;賦Kp高、低字節
MOV 35H,#H
MOV 36H,#H ;賦Ki高、低字節
MOV 37H,#H
MOV 38H,#H ;賦Kd高、低字節
MOV 42H,#H
MOV 43H,#H ;賦K高、低字節(風扇參數)
MOV TMOD,#56H ;T0方式2,T1方式1計數
MOV TL0,#06H
MOV TH0,#06H ;T0賦初值
MOV 25H,#28H ;設定值默認為40攝氏度
SETB TR0 ;鍵盤高優先級
SETB ET0
SETB EX0
SETB EA ;開鍵盤、T0、T1中斷
LOOP: MOV R0,#56H
MOV R1,#55H
LCALL SCACOV ;調用標度轉化-BCD轉化子程序
MOV R0,#53H
LCALL DIR
NOP
LCALL DLY10MS
NOP
LCALL DLY10MS
AJMP LOOP ;等待中斷,循環顯示當前溫度
;****************************************************************************
KEYS: CLR EX0 ;[鍵盤子程序]
CLR EA
PUSH PSW
PUSH ACC ;關中斷,壓棧
LCALL DLY10MS ;消抖
CC: JB P3.2,AA
SETB 5DH ;置“顯示設定溫度”標志
MOV A,25H ;取運算位的值(默認為40度)
MOV B,#10 ;進行BCD碼轉化
DIV AB
MOV 52H,A
MOV A,B
MOV 51H,A
MOV R0,#50H
LCALL DIR ;顯示設定溫度
NOP
LCALL DLY10MS
NOP
LCALL DLY10MS
JB P1.7,BB
MOV R1,#25H
LCALL DAAD1 ;加一操作
NOP
LCALL DLY10MS
AJMP CC
BB: JB P1.6,CC
MOV R1,#25H
LCALL DEEC1 ;減一操作
NOP
LCALL DLY10MS
AJMP CC
AA: POP ACC
POP PSW
SETB EX0
SETB EA ;出棧,開中斷
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -