以下介紹幾種在S3F9454/9444下驅動蜂鳴器的編程示例,供參考
A.第一種,普通IO高低電平驅動法
;運行環境: S3F9454,Fosc= 3.2MHZ無分頻
;P2.0為蜂鳴輸出端口
;本例輸出頻率為4KHZ,即每250US一個周期,高低電平時間分別為125US
BEEP:
LD BTCON,#10100011B ;看門狗禁用
DI
PUSH R5
PUSH R6
;首先配置P2.0為普通推挽輸出端口
AND P2CONL,#0FEH
OR P2CONL,#02H
LD R6,#0FAH ;R6設置輸出方波個數,本例為250個(計時62.5MS)
ONE_BEEP:
LD R5,#27H ;R5為頻率發生計時器,本例為近似125US(4KHZ)
XOR P2,#01H
_LOOP:
DEC R5
JR NZ,_LOOP
DEC R6
JR NZ,ONE_BEEP
LD BTCON,#02H ;恢復看門狗運行
EI
POP R6
POP R5
RET
;-----------------------------------------------------------
B.利用P2.0配置為T0定時器匹配輸出方式產生
;注: 該方式可用于帶多位數碼顯示掃描的軟件中,可有效避免因蜂鳴器
;輸出而造成的數碼顯示抖動閃爍
;因定時器T0被分配作為T0匹配輸出定時器,所以本例中利用看門狗定時器
;的實時計時器BTCNT作為數碼顯示實時掃描計時器
;R0為蜂鳴時間長短計時器,由主調用程序進行予設置
;運行環境: S3F9454,Fosc= 3.2MHZ無分頻
;P2.0為蜂鳴輸出端口
;本例輸出頻率為4KHZ,即每250US一個周期,高低電平時間分別為125US
;-----------------------
BEEP:
DI
PUSH R1
PUSH T0CON
PUSH T0DATA
;在蜂鳴輸出前首先掃描一次數碼顯示
CALL LED_SCAN
OR P2CONL,#03H ;set P2.0 as T0 match output/every 125us
LD T0CON,#10001000B ;set T0 input clock=Fosc/8
LD T0DATA,#32H
LD BTCON,#10100011B ;Disable Watch-dog run,
;but btcnt clk input fxx/4096=1.280ms
NEXT_BEEP:
LD R1,#0AH
WAIT_CNT:
OR BTCON,#02H
_WAIT_CNT:
CP BTCNT,#02H
JR ULT,_WAIT_CNT
OR BTCON,#02H ;清看門狗定時器
CALL LED_SCAN ;每計時2.56MS,則轉去實時掃描一次數碼顯示
DEC R1
JR NZ,WAIT_CNT
DEC R0
JR NZ,NEXT_BEEP
LD BTCON,#02H
AND P2CONL,#0FEH ;set T0 as push-pull output
AND P2,#0FEH
POP T0DATA
POP T0CON
POP R1
EI
RET
A.第一種,普通IO高低電平驅動法
;運行環境: S3F9454,Fosc= 3.2MHZ無分頻
;P2.0為蜂鳴輸出端口
;本例輸出頻率為4KHZ,即每250US一個周期,高低電平時間分別為125US
BEEP:
LD BTCON,#10100011B ;看門狗禁用
DI
PUSH R5
PUSH R6
;首先配置P2.0為普通推挽輸出端口
AND P2CONL,#0FEH
OR P2CONL,#02H
LD R6,#0FAH ;R6設置輸出方波個數,本例為250個(計時62.5MS)
ONE_BEEP:
LD R5,#27H ;R5為頻率發生計時器,本例為近似125US(4KHZ)
XOR P2,#01H
_LOOP:
DEC R5
JR NZ,_LOOP
DEC R6
JR NZ,ONE_BEEP
LD BTCON,#02H ;恢復看門狗運行
EI
POP R6
POP R5
RET
;-----------------------------------------------------------
B.利用P2.0配置為T0定時器匹配輸出方式產生
;注: 該方式可用于帶多位數碼顯示掃描的軟件中,可有效避免因蜂鳴器
;輸出而造成的數碼顯示抖動閃爍
;因定時器T0被分配作為T0匹配輸出定時器,所以本例中利用看門狗定時器
;的實時計時器BTCNT作為數碼顯示實時掃描計時器
;R0為蜂鳴時間長短計時器,由主調用程序進行予設置
;運行環境: S3F9454,Fosc= 3.2MHZ無分頻
;P2.0為蜂鳴輸出端口
;本例輸出頻率為4KHZ,即每250US一個周期,高低電平時間分別為125US
;-----------------------
BEEP:
DI
PUSH R1
PUSH T0CON
PUSH T0DATA
;在蜂鳴輸出前首先掃描一次數碼顯示
CALL LED_SCAN
OR P2CONL,#03H ;set P2.0 as T0 match output/every 125us
LD T0CON,#10001000B ;set T0 input clock=Fosc/8
LD T0DATA,#32H
LD BTCON,#10100011B ;Disable Watch-dog run,
;but btcnt clk input fxx/4096=1.280ms
NEXT_BEEP:
LD R1,#0AH
WAIT_CNT:
OR BTCON,#02H
_WAIT_CNT:
CP BTCNT,#02H
JR ULT,_WAIT_CNT
OR BTCON,#02H ;清看門狗定時器
CALL LED_SCAN ;每計時2.56MS,則轉去實時掃描一次數碼顯示
DEC R1
JR NZ,WAIT_CNT
DEC R0
JR NZ,NEXT_BEEP
LD BTCON,#02H
AND P2CONL,#0FEH ;set T0 as push-pull output
AND P2,#0FEH
POP T0DATA
POP T0CON
POP R1
EI
RET





