?? 單片機(jī)應(yīng)用技術(shù)講座(17)源程序.txt
字號(hào):
例1:
主程序通信參數(shù)的初始化:
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 ;禁止定時(shí)器中斷
....... 略
SETB EA
SETB ES ;開(kāi)中斷
SETB TR1 ;啟動(dòng)定時(shí)器1
.......略。
上述代碼中,“M_Address EQU 76H”是偽指令定義,定義地址為76H,“Syn”同步字的定義同上。在單片機(jī)的中斷系統(tǒng)那一講里,我們?cè)蜃x者介紹,89C51單片機(jī)的串行通信口的中斷入口地址是0023H,因此在0023H地址處安排跳轉(zhuǎn)指令 AJMP Serial-com,當(dāng)中斷發(fā)生時(shí)執(zhí)行Serial-com中斷子程序的任務(wù)。
串行ADC TLC2543與單片機(jī)的接口源程序
進(jìn)行AD采樣的51匯編程序如下:
;管腳定義
CLK EQU P1.3
DIN EQU P1.1
DOUT EQU P1.2
CS EQU P1.0
MOV R1,#00H ;0通道方式/通道數(shù)據(jù)
CLR CLK ;
SETB CS ;
CLR CS ;
MOV R4,#08 ;
MOV A, R1 ;
LOOP1:
MOV C,DOUT ;讀轉(zhuǎn)換結(jié)果
RLC A ;A寄存器左移,移入結(jié)果數(shù)據(jù)位,移出方式/通道控制位
MOV DIN,C ;輸出方式/通道位
SETB CLK ;設(shè)置I/O時(shí)鐘為高
CLR CLK ;清I/O時(shí)鐘
DJNZ R4,LOOP1 ;R4不為0,則返回LOOP1
MOV R2,A ;轉(zhuǎn)換結(jié)果的高8位放到R2中
MOV A,#00H ;復(fù)位A寄存器
MOV R4,#04 ;再讀低4位
LOOP2:
MOV C,DOUT ;讀轉(zhuǎn)換結(jié)果
RLC A ;A寄存器左移,移入結(jié)果數(shù)據(jù)位
SETB CLK ;設(shè)置I/O時(shí)鐘為高
CLR CLK ;清I/O時(shí)鐘
DJNZ R4,LOOP2 ;R4不為0,則返回LOOP2
MOV R3,A ;轉(zhuǎn)換結(jié)果的低4位放到R3中
SETB CS ;
STOP:AJMP STOP
介紹一種4×4鍵盤(pán)程序的設(shè)計(jì)源程序
附:源程序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 ;去抖動(dòng)延時(shí)變量
KeyDBClick equ KeyClick+1 ;連擊延時(shí)變量
KeyMode equ KeyDBClick+1;鍵譯程序的任務(wù)指針
;***************************************************************常量定義
Click20mS equ 2 ;20mS延時(shí)(主程序執(zhí)行時(shí)間=10mS)
DBClick3S equ 0 ;連擊延時(shí)3S
DBClick100mS equ 10 ;連擊間隔時(shí)間100mS
KeyPort equ p1 ;鍵盤(pán)連接的端口
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 ;打開(kāi)蜂鳴器
;****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;沒(méi)有釋放
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 ;用戶(hù)鍵功能處理程序
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
程序使用說(shuō)明
(1) 為了便于修改各按鍵對(duì)應(yīng)的功能,以及提高鍵掃描的效率,在程序的開(kāi)頭定義了一個(gè)鍵值表,只需改動(dòng)K0-Kf的上下位置即可(右邊的十進(jìn)制代碼,不能改動(dòng)!)。在用戶(hù)的鍵散轉(zhuǎn)處理程序中,用#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)鍵譯程序使用的變量、常量說(shuō)明
;*******變量定義
KeyData ;存放鍵碼
KeyClick ;去抖動(dòng)延時(shí)變量
KeyDBClick ;連擊延時(shí)變量
KeyMode ;鍵譯程序的任務(wù)指針
;******常量定義
Click20mS ;20mS延時(shí)(主程序執(zhí)行時(shí)間=10mS)
DBClick3S ;連擊延時(shí)3S
DBClick100mS ;連擊間隔時(shí)間100mS
KeyPort ;鍵盤(pán)連接的端口
(3) 單擊、連擊的判別
在KeyData變量的D6位代表:0=單擊、1=連擊;D7位代表此鍵碼是否有效。(見(jiàn)圖四)
(4)在主程序中蘊(yùn)涵鍵譯程序:include “KeyBord.asm”
(5)根據(jù)實(shí)際情況修改常量的數(shù)值。
作者聯(lián)系信箱:E-mail:lj87c196@163.com
程序說(shuō)明:此文檔是該系統(tǒng)操作運(yùn)行的所有程序,所提供的程序均在DICE-51單片仿真機(jī)上調(diào)試仿真,并已經(jīng)全部通過(guò)。
源程序:
ORG 0000H
AJMP MAIN
ORG 0003H
AJMP KEYS
ORG 000BH
AJMP PTT0
ORG 001BH
AJMP PTT1 ;中斷入口及優(yōu)先級(jí)
MAIN: MOV SP,#60H
CLR 5EH
CLR 5FH ;清上、下限越限標(biāo)志
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 ;清顯示緩沖區(qū)
MOV 33H,#H
MOV 34H,#H ;賦Kp高、低字節(jié)
MOV 35H,#H
MOV 36H,#H ;賦Ki高、低字節(jié)
MOV 37H,#H
MOV 38H,#H ;賦Kd高、低字節(jié)
MOV 42H,#H
MOV 43H,#H ;賦K高、低字節(jié)(風(fēng)扇參數(shù))
MOV TMOD,#56H ;T0方式2,T1方式1計(jì)數(shù)
MOV TL0,#06H
MOV TH0,#06H ;T0賦初值
MOV 25H,#28H ;設(shè)定值默認(rèn)為40攝氏度
SETB TR0 ;鍵盤(pán)高優(yōu)先級(jí)
SETB ET0
SETB EX0
SETB EA ;開(kāi)鍵盤(pán)、T0、T1中斷
LOOP: MOV R0,#56H
MOV R1,#55H
LCALL SCACOV ;調(diào)用標(biāo)度轉(zhuǎn)化-BCD轉(zhuǎn)化子程序
MOV R0,#53H
LCALL DIR
NOP
LCALL DLY10MS
NOP
LCALL DLY10MS
AJMP LOOP ;等待中斷,循環(huán)顯示當(dāng)前溫度
;****************************************************************************
KEYS: CLR EX0 ;[鍵盤(pán)子程序]
CLR EA
PUSH PSW
PUSH ACC ;關(guān)中斷,壓棧
LCALL DLY10MS ;消抖
CC: JB P3.2,AA
SETB 5DH ;置“顯示設(shè)定溫度”標(biāo)志
MOV A,25H ;取運(yùn)算位的值(默認(rèn)為40度)
MOV B,#10 ;進(jìn)行BCD碼轉(zhuǎn)化
DIV AB
MOV 52H,A
MOV A,B
MOV 51H,A
MOV R0,#50H
LCALL DIR ;顯示設(shè)定溫度
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 ;出棧,開(kāi)中斷
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -