标题:
让蜂鸣器只响一次的单片机程序写法
[打印本页]
作者:
dabing89
时间:
2018-10-13 15:55
标题:
让蜂鸣器只响一次的单片机程序写法
在实际的开发中,往往会用到按键,客户要求按下按键的时候,最好有蜂鸣器提示一下,但是也就是提示一下,就不要再响了,还有些客户,系统运行结束后,要求长响3秒或者5秒作为报警,然后也停止运行,这个程序就是这个作用,我们开发板上用的是无源的蜂鸣器,我们这个程序没有加按键,如果加按键的话,只要在按下按键的时候,清零flag_beep这个变量就好了,程序就会起到按下一次按键响一次的效果。
/********************************************************
*描述:蜂鸣器上电只响一次 ,可以通过按键清除标志位,然后按一次响一次
********************************************************/
#include "stc15w.h"
#include "intrins.h" //包含左移和右移指令
#include "string.h" //字符串
#include "stdio.h" //标准输入输出
/*******************************************************************************
* 文件名:位定义
* 描 述:
* 功 能:
* 作 者:大核桃
* 版本号:1.0.1(2017.05.23)
*******************************************************************************/
bit flag500ms = 0;//500ms翻转一次
bit staBuzzer = 0;
bit flag200ms = 0;
sbit LED0 = P1^0;//
sbit BEEP = P3^5;//
sbit DATA0 = P2^0;//
sbit DATA1 = P2^1;//
sbit DATA2 = P2^2;//
sbit DATA3 = P2^3;//
sbit DATA4 = P2^4;//
sbit DATA5 = P2^5;//
sbit DATA6 = P2^6;//
sbit DATA7 = P2^7;//
typedef unsigned char uint8;//0-255
typedef unsigned int uint16;//0-65535
typedef unsigned long uint32;//0-65535*65535
/*******************************************************************************
* 文件名:函数前置声明
* 描 述:
* 功 能:
* 作 者:大核桃
* 版本号:1.0.1(2017.05.23)
*******************************************************************************/
void Bsp_Power_Init(void);
void Delay500ms(); //@11.0592MHz
void Timer0Init(void); //1毫秒@11.0592MHz
void KeyBeepState(uint8 sta);
void Beep(void);
/*******************************************************************************
* 文件名:主循环入口
* 描 述:
* 功 能:
* 作 者:大核桃
* 版本号:1.0.1(2017.05.23)
*******************************************************************************/
void main(void)
{
uint8 i = 0;
Bsp_Power_Init();//LED端口初始化
Timer0Init(); //定时器0初始化函数
LED0 = 1;
while(1);
}
/*******************************************************************************
* 文件名:void Bsp_Power_Init()
* 描 述: 数码管上电显示
* 功 能:编程模块化
* 作 者:大核桃
* 版本号:1.0.1(2017.05.23)
*******************************************************************************/
void Bsp_Power_Init(void)
{
P0M1 = 0xFC;
P0M0 = 0X03;
P0 = 0X00;
P1M1 = 0xE0;
P1M0 = 0X1F;
P1 = 0X00;
//P2口开漏输出
P2M1 = 0XFF;
P2M0 = 0XFF;
P2 = 0Xff;
// //P54,P55口为推挽输出
P5M1 = 0X00;
P5M0 = 0X00;
P5 = 0xFF;
//P37,P36,3.2,P3.3 P3.4口为推挽输出
P3M1 = 0X00;
P3M0 = 0XFC;
P3 = 0X23;
}
/*******************************************************************************
* 文件名:void Delay500ms() //@11.0592MHz
* 描 述: 普通延时函数
* 功 能:编程模块化
* 作 者:大核桃
* 版本号:1.0.1(2017.05.23)
*******************************************************************************/
//void Delay500ms() //@11.0592MHz
//{
// unsigned char i, j, k;
//
// _nop_();
// _nop_();
// i = 22;
// j = 3;
// k = 227;
// do
// {
// do
// {
// while (--k);
// } while (--j);
// } while (--i);
//}
/*******************************************************************************
* 文件名:void Timer0Init(void)
* 描 述: 定时器0配置
* 功 能:编程模块化
* 作 者:大核桃
* 版本号:1.0.1(2017.05.23)
*******************************************************************************/
void Timer0Init(void) //1毫秒@11.0592MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xf0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = (65535 - 1000) % 256;//设置定时初值
TH0 = (65535 - 1000) / 256;//设置定时初值
ET0 = 1; //打开定时器0中断使能
TR0 = 1; //定时器0开始计时
EA = 1; //打开总中断使能
}
void Timer0_inter(void) interrupt 1
{
static uint16 tmr1s = 0;
static bit flag_beep = 0;
//自动重载,初值可以不需要写
TL0 = (65535 - 1000) % 256; //设置定时初值
TH0 = (65535 - 1000) / 256; //设置定时初值
tmr1s++;
if(tmr1s >= 1000)
{
tmr1s = 0;
if(flag_beep == 0)
{
KeyBeepState(1);
}
flag_beep = 1;
}
Beep();
}
void Beep(void)
{
static uint8 tmr1ms = 0;
static uint16 tmr1s = 0;
if(staBuzzer)
{
tmr1ms++;
if(tmr1ms >= 1)
{
tmr1ms = 0;
BEEP = ~BEEP;
tmr1s++;
}
if(tmr1s >= 200)//延时时间长短
{
tmr1s = 0;
staBuzzer = 0;
}
}
else
{
BEEP = 1;
}
}
/*******************************************************************************
* 文件名: void KeyBeepState(bit sta)
* 描 述: //1开按键音 0关闭按键音
* 功 能:模块化编程
* 作 者:大核桃
* 版本号:1.0.1(2015.03.03)
*******************************************************************************/
void KeyBeepState(uint8 sta)
{
if(sta)
{
staBuzzer = 1;
}
else
{
staBuzzer = 0;
}
}
复制代码
代码下载
013 蜂鸣器的使用.rar
(34.96 KB, 下载次数: 60)
2018-10-13 15:54 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
alex-yang
时间:
2019-2-15 17:07
大神你这个程序长按会有长鸣,不想要长鸣要怎么解决?求解
作者:
找人PK
时间:
2019-3-10 09:24
很好的作品,收下了!谢谢分享!
作者:
Joker-company
时间:
2021-4-16 23:27
好资料,51黑有你更精彩!!!
作者:
wyl138
时间:
2022-10-31 19:57
我对楼主的无私奉献精神感动了,谢谢!谢谢
作者:
cb474265474265
时间:
2022-11-3 05:17
好资料,51黑有你更精彩!
作者:
18680365301
时间:
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
}
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1