MC68HC908RF2是M68HC08家族中的一員,采用增強型內核,是專為無匙進入系統(RKE)的發射端設計的一款性價比較高的微控制器。它的主要特點如下:
⑴ 高性能的M68HC08結構
⑵ 在3.3V供電時的內部總線頻率為4MHz
⑶ 2K字節可加密閃速存儲器
⑷ 128字節的片上隨機存儲器
⑸ 2個16位的定時器
⑹ 12個通用IO口,其中6個具有鍵盤喚醒功能
⑺ 1個外部中斷管腳,內部有上拉電阻
⑻ 1個高頻發射模塊
系統框圖
原理圖如圖1示。
⑴ 電源系統
系統采用3V的鈕扣電8池供電,MC68HC908RF2具有停止模式(STOP MODE),功耗非常低。
⑵ 鍵盤掃描
系統接入3個鍵盤,分別作為上鎖、解鎖、尋車功能。接入PORTA口的A1、A2、A3。當按下任一鍵盤時將CPU08喚醒,并進入相應的中斷處理程序中。處理完畢后,重新進入停止模式(STOP MODE)。
⑶ LED指示
將PORTA口的A7作為輸出,控制LED的點亮、熄滅。
⑷ 高頻發射
高頻發射模塊的相應功能管腳如圖2。
圖2 高頻發射模塊(UHF)功能管腳
各功能管腳的作用如下:
VCC:電源管腳。
MODE:模式選擇,接高電平時選擇FSK模式,接低電平時選擇OOK模式,在本系統中采用OOK方式,MODE接低電平。
ENABLE: 高頻發射模塊(UHF)允許,當在該管腳接高電平時,高頻發射模塊(UHF)允許工作,在該管腳接低電平時,禁止高頻發射模塊(UHF)工作,在本系統中,ENABLE管腳與PTA0相連,用PTA0來控制高頻發射模塊(UHF)的狀態。
DATA:數據輸入端與PTB2相連。
BAND:選擇頻段,當接高電平時選擇315MHz和434MHz,如果選擇868MHz時,BAND管腳接低電平。在系統中采用315 MHz發射頻率。
RFOUT:高頻輸出管腳,為了能夠獲得輸出發射功率需在該管腳外部配接少量元件。
GNDRF:接低電平。
REXT:配接12K的下拉電阻。
XTA1,XTA2:如果選擇發射的頻率為315MHz,配接9.84375 MHz的晶振,如果選434MHz的發射頻率配接13.56 MHz的晶振。
DATACLK:數據同步時鐘,與PTB3相連。
CFSK:OOK和FSK模式選擇,懸空選擇OOK模式,接低電平選擇FSK模式。
為了降低系統的功耗,只用在需要發送數據時,才將高頻發射模塊(UHF)置為有效,其余時刻將高頻發射模塊(UHF)置為無效。典型的發射時序列如圖3所示。

圖3 典型發射時序
系統軟件框圖
中斷處理程序流程圖如圖4。
圖4 中斷流程圖
軟件清單
$Include 'C:\pemicro\ics08rkz\rk2regs.inc'
;定義起始地址
RAMStart EQU $0080 ;數據存儲區起開始地址
RomStart EQU $7800 ;程序存儲區起開始地址
VectorStart EQU $FFF2 ;中斷向量表
;定義A口各位的定義
; Porta A
PLLEn equ 0 ; UHF模塊控制位
Row0 equ 1 ; 鍵盤占用PORTA口的PA.1,PA.2,PA.3
Row1 equ 2 ;
Row2 equ 3 ;
Led equ 7 ; Led占用PORTA口的PA.7
ACKK EQU 2
;定義A口各位的方向:PA.0和PA.7定義為輸出,其余定義為輸入
DDRAInit equ %10000001 ;
PortAInit equ %11111111 ;
;定義B口各位的定義
; Porta B
Data equ 2 ; 數據輸出
DClk equ 3 ; 數據時鐘
DDRBInit equ %00000100 ;
PortBInit equ %00000000 ;
org RamStart
;以下為發射數據存儲區
Buffer0 DS 1 ;
Buffer1 DS 1 ;
Buffer2 DS 1 ;
Buffer3 DS 1 ;
Buffer4 DS 1 ;
Buffer5 DS 1 ;
Buffer6 DS 1 ;
CRC DS 1 ;
BitCount DS 1 ;
LastRow DS 1 ;
LastCol DS 1 ;
TxCnt DS 1 ;
TEMP DS 1 ;
; Costanti
Dly300ms equ $03 ;300ms@8Mhz
MinTx equ $01 ;Minimum number of frame
transmitted;//03
FrameDly equ $ff ;Delay between frames
(771*FrameDly cycles)
org RomStart
main
mov #%00000011,CONFIG ;禁止 COP 允許 Stop 指令
rsp ;初始化堆棧指針
clra ;
clrx
clr buffer0 ;
clr buffer1 ;
clr buffer2 ;
clr buffer3 ;
clr buffer4 ;
clr buffer5 ;
clr buffer6 ;
clr crc ;
clr BitCount ;
clr LastRow ;
clr LastCol ;
clr TxCnt ;
clr TEMP;
WarmStart
mov #DDRAInit,DDRA ;初始化PORTA口
mov #PortAInit,PORTA ;
bset led,porta
mov #DDRBInit,DDRB ;初始化PORTB口
mov #PortBInit,PORTB ;
mov #%00100011,INTKBSR ;
mov #%00011110,INTKBIER ;
BSET ACKK,INTKBSR ;
mov #%00100001,INTKBSR ;
StopProc
bclr pllen,porta
STOP
bra StopProc
KeybIRQ
brclr 7,INTKBSR,KeyboardProc ;檢查是否為外部中斷
jmp IRQProc ;不是有效的鍵盤中斷,
退出
KeyboardProc bset 2,INTKBSR ;清除鍵盤中斷標志
clrx
BCLR Led,PORTA ;電亮LED
WaitRow
lda PORTA ;讀取PORTA口數據
coma ;
and #%00011110 ;
lsra ;
bne RowOk ;
dbnza $ ;
dbnzx WaitRow ;如果PORTA口數據為0,一直讀取,直到延時時間到
jmp ExitKeyb 延時到
RowOk
sta LastRow ;Save Row number
clr INTKBIER ;Clear Keyboard interrupt enable bits
lda #%00011110 ;All rows to 1
ora DDRA ;
sta DDRA ;
lda #%00011110 ;
ora PORTA ;
sta PORTA ;
clrx ;
mov #$10,BitCount ;
ColLoop
lda #$40 ;
KeyLoop
dbnzx KeyLoop ;
dbnza KeyLoop ;
;組織待發射數據
SetKey
lda lastrow
lsla
lsla
lsla
lsla
sta Buffer4 ;Init Key Code
LDA ID0
STA Buffer0 ;
lda ID1 ;Init ID
sta Buffer1 ;
lda ID2 ;
sta Buffer2 ;
lda ID3 ;
sta Buffer3 ;
lda #Dly300ms ;Attendi 350ms
psha ;
clra ;
clrx ;
ToggleDly
dbnzx $ ;[3*256=768]
dbnza ToggleDly ;[256*771]
dbnz 1,SP,ToggleDly ;[197379*Dly300ms]
pula ;
lda PORTA ;Check if key still down
and #%01100000 ;
nsa ;
lsra ;
bne NoToggle ;
bset 0,Buffer0 ;鍵盤沒有釋放
NoToggle
;
lda #$01 ;
add Buffer6 ;
sta Buffer6 ;
clra ;
adc Buffer5 ;
sta Buffer5 ;
clc
lda Buffer6 ;
and #$0F ;
beq NoRotate ;
tax
NextRotate
lda Buffer5 ;
rora ;
ror Buffer0 ;
ror Buffer1 ;
ror Buffer2 ;
ror Buffer3 ;
ror Buffer4 ;
ror Buffer5 ;
dbnzx NextRotate ;
NoRotate
ldhx #Buffer0 ;
lda ,X ;
eor 1,X ;
sta 1,X ;
eor 2,X ;
sta 2,X ;
eor 3,X ;
sta 3,X ;
eor 4,X ;
sta 4,X ;
eor 5,X ;
sta 5,X ;
clr CRC ;
ldhx #Buffer0 ;
NextCRCByte LDA ,X
ADD BUFFER1
ADD BUFFER2
ADD BUFFER3
ADD BUFFER4
ADD BUFFER5
ADD BUFFER6
STA CRC
;發送程序
mov #DDRAInit,DDRA ;初始化A口方向寄存器
mov #PortAInit,PORTA ;初始化A口
mov #%00011110,INTKBIER
mov #MinTx,TxCnt ;一共發送3幀相同的數據
bset PLLEn,PORTA ;允許UHF模塊
ldx #FrameDly ;
clra ;
FrameBlank
dbnza $ ;
dbnzx FrameBlank
lda #$0c
;********產生24個TE******************************* *******************
HX301
BCLR Data,PORTB
mov #%00110000,TASCR
ldhx #$0200
sthx TAMODH ;
bclr 5,TASCR ;計數器開始計數
brclr 7,TASCR,* ;Wait
BSET Data,PORTB
mov #%00110000,TASCR
ldhx #$0214
sthx TAMODH ;
bclr 5,TASCR ;計數器開始計數
brclr 7,TASCR,* ;Wait
dbnza HX301
bclr Data,portb
lda #$09
HX302 mov #%00110000,TASCR
ldhx #$023e
sthx TAMODH ;
bclr 5,TASCR ;計數器開始計數
brclr 7,TASCR,* ;Wait
dbnza HX302
NextFrame
ldhx #CRC ;指向CRC的RAM地址
psha ;
NextTxByte
lda #$08 ;
sta 1,SP ;
NextTxBit lda 0,X ;將X+0指向的地址的內容
ACC中
rora ;帶進位位右移
ror 0,X ;將X+0的地址的內容帶進位
右移后結果保存在X+0的地址中
bcs Bit1 ;C位為1跳轉,電平的持續時間為(1/3)T
bit0 mov #%00110000,TASCR ;mov #%00110111,TASCR
bset data,portb
pshx
PSHH
ldhx #$425
sthx tmodh
PULH
pulx
bclr 5,TASCR
brclr 7,TASCR,*
mov #%00110000,TASCR
pshx
PSHH
ldhx #$1E0
sthx tmodh
PULH
pulx
bclr data,portb
bclr 5,TASCR
brclr 7,TASCR,*
jmp bit2
bit1 mov #%00110000,TASCR
pshx
PSHH
ldhx #$1E0
sthx tmodh
PULH
pulx
bset data,portb
bclr 5,TASCR
brclr 7,TASCR,*
mov #%00110000,TASCR
pshx
PSHH
ldhx #$425
sthx tmodh
PULH
pulx
bclr data,portb
bclr 5,TASCR
brclr 7,TASCR,*
bit2 dbnz 1,SP,NextTxBit ;
decx ;
cpx #Buffer0-1 ;
bne NextTxByte ;
pula ;Free stack
clra ;
dbnza $ ;
bset led,porta
tst TxCnt ;
beq ChkKey ;
dbnz TxCnt,NextFrame ;
;檢查鍵盤是否釋放
ChkKey lda PORTA ;
coma ;
and #%00011110 ;
BNE CHKKEY;
bclr PLLEn,PORTA ;禁止UHF模塊
ExitKeyb mov #DDRAInit,DDRA ;
;mov #PortAInit,PORTA ;
mov #%00011110,INTKBIER ;
WaitKeyUp lda PORTA ;
coma ;
and #%00011110 ;
bne WaitKeyUp ;
bset ACKK,INTKBSR;
bset Led,PORTA ;
tst 5,SP ;Test Return Address Low
bne DecLow ;
dec 4,SP ;
DecLow dec 5,SP ;
rti ;
IRQProc bset 6,INTKBSR;Reset IRQ Flag
rti
DUMMY_INT:RTI
ID0 fcb $04
ID1 fcb $05
ID2 fcb $06
ID3 FCB $07
org VectorStart
dw DUMMY_INT ; ICG 中斷
dw DUMMY_INT ; TIM1 溢出中斷
dw DUMMY_INT ; TIM1 通道1中斷
dw DUMMY_INT ; TIM1通道0中斷
dw KeybIRQ ; 外部中斷/鍵盤中斷共享一個
向量
dw DUMMY_INT ; SWI 中斷
dw main ; 復位向量
END