新闻  |   论坛  |   博客  |   在线研讨会
基于单片机汽车防盗器报警声的源程序
tvb2058 | 2007-09-14 07:57:44    阅读:2694   发布文章

来源: PIC单片机学习网

;ST套件产生汽车防盗器报警声
;本实例的目的是让大家学会用单片机产生声音的方法,学会计算程序所用时间
;本实例的功能是能PIC16F84产生汽车防盗器的报警声,频率分两个0.1s第一个
;0.1S频率从1.8K-3.5K匀速增加第二个0.1S频率从3.5K-1.8K匀速减少,
;程序复位后,按S2喇叭叫两声,按S3喇叭叫15秒,中途可按S5停止
.
;PIC单片机学习网

;烧写时应注意:配置位已经在程序中写明,加载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

 

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客