📄 sound.h
字号:
#include <avr/io.h>
/*
这是一个利用T2定时器产生各种频率的信号(占空比都是50%)驱动蜂鸣器发出声音的程序
利用到的AVR单片机资源:
T2定时器
OC2对应的IO口
在主程序开始时请调用 void SOUNDINIT_timer2_init(void) 对T2进行初始化
本子程序是对应8M内部晶体测试
void SOUND_ENTER(void) 进入菜单
void SOUND_ADD(void) 加
void SOUND_DEC(void) 减
void SOUND_WARNING_SIMPLE(void) 警告(普通的)
void SOUND_WARNING_TOOLOW(void) 警告(太低)
void SOUND_WARNING_TOOHIGH(void) 警告(太高)
void SOUND_RING1(void); 自定义声音1
void SOUND_RING2(void); 自定义声音2
void SOUND_RING3(void); 自定义声音3
*/
////////////////////////////////////////////////
/*------宏定义------*/
#define BIT(x) (1<<(x))
#define NOP() asm("nop")
#define WDR() asm("wdr")
////////////////////////////////////////////////
void SOUNDINIT_timer2_init(void);
void delay_s(unsigned int input);
void SOUND_ENTER(void);
void SOUND_ADD(void);
void SOUND_DEC(void);
void SOUND_WARNING_SIMPLE(void);
void SOUND_WARNING_TOOLOW(void);
void SOUND_WARNING_TOOHIGH(void);
void SOUND_RING1(void);
void SOUND_RING2(void);
void SOUND_RING3(void);
////////////////////////////////////////////////
//声音初始化
void SOUNDINIT_timer2_init(void)
{
TCCR2 = 0x00;//停止定时器
ASSR = 0x00;//异步时钟模式(无)
TCNT2 = 0x00;//初始值
OCR2 = 0x18;//匹配值
TIMSK |= 0x00;//中断允许(中断全关)
}
////////////////////////////////////////////////
void delay_s(unsigned int input)
{
unsigned int i,k;
for(i=0;i<1000;i++)
{for(k=0;k<input;k++)WDR();}
}
////////////////////////////////////////////////
void SOUND_ENTER(void)
{
OCR2 = 0xF0;
TCCR2 = 0x1A;//启动定时器
delay_s(50);
TCCR2 = 0x00;//关闭定时器
delay_s(30);
OCR2=0x6F;
TCCR2 = 0x1A;//启动定时器
delay_s(40);
TCCR2 = 0x00;//关闭定时器
WDR();
}
////////////////////////////////////////////////
void SOUND_ADD(void)
{
OCR2 = 0x6F;
TCCR2 = 0x1A;//启动定时器
delay_s(10);
TCCR2 = 0x00;//关闭定时器
delay_s(30);
OCR2=0x80;
TCCR2 = 0x1A;//启动定时器
delay_s(10);
TCCR2 = 0x00;//关闭定时器
WDR();
}
////////////////////////////////////////////////
void SOUND_DEC(void)
{
OCR2 = 0xEE;
TCCR2 = 0x1A;//启动定时器
delay_s(10);
TCCR2 = 0x00;//关闭定时器
delay_s(30);
OCR2=0xFF;
TCCR2 = 0x1A;//启动定时器
delay_s(10);
TCCR2 = 0x00;//关闭定时器
WDR();
}
////////////////////////////////////////////////
void SOUND_WARNING_SIMPLE(void)
{
OCR2 = 0xFF;
TCCR2 = 0x1A;//启动定时器
delay_s(200);
TCCR2 = 0x00;//关闭定时器
delay_s(150);
OCR2 = 0xFF;
TCCR2 = 0x1A;//启动定时器
delay_s(200);
TCCR2 = 0x00;//关闭定时器
delay_s(150);
OCR2 = 0xFF;
TCCR2 = 0x1A;//启动定时器
delay_s(200);
TCCR2 = 0x00;//关闭定时器
}
////////////////////////////////////////////////
void SOUND_WARNING_TOOLOW(void)
{
OCR2 = 0x70;
TCCR2 = 0x1A;//启动定时器
delay_s(400);
TCCR2 = 0x00;//关闭定时器
delay_s(150);
OCR2 = 0xFF;
TCCR2 = 0x1A;//启动定时器
delay_s(200);
TCCR2 = 0x00;//关闭定时器
delay_s(150);
OCR2 = 0xFF;
TCCR2 = 0x1A;//启动定时器
delay_s(200);
TCCR2 = 0x00;//关闭定时器
}
////////////////////////////////////////////////
void SOUND_WARNING_TOOHIGH(void)
{
OCR2 = 0xAF;
TCCR2 = 0x1A;//启动定时器
delay_s(400);
TCCR2 = 0x00;//关闭定时器
delay_s(150);
OCR2 = 0xFF;
TCCR2 = 0x1A;//启动定时器
delay_s(200);
TCCR2 = 0x00;//关闭定时器
delay_s(150);
OCR2 = 0xFF;
TCCR2 = 0x1A;//启动定时器
delay_s(200);
TCCR2 = 0x00;//关闭定时器
}
////////////////////////////////////////////////
void SOUND_RING1(void)
{
OCR2 = 0xCC;
TCCR2 = 0x1A;//启动定时器
delay_s(20);
TCCR2 = 0x00;//关闭定时器
delay_s(30);
OCR2=0x90;
TCCR2 = 0x1A;//启动定时器
delay_s(70);
TCCR2 = 0x00;//关闭定时器
delay_s(30);
OCR2 = 0xCC;
TCCR2 = 0x1A;//启动定时器
delay_s(20);
TCCR2 = 0x00;//关闭定时器
}
////////////////////////////////////////////////
void SOUND_RING2(void)
{
OCR2 = 0x90;
TCCR2 = 0x1A;//启动定时器
delay_s(20);
TCCR2 = 0x00;//关闭定时器
delay_s(30);
OCR2=0xDF;
TCCR2 = 0x1A;//启动定时器
delay_s(70);
TCCR2 = 0x00;//关闭定时器
delay_s(30);
OCR2 = 0x90;
TCCR2 = 0x1A;//启动定时器
delay_s(20);
TCCR2 = 0x00;//关闭定时器
}
////////////////////////////////////////////////
void SOUND_RING3(void)
{
OCR2 = 0xFF;
TCCR2 = 0x1A;//启动定时器
delay_s(20);
TCCR2 = 0x00;//关闭定时器
delay_s(30);
OCR2 = 0xAA;
TCCR2 = 0x1A;//启动定时器
delay_s(70);
TCCR2 = 0x00;//关闭定时器
delay_s(30);
OCR2 = 0x80;
TCCR2 = 0x1A;//启动定时器
delay_s(20);
TCCR2 = 0x00;//关闭定时器
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -