www.pudn.com > st-asm.rar > keycspk.asm


;ST套件产生汽车防盗器报警声 
;本实例的目的是让大家学会用单片机产生声音的方法,学会计算程序所用时间 
;本实例的功能是能PIC16F84产生汽车防盗器的报警声,频率分两个0.1s第一个 
;0.1S频率从1.8K-3.5K匀速增加第二个0.1S频率从3.5K-1.8K匀速减少, 
;程序复位后,按S2喇叭叫两声,按S3喇叭叫15秒,中途可按S5停止. 
;PIC单片机学习网-----http://www.pic16.com 
;烧写时应注意:配置位已经在程序中写明,加载HEX文件时会自动加载,烧写时不用再手动设置配置位。 
;实验时请注意套件跳线选择; 
;***************************************************** 
  LIST P=16F84A,R=DEC         ;定义器件,默认为十进制 
;----------------------------------------------------- 
  __CONFIG B'11111111110001';_CP_OFF&_WDT_OFF&_PWRITE_ON&_XT_OSC  
                                              ;没有代码保护 
                                              ;看门狗关闭 
                                              ;上电廷时器开启 
                                              ;振荡器模式为XT 
;----------------------------------------------------- 
RTCC EQU 01H                ;定义各寄存器 
PC EQU 02H 
STATUS EQU 03H 
C EQU 0 
RP0 EQU 5 
;---------------------- 
PORTA EQU 05H 
PORTB EQU 06H 
 
TRISA EQU 5H 
TRISB EQU 6H 
;----------------------- 
SOUNDDELAY1 EQU 10H    ;声音频率变化计数器,从1.8~3.55KHZ 
FRE_COUNT EQU 11H      ;同一频率的重复次数保存地址 
FRE_REPEAT EQU 12H      
SOUND_TEMP EQU 13H 
TEMP EQU 14H           ;暂存寄存器 
S_LOOP EQU 46          ;93-47=46 
S_MAX EQU 93           ;最低频率1.8K  93*3=280US*2 
S_MIN EQU 47           ;最高频率3.55K  47*3=140*2 
S_REPEAT EQU 4         ;同一频率重复次数 
;----------------------RA 
KEY1 EQU 3 
KEY2 EQU 4 
;----------------------RB 
KEY3 EQU 0 
KEY4 EQU 1 
;-------------------- 
    ORG 0000H 
MAIN 
    CLRF PORTA 
    CLRF PORTB          ;初始化IO口 
 
    BSF STATUS,RP0     ;设置数据寄存器体1 
    MOVLW 0011000B 
    MOVWF TRISA        ;设置各开关端口为输入其它为输出 
    MOVLW 00000011B 
    MOVWF TRISB  
    BCF STATUS,RP0     ;恢复数据寄存器体0 
LOOP 
    BTFSS PORTA,KEY1   ;扫描按键 
    GOTO SET_1 
    BTFSS PORTA,KEY2 
    GOTO SET_2 
    GOTO LOOP 
;-------------------------------------------- 
SET_1 
    BTFSC PORTA,KEY1    ;去抖动 
    GOTO LOOP 
    CALL SOUNDDELAY 
    BTFSC PORTA,KEY1    ;按S2叫两声 
    GOTO LOOP 
    CALL SOUND200MS 
    CALL SOUND200MS 
    GOTO LOOP 
;-------------------------------------------- 
SET_2 
    BTFSC PORTA,KEY2    ;去抖动 
    GOTO LOOP 
    CALL SOUNDDELAY 
    BTFSC PORTA,KEY2    ;按S3叫15秒 
    GOTO LOOP 
    CALL SOUND15S 
    GOTO LOOP  
;- - ---------------------------------------- 
SOUND200MS 
    MOVLW S_LOOP 
    MOVWF FRE_COUNT     ;46=93-47 
SOUND_LH_LP 
    MOVLW S_REPEAT      ;同一频率重复次数送FRE_REPEAT 
    MOVWF FRE_REPEAT 
    MOVFW FRE_COUNT 
    ADDLW S_MIN        ;计数值加最小值 
    MOVWF TEMP 
REPEAT0_LP 
    MOVFW TEMP 
    BSF PORTA,0        
    CALL SOUNDDELAY0   ;廷时W*3US 
    BCF PORTA,0 
    MOVFW TEMP 
    CALL SOUNDDELAY0 
    DECFSZ FRE_REPEAT,1 ;每四次减频率计数一次 
    GOTO REPEAT0_LP 
    DECFSZ FRE_COUNT,1 
    GOTO SOUND_LH_LP 
SOUND_HL 
    MOVLW S_LOOP 
    MOVWF FRE_COUNT   ;46=93-47 
SOUND_HL_LP 
    MOVLW S_REPEAT    ;同一频率重复次数送FRE_REPEAT 
    MOVWF FRE_REPEAT 
    MOVFW FRE_COUNT 
    SUBLW S_MAX       ;最大值减计数值 
    MOVWF TEMP 
REPEAT1_LP 
    MOVFW TEMP 
    BSF PORTA,0 
    CALL SOUNDDELAY0    ;廷时W*3US 
    BCF PORTA,0 
    MOVFW TEMP 
    CALL SOUNDDELAY0 
    DECFSZ FRE_REPEAT,1;四次减频率计数一次 
    GOTO REPEAT1_LP 
    DECFSZ FRE_COUNT,1 
    GOTO SOUND_HL_LP 
SOUND_END 
    RETLW 0 
;------------------------------ 
SOUNDDELAY:        ;廷时255*3US+2US 
    MOVLW 255 
SOUNDDELAY0 
    MOVWF SOUNDDELAY1     ;廷时W*3US+1US 
SOUNDDELAYUS_1 
    DECFSZ SOUNDDELAY1,1 
    GOTO SOUNDDELAYUS_1 
    RETLW 0 
;--------------------- 
SOUND15S                    ;报警15秒 
    MOVLW 73 
    MOVWF SOUND_TEMP 
SOUND1S_LP 
    CALL SOUND200MS 
    BTFSS PORTB,KEY4       ;按S5退出 
    RETLW 0 
    DECFSZ SOUND_TEMP,1 
    GOTO SOUND1S_LP 
    RETLW 0 
;------------------------ 
    END