📄 main.c
字号:
/******************** 2011电子科技协会 ********************
;名称 :蜂鸣器
;作者 : 郑品洪
;日期 : 07/25/2011
;描述 : 利用定时器产生
;***********************************************************/
#include <stm8s105s4.h>
#define uchar unsigned char
_Bool beep @PD_ODR:4;
uchar t2,t3;
void init(void)
{
PD_DDR=0X10;
PD_CR1=0X10; //连接蜂鸣器的IO口初始化
PD_CR2=0X00;
PD_ODR|=0x10;
TIM2_EGR=0X01; //允许产生更新事件
TIM2_PSCR=0X01; //分频,使频率为1MHz
TIM2_ARRH=0XC3; //更新后计数器的值
TIM2_ARRL=0X50; //定时50ms,用于控制发声时间
TIM2_CR1=0X05; //允许定时器工作
TIM2_IER=0X01; //允许更新中断
TIM3_EGR=0X01; //允许产生更新事件
TIM3_PSCR=0X01; //分频,使频率为1MHz
TIM3_ARRH=0X00; //更新后计数器的值
TIM3_ARRL=0Xfa; //这里定时0.25ms,用于产生所需的频率
TIM3_CR1=0X05; //允许定时器工作
TIM3_IER=0X01; //允许更新中断
_asm("rim"); //汇编语句,启动定时器
}
void delay(uchar s)
{
uchar i;
for(s;s>0;s--)
for(i=0;i<250;i++);
}
void main()
{
init();
while(1)
{
if(t3%2==0) //前一秒产生2KHz频率的声音
beep=1; //定时器3时间0.25ms,一个周期0.5ms,故频率为2K
else
beep=0;
while(t2>=20&&t2<40) //第二秒产生1KHz频率声音
{
if(t3%4<2)
beep=1;
else
beep=0;
}
while(t2>=40&&t2<60) //第三秒产生500Hz频率声音
{
if(t3%8<4)
beep=1;
else
beep=0;
}
if(t2>=60)
t2=0;
if(t3==8)
t3=0;
}
}
@far @interrupt void TIM2_UP_IRQHandler (void) //定时器2中断函数
{
TIM2_SR1 = 0x00; //清零TIM2_SR1
t2++;
}
@far @interrupt void TIM3_UP_IRQHandler (void) //定时器三中断函数
{
TIM3_SR1 = 0x00; //清零TIM2_SR1
t3++;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -