Stc8h单片机驱动嗡鸣器

软件开发大郭
0 评论
/
28 阅读
/
1468 字
02 2022-05
sbit BUZZ = P2^3; //蜂鸣器控制引脚
int i=0;
unsigned char T0RH = 0;       //T0重载值高字节
unsigned char T0RL = 0;       //T0重载值低字节
sbit k2=P2^7;
//延迟函数
void delay_ms(unsigned int m)
{
int  a, b;

for(a=0;a<5000;a++)
for(b=0;b<m;b++);

}
         
/* 蜂鸣器启动函数,frequ-工作频率 */
void OpenBuzz(unsigned int frequ)
{
    unsigned int reload; //计算所需的定时器重载值
 
    reload = 65536 - (11059200/12)/(frequ*2); //由给定频率计算定时器重载值
    T0RH = (unsigned char)(reload >> 8); //16 位重载值分解为高低两个字节
    T0RL = (unsigned char)reload;
    TH0 = 0xFF; //设定一个接近溢出的初值,以使定时器马上投入工作
    TL0 = 0xFE;
    ET0 = 1; //使能 T0 中断
    TR0 = 1; //启动 T0
}

/* 蜂鸣器停止函数 */
void StopBuzz()
{
    ET0 = 0; //禁用 T0 中断
    TR0 = 0; //停止 T0
}

/* T0 中断服务函数,用于控制蜂鸣器发声 */
void InterruptTimer0() interrupt 1
{
    TH0 = T0RH; //重新加载重载值
    TL0 = T0RL;
    BUZZ = ~BUZZ; //反转蜂鸣器控制电平
}

调用

void main()
{
    //BEEP
    GPIO_Init.Pin  = GPIO_Pin_7;
    GPIO_Init.Mode = GPIO_OUT_PP;
    GPIO_Inilize(GPIO_P4,&GPIO_Init);
    
    TMOD = 0x01; //配置 T0 工作在模式 1,但先不启动
    EA = 1; //使能全局中断
    while(1)
    {
        //延时
        delay_us(100);      
        OpenBuzz(4000); //以 4KHz 的频率启动蜂鸣器
        for (i=0; i<40000; i++);
        StopBuzz(); //停止蜂鸣器
        for (i=0; i<40000; i++);
        OpenBuzz(1000); //以 1KHz 的频率启动蜂鸣器
        for (i=0; i<40000; i++);
        StopBuzz(); //停止蜂鸣器
        for (i=0; i<40000; i++);    
        
    }
}
    暂无数据