找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 17027|回复: 6
打印 上一主题 下一主题
收起左侧

让蜂鸣器只响一次的单片机程序写法

  [复制链接]
跳转到指定楼层
楼主
ID:74187 发表于 2018-10-13 15:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
      在实际的开发中,往往会用到按键,客户要求按下按键的时候,最好有蜂鸣器提示一下,但是也就是提示一下,就不要再响了,还有些客户,系统运行结束后,要求长响3秒或者5秒作为报警,然后也停止运行,这个程序就是这个作用,我们开发板上用的是无源的蜂鸣器,我们这个程序没有加按键,如果加按键的话,只要在按下按键的时候,清零flag_beep这个变量就好了,程序就会起到按下一次按键响一次的效果。
  1. /********************************************************
  2. *描述:蜂鸣器上电只响一次 ,可以通过按键清除标志位,然后按一次响一次
  3. ********************************************************/
  4. #include "stc15w.h"
  5. #include "intrins.h" //包含左移和右移指令
  6. #include "string.h"         //字符串
  7. #include "stdio.h"         //标准输入输出



  8. /*******************************************************************************
  9. * 文件名:位定义
  10. * 描  述:
  11. * 功  能:
  12. * 作  者:大核桃
  13. * 版本号:1.0.1(2017.05.23)
  14. *******************************************************************************/

  15. bit flag500ms = 0;//500ms翻转一次
  16. bit staBuzzer = 0;
  17. bit flag200ms = 0;

  18. sbit LED0 = P1^0;//
  19. sbit BEEP = P3^5;//

  20. sbit DATA0 = P2^0;//
  21. sbit DATA1 = P2^1;//
  22. sbit DATA2 = P2^2;//
  23. sbit DATA3 = P2^3;//
  24. sbit DATA4 = P2^4;//
  25. sbit DATA5 = P2^5;//
  26. sbit DATA6 = P2^6;//
  27. sbit DATA7 = P2^7;//

  28. typedef unsigned char uint8;//0-255
  29. typedef unsigned int  uint16;//0-65535
  30. typedef unsigned long uint32;//0-65535*65535

  31. /*******************************************************************************
  32. * 文件名:函数前置声明
  33. * 描  述:
  34. * 功  能:
  35. * 作  者:大核桃
  36. * 版本号:1.0.1(2017.05.23)
  37. *******************************************************************************/

  38. void Bsp_Power_Init(void);
  39. void Delay500ms();                //@11.0592MHz
  40. void Timer0Init(void);                //1毫秒@11.0592MHz
  41. void KeyBeepState(uint8 sta);
  42. void Beep(void);

  43. /*******************************************************************************
  44. * 文件名:主循环入口
  45. * 描  述:
  46. * 功  能:
  47. * 作  者:大核桃
  48. * 版本号:1.0.1(2017.05.23)
  49. *******************************************************************************/
  50. void main(void)
  51. {
  52.         uint8 i = 0;

  53.         Bsp_Power_Init();//LED端口初始化

  54.         Timer0Init();    //定时器0初始化函数

  55.         LED0 = 1;

  56.         while(1);
  57. }

  58. /*******************************************************************************
  59. * 文件名:void Bsp_Power_Init()
  60. * 描  述: 数码管上电显示
  61. * 功  能:编程模块化
  62. * 作  者:大核桃
  63. * 版本号:1.0.1(2017.05.23)
  64. *******************************************************************************/
  65. void Bsp_Power_Init(void)
  66. {
  67.         P0M1 = 0xFC;
  68.         P0M0 = 0X03;
  69.         P0 = 0X00;

  70.         P1M1 = 0xE0;
  71.         P1M0 = 0X1F;
  72.         P1 = 0X00;


  73.         //P2口开漏输出
  74.         P2M1 = 0XFF;
  75.         P2M0 = 0XFF;
  76.         P2 = 0Xff;
  77. //        //P54,P55口为推挽输出
  78.         P5M1 = 0X00;
  79.         P5M0 = 0X00;
  80.         P5 = 0xFF;

  81.         //P37,P36,3.2,P3.3 P3.4口为推挽输出
  82.         P3M1 = 0X00;
  83.         P3M0 = 0XFC;
  84.         P3 = 0X23;

  85. }

  86. /*******************************************************************************
  87. * 文件名:void Delay500ms()                //@11.0592MHz
  88. * 描  述: 普通延时函数
  89. * 功  能:编程模块化
  90. * 作  者:大核桃
  91. * 版本号:1.0.1(2017.05.23)
  92. *******************************************************************************/
  93. //void Delay500ms()                //@11.0592MHz
  94. //{
  95. //        unsigned char i, j, k;
  96. //
  97. //        _nop_();
  98. //        _nop_();
  99. //        i = 22;
  100. //        j = 3;
  101. //        k = 227;
  102. //        do
  103. //        {
  104. //                do
  105. //                {
  106. //                        while (--k);
  107. //                } while (--j);
  108. //        } while (--i);
  109. //}

  110. /*******************************************************************************
  111. * 文件名:void Timer0Init(void)
  112. * 描  述: 定时器0配置
  113. * 功  能:编程模块化
  114. * 作  者:大核桃
  115. * 版本号:1.0.1(2017.05.23)
  116. *******************************************************************************/
  117. void Timer0Init(void)                //1毫秒@11.0592MHz
  118. {
  119.         AUXR &= 0x7F;                //定时器时钟12T模式
  120.         TMOD &= 0xf0;                //设置定时器模式
  121.         TMOD |= 0x01;                //设置定时器模式
  122.         TL0 = (65535 - 1000) % 256;//设置定时初值
  123.         TH0 = (65535 - 1000) / 256;//设置定时初值
  124.         ET0 = 1;            //打开定时器0中断使能
  125.         TR0 = 1;                    //定时器0开始计时
  126.         EA = 1;             //打开总中断使能
  127. }

  128. void Timer0_inter(void) interrupt 1
  129. {
  130.      static uint16 tmr1s = 0;
  131.          static bit flag_beep = 0;

  132.     //自动重载,初值可以不需要写
  133.         TL0 = (65535 - 1000) % 256;                    //设置定时初值
  134.         TH0 = (65535 - 1000) / 256;                     //设置定时初值

  135.         tmr1s++;

  136.         if(tmr1s >= 1000)
  137.         {
  138.                 tmr1s = 0;
  139.                 if(flag_beep == 0)
  140.                 {
  141.                         KeyBeepState(1);
  142.                 }

  143.                 flag_beep = 1;

  144.         }


  145.         Beep();                        
  146. }

  147. void Beep(void)
  148. {
  149.         static uint8 tmr1ms = 0;
  150.         static uint16 tmr1s = 0;

  151.         if(staBuzzer)
  152.         {
  153.                  tmr1ms++;
  154.                  if(tmr1ms >= 1)
  155.                  {
  156.                          tmr1ms = 0;
  157.                     BEEP = ~BEEP;
  158.                         tmr1s++;
  159.                  }
  160.                  
  161.                  if(tmr1s >= 200)//延时时间长短
  162.                  {
  163.                          tmr1s = 0;
  164.                         staBuzzer = 0;
  165.                  }        
  166.         }
  167.         else
  168.         {
  169.                 BEEP = 1;
  170.         }        
  171. }

  172. /*******************************************************************************
  173. * 文件名: void KeyBeepState(bit sta)
  174. * 描  述: //1开按键音 0关闭按键音
  175. * 功  能:模块化编程
  176. * 作  者:大核桃
  177. * 版本号:1.0.1(2015.03.03)
  178. *******************************************************************************/
  179. void KeyBeepState(uint8 sta)
  180. {
  181.         if(sta)
  182.         {
  183.                 staBuzzer = 1;
  184.         }
  185.         else
  186.         {
  187.                 staBuzzer = 0;               
  188.         }
  189. }
复制代码
代码下载

013 蜂鸣器的使用.rar (34.96 KB, 下载次数: 57)




评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏12 分享淘帖 顶3 踩
回复

使用道具 举报

沙发
ID:420008 发表于 2019-2-15 17:07 | 只看该作者
大神你这个程序长按会有长鸣,不想要长鸣要怎么解决?求解
回复

使用道具 举报

板凳
ID:471889 发表于 2019-3-10 09:24 | 只看该作者
很好的作品,收下了!谢谢分享!
回复

使用道具 举报

地板
ID:907150 发表于 2021-4-16 23:27 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

5#
ID:1049825 发表于 2022-10-31 19:57 | 只看该作者
我对楼主的无私奉献精神感动了,谢谢!谢谢
回复

使用道具 举报

6#
ID:333678 发表于 2022-11-3 05:17 | 只看该作者
好资料,51黑有你更精彩!
回复

使用道具 举报

7#
ID:485350 发表于 2023-4-4 16:38 | 只看该作者
//功能:
//调用方式:10毫秒调用一次
void Beep_Control(void)
{
    if(Beep_Run_Time == 0)
    {
        if(Beep)
        {
            //IO设置为强推输出
            if(Beep & 0x01)
            {
                Beep_Out_En = 1;
            }
            else
            {
                Beep_Out_En = 0;
            }

            Beep >>= 1;
            Beep_Run_Time = BEEP_ON_TIME;
        }
        else
        {
            //IO设置为模拟输入
            Beep_Out_En = 0;
            //BEEP_IO = BEEP_OFF;                //防止蜂鸣器长时间导通
        }
    }
    else
    {
        Beep_Run_Time--;
    }
}

// //功能:蜂鸣器硬件驱动
// //调用方式:125us中断内调
void Beep_Drive(void)
{
    if(Beep_Out_En)
    {
        BEEP_IO = !BEEP_IO ;
    }
}


if(Key_Down & KEY1)

Key_Down &= ~KEY1;
Beep = 0x0001;//蜂鸣器响100ms


if(Key_Down & KEY2)

Key_Down &= ~KEY2;
Beep = 0x0005;//蜂鸣器响100ms 停100ms 响100ms


if(Key_Down & KEY3)

Key_Down &= ~ KEY3;
Beep = 0x001f;//蜂鸣器响500ms 
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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