警笛声c语言程序,PIC警笛声音的程序

简介:在这里给大家提供一个PIC警笛声音的程序。

;*****************************************************

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

TRISA EQU 05H

;-----------------------

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 ;同一频率重复次数

;--------------------

ORG 0000H

MAIN

CLRF PORTA ;初始化IO口

BSF STATUS,RP0 ;设置数据寄存器体1

MOVLW 0000000B

MOVWF TRISA ;设置RA端口全部为输出

BCF STATUS,RP0 ;恢复数据寄存器体0

LOOP

CALL SOUND200MS ;调用报警200MS子程序

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

;------------------------------

SOUNDDELAY0

MOVWF SOUNDDELAY1 ;廷时W*3US+1US

SOUNDDELAYUS_1

DECFSZ SOUNDDELAY1,1

GOTO SOUNDDELAYUS_1

RETLW 0

;------------------------

END

-----------------------------------------------------------------------------

;ST套件产生450hz低音

;本实例的目的是让大家学会用单片机产生声音的方法,学会计算程序所用时间

;本实例的功能是能PIC16F84产生低音,

;450HZ,相当于450HZ的方波信号发生器。

;程序复位后,蜂鸣器开始发音

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

TRISA EQU 05H

;-----------------------

SOUNDDELAY1 EQU 10H ;声音频率变化计数器,从1.1K~0.5KHZ

;--------------------

ORG 0000H

MAIN

CLRF PORTA ;初始化IO口

BSF STATUS,RP0 ;设置数据寄存器体1

MOVLW 0000000B

MOVWF TRISA ;设置RA端口全部为输出

BCF STATUS,RP0 ;恢复数据寄存器体0

SOUND

MOVLW 222 ;450HZ反复循环

BSF PORTA,0

CALL SOUNDDELAY0 ;廷时W*5US

BCF PORTA,0

MOVLW 222

CALL SOUNDDELAY0

GOTO SOUND

;------------------------------

SOUNDDELAY0

MOVWF SOUNDDELAY1 ;廷时W*5US+1US

SOUNDDELAYUS_1

NOP

NOP

DECFSZ SOUNDDELAY1,1

GOTO SOUNDDELAYUS_1

RETLW 0

;------------------------

END

-----------------------------------------------------------------------------

;ST套件产生救护音

;本实例的目的是让大家学会用单片机产生声音的方法,学会计算程序所用时间

;本实例的功能是能PIC16F84产生救护音,频率分两个1S第一个

;1S频率是440HZ,第二个1S频率是180HZ,反复循环

;程序复位后,蜂鸣器开始报警

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

TRISA EQU 05H

;-----------------------

SOUNDDELAY1 EQU 10H ;声音频率高低电平廷时计数器

FRE_REPEATH EQU 11H ;同一频率的重复次数外部循环

FRE_REPEATL EQU 12H ;同一频率的重复次数内部循环

TEMP EQU 14H ;暂存寄存器

;--------------------

ORG 0000H

MAIN

CLRF PORTA ;初始化IO口

BSF STATUS,RP0 ;设置数据寄存器体1

MOVLW 0000000B

MOVWF TRISA ;设置RA端口全部为输出

BCF STATUS,RP0 ;恢复数据寄存器体0

LOOP

CALL SOUND2S ;调用报警200MS子程序

GOTO LOOP ;反复循环报警

;-------------------------------

SOUND2S ;先440HZ 1S

MOVLW 189

MOVWF TEMP ;440HZ频率高低电平廷时值送TEMP 1S/[(189*6)US*2]=440HZ

MOVLW 2 ;同一频率重复次数外部循环送初值

MOVWF FRE_REPEATH

SOUND2S_1

MOVLW 220

MOVFW FRE_REPEATL ;同一频率重复次数内部循环送初值220*2=440次,440HZ频率重复440次即1S

REPEAT0_LP

MOVFW TEMP

BSF PORTA,0

CALL SOUNDDELAY0 ;廷时W*6US 440hz正半周

BCF PORTA,0

MOVFW TEMP

CALL SOUNDDELAY0 ;廷时W*6US 440hz负半周

DECFSZ FRE_REPEATL,1

GOTO REPEAT0_LP

DECFSZ FRE_REPEATH,1 ;同一频率持续1S

GOTO SOUND2S_1

SOUND2S_B ;再180HZ 1S

MOVLW 231

MOVWF TEMP ;180HZ频率高低电平廷时值送TEMP 1S/[(231*2*6)US*2]=180HZ

MOVLW 180

MOVFW FRE_REPEATL ;同一频率重复次数送初值180HZ频率重复180次即1S

REPEAT0_LP_B

MOVFW TEMP

BSF PORTA,0

CALL SOUNDDELAY0 ;廷时W*6US*2 180HZ正半周

MOVFW TEMP

CALL SOUNDDELAY0

BCF PORTA,0

MOVFW TEMP

CALL SOUNDDELAY0 ;廷时W*6US*2 180HZ负半周

MOVFW TEMP

CALL SOUNDDELAY0

DECFSZ FRE_REPEATL,1 ;同一频率持续1S

GOTO REPEAT0_LP_B

SOUND_END

RETLW 0

;------------------------------

SOUNDDELAY0

MOVWF SOUNDDELAY1 ;廷时W*6US+1US

SOUNDDELAYUS_1

nop

nop

nop

DECFSZ SOUNDDELAY1,1

GOTO SOUNDDELAYUS_1

RETLW 0

;------------------------

END

-----------------------------------------------------------------------------

;ST套件产生开道音

;本实例的目的是让大家学会用单片机产生声音的方法,学会计算程序所用时间

;本实例的功能是能PIC16F84产生开道音,每一个3S内频率

;从1.1K-0.5K匀速减少,反复循环。

;程序复位后,蜂鸣器开始报警

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

TRISA EQU 05H

;-----------------------

SOUNDDELAY1 EQU 10H ;声音频率变化计数器,从1.1K~0.5KHZ

FRE_COUNT EQU 11H ;同一频率的重复次数保存地址

FRE_REPEAT EQU 12H

SOUND_TEMP EQU 13H

TEMP EQU 14H ;暂存寄存器

S_LOOP EQU 136 ;250-114=136

S_MAX EQU 250 ;最低频率0.5K 250*4=1000 *2

S_MIN EQU 114 ;最高频率1.1K 114*4=456 *2

S_REPEAT EQU 17 ;同一频率重复次数

;--------------------

ORG 0000H

MAIN

CLRF PORTA ;初始化IO口

BSF STATUS,RP0 ;设置数据寄存器体1

MOVLW 0000000B

MOVWF TRISA ;设置RA端口全部为输出

BCF STATUS,RP0 ;恢复数据寄存器体0

LOOP

CALL SOUND3S ;调用报警3S子程序

GOTO LOOP ;反复循环报警

;-------------------------------

SOUND3S

MOVLW S_LOOP

MOVWF FRE_COUNT ;136=250-114

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*4US

BCF PORTA,0

MOVFW TEMP

CALL SOUNDDELAY0

DECFSZ FRE_REPEAT,1;17次减频率计数一次

GOTO REPEAT1_LP

DECFSZ FRE_COUNT,1

GOTO SOUND_HL_LP

SOUND_END

RETLW 0

;------------------------------

SOUNDDELAY0

MOVWF SOUNDDELAY1 ;廷时W*4US+1US

SOUNDDELAYUS_1

NOP

DECFSZ SOUNDDELAY1,1

GOTO SOUNDDELAYUS_1

RETLW 0

;------------------------

END

-----------------------------------------------------------------------------

;ST套件产生汽笛音800HZ

;本实例的目的是让大家学会用单片机产生声音的方法,学会计算程序所用时间

;本实例的功能是能PIC16F84产生汽笛音800HZ

;相当于800HZ的方波信号发生器。

;程序复位后,蜂鸣器开始发音

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

TRISA EQU 05H

;-----------------------

SOUNDDELAY1 EQU 10H ;声音频率变化计数器,从1.1K~0.5KHZ

;--------------------

ORG 0000H

MAIN

CLRF PORTA ;初始化IO口

BSF STATUS,RP0 ;设置数据寄存器体1

MOVLW 0000000B

MOVWF TRISA ;设置RA端口全部为输出

BCF STATUS,RP0 ;恢复数据寄存器体0

SOUND

MOVLW 125 ;800HZ反复循环

BSF PORTA,0

CALL SOUNDDELAY0 ;廷时W*5US

BCF PORTA,0

MOVLW 125

CALL SOUNDDELAY0

GOTO SOUND

;------------------------------

SOUNDDELAY0

MOVWF SOUNDDELAY1 ;廷时W*5US+1US

SOUNDDELAYUS_1

NOP

NOP

DECFSZ SOUNDDELAY1,1

GOTO SOUNDDELAYUS_1

RETLW 0

;------------------------

END

-----------------------------------------------------------------------------

;ST套件产生治安音

;本实例的目的是让大家学会用单片机产生声音的方法,学会计算程序所用时间

;本实例的功能是能PIC16F84产生治安音,频率分两个0.4s第一个

;0.4S频率从1.8K-2.2K匀速增加第二个0.4S频率从2.2K-1.8K匀速减少,

;程序复位后,蜂鸣器开始报警

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

TRISA EQU 05H

;-----------------------

SOUNDDELAY1 EQU 10H ;声音频率变化计数器,从0.8~2.2KHZ

FRE_COUNT EQU 11H ;同一频率的重复次数保存地址

FRE_REPEAT EQU 12H

SOUND_TEMP EQU 13H

TEMP EQU 14H ;暂存寄存器

S_LOOP EQU 132 ;208-76=132

S_MAX EQU 208 ;最低频率0.8K 208*3=624US *2

S_MIN EQU 76 ;最高频率2.2K 76*3=228 *2

S_REPEAT EQU 5 ;同一频率重复次数 5*132个变化点*(1S/1.5KHZ)=0.4S

;--------------------

ORG 0000H

MAIN

CLRF PORTA ;初始化IO口

BSF STATUS,RP0 ;设置数据寄存器体1

MOVLW 0000000B

MOVWF TRISA ;设置RA端口全部为输出

BCF STATUS,RP0 ;恢复数据寄存器体0

LOOP

CALL SOUND800MS ;调用报警800MS子程序

GOTO LOOP ;反复循环报警

;-------------------------------

SOUND800MS

MOVLW S_LOOP

MOVWF FRE_COUNT ;132=208-76 最低频率的计数减去最高频率的计数等于频率变化的次数

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 ;132=208-76

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

;------------------------------

SOUNDDELAY0

MOVWF SOUNDDELAY1 ;廷时W*3US+1US

SOUNDDELAYUS_1

DECFSZ SOUNDDELAY1,1

GOTO SOUNDDELAYUS_1

RETLW 0

;------------------------

END

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值