找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1647|回复: 5
收起左侧

基于C语言switch-case结构:4KHZ无源蜂鸣器单片机驱动源程序

[复制链接]
ID:1036918 发表于 2022-6-25 14:23 | 显示全部楼层 |阅读模式
//定时器每125uS调用Buz_Output()函数一次,实现无源蜂鸣器4KHZ驱动
//功能参数说明:rbeep=0,蜂鸣器不响。rbeep=1,响1声。rbeep=3,响2声。
#define BUZ_OUT_TIME         800        /125uS*800=100mS
#define BUZ_STOP_TIME         800        /125uS*800=100mS
unsigned char rbeep;
unsigned int temp;
void Buz_Output(void)
{
        switch (rbeep)
        {
                case 0:
                        BUZ_GPIO = 0;
                        break;
//响100mS****************************************************
                case 1:
                        BUZ_GPIO = ~BUZ_GPIO;
                        temp ++;
                        if (temp > BUZ_OUT_TIME)  //125uS*800=100mS
                        {
                                temp  = 0;
                                rbeep = 0;                                
                        }
                        break;
//不响100mS****************************************************                        
                case 2:
                        BUZ_GPIO = 1;
                        temp ++;
                        if (temp > BUZ_STOP_TIME)
                        {
                                temp  = 0;
                                rbeep = 1;                                
                        }
                        break;
//响100mS****************************************************                        
                case 3:
                        BUZ_GPIO = ~BUZ_GPIO;
                        temp ++;
                        if (temp > BUZ_OUT_TIME)
                        {
                                temp = 0;
                                rbeep = 2;
                        }
                        break;               
                default:break;
        }
}

评分

参与人数 1黑币 +20 收起 理由
admin + 20 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:887371 发表于 2022-6-27 09:49 | 显示全部楼层
你这驱动还不够完善。只实现断续响1声,断续响2声,立刻停3种功能。

我也实现过4KHZ无源蜂鸣器驱动,代码框架和你一样,代码行数约为你的一半,但能实现下列功能。
1.立刻停(rbeep=0;)
2.断续响n声(rbeep=n;),n取值1~253
3.永久断续响(rbeep=254;)
4.永久连续响(rbeep=255;rbeep1=0;)
5.连续响(n*100)毫秒(rbeep=255;rbeep1=n;)

按我提到的修改代码,我相信楼主也能做到。
回复

使用道具 举报

ID:1036918 发表于 2022-6-27 14:08 | 显示全部楼层
datouyuan 发表于 2022-6-27 09:49
你这驱动还不够完善。只实现断续响1声,断续响2声,立刻停3种功能。

我也实现过4KHZ无源蜂鸣器驱动,代 ...

这个是我初学时写的,确实有很多改进空间
回复

使用道具 举报

ID:373388 发表于 2022-11-15 22:40 | 显示全部楼层
datouyuan 发表于 2022-6-27 09:49
你这驱动还不够完善。只实现断续响1声,断续响2声,立刻停3种功能。

我也实现过4KHZ无源蜂鸣器驱动,代 ...

可以共享一下吗?
回复

使用道具 举报

ID:373388 发表于 2022-11-17 10:08 | 显示全部楼层
最近产品需要根据运行状态蜂鸣器发出1声-6声的程序,现把代码共享出来;用的有源驱动,可以修改宏定义,改为无源驱动
回复

使用道具 举报

ID:373388 发表于 2022-11-17 10:13 | 显示全部楼层
最近产品需要根据运行状态,蜂鸣器 发出1声到6声的鸣叫,用的是有源蜂鸣器,也可以用无源蜂鸣器,修改宏定义即可。现把代码共享出来,不管怎么优化也没有大神的代码少;测试可用
uint8_t Buzzer_Enable;                //蜂鸣器驱动函数使能
uint8_t on_time,off_time;   //鸣叫时间,停止时间
uint8_t Buzzer_cnt;         //鸣叫次数
//调用一次Buzzer_Set_int,蜂鸣器驱动函数就会执行一次,
//例如想让蜂鸣器鸣叫,调用Buzzer_Set_int(蜂鸣次数,蜂鸣时长,蜂鸣关时长)一次,蜂鸣器就会按照设定参数鸣叫。
void Buzzer_Set_int(uint8_t cnt,uint8_t oncnt,uint8_t offcnt)
{
        on_time=oncnt;
        off_time=offcnt;
        on_count = cnt;
        Buzzer_Enable = 1;
}

//蜂鸣器驱动函数,放在定时器中断函数里面,100ms执行一次
void Buzzer_Output(void)
{
static uint8_t oncnt,offcnt, buzzercnt = 0;
if(buzzercnt < on_count && offcnt == 0)
{
         oncnt = on_time;
         offcnt = off_time;
         buzzercnt++;
}
else if(buzzercnt>=on_count && offcnt == 0)
{
         Buzzer_Enable = 0;
         buzzercnt = 0;
         oncnt = 0;
         offcnt = 0;
         BEEPOFF();
}
  if(Buzzer_Enable)
        {
                if(oncnt)
                {
                        oncnt--;
                        BEEPON();//蜂鸣器响
                }
                else if(offcnt)
                {
                        offcnt--;
                        BEEPOFF();//蜂鸣器关
                }
                else
                {
                        if(on_count>0)
                        {
                                BEEPOFF();
                        }
                }
  }
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表