标题:
想实现单片机长按开、关机时蜂鸣器响一声
[打印本页]
作者:
汇源科技
时间:
2020-3-31 23:17
标题:
想实现单片机长按开、关机时蜂鸣器响一声
下面的程序,短按转换灯的工作模式同时响一声蜂鸣器是实现了,但想实现长按开和关的时候也响一声。是不是我放的位置的不对还是怎的,还是长按时按键有抖动,引起不正常?
单片机源程序如下:
#include "stc15w.h"
#include <intrins.H>
#define uint unsigned int
#define uchar unsigned char
#define MAIN_Fosc 11059200L
#define key_S 80 //短按(约20ms)
#define key_L key_S*100 //长按(约2s)
/*pin_mode*/
sbit key = P2^4; //按键
sbit led = P5^5; //指示灯 0亮
sbit buzzer=P1^0; //无源蜂鸣器
uint Cnt250us=0;Cnt1s;
bit ON=0;//开关机
bit keyn=0; //蜂鸣器 1时响
uchar n=0; //灯模式
uint tt=0; //响计时
uint t=0;
/*pin_mode*/
void port_mode()
{
P2M0 = 0x00;
P2M1 = 0x00;
P5M0 = 0x00;
P5M1 = 0x00;
led=1;//灯不亮
}
void readkey(void)
{
static uint count=0;
if(!key)
{
count++;
if(count==key_L) //长按开机,ON=1
ON=~ON;
//keyn=1;//没加这个可以实现短按蜂鸣器响一声,但想实现长按开、机也响一声。
if(count>key_L)
count=key_L+1;
}
else
{
if(count>key_S && count<key_L) //短按切换灯模式
{
if(ON==1)
n++;
n%=3;
keyn=1; //短按置1蜂鸣器响
}
count=0;
}
}
void Timer0Init() //250微秒@11.0592MHz
{
AUXR |= 0x80;
TMOD &= 0xF0;
TL0 = 0x33;
TH0 = 0xF5;
TF0 = 0;
TR0 = 1;
}
void LED_M50() //灯模式三
{
if(TF0==0)
t++;
{
if(t>=500)
{
led=~led;
t=0;
}
}
}
void LED_M75() //灯模式二
{
if(TF0==0)
t++;
{
if(t<=2000)
{
led=1;
}
if(t>2000)
{
led=0;
if(t>=8000)
{
t=0;
}
}
}
}
/*
P1.1输出PWM驱动无源蜂鸣器
*/
void initPWM1()//响一声
{
if(keyn==1)
{
tt++;
PCA_PWM1 = 0x00; //开PWM
CMOD=0x80;
CCAPM1=0x42; // 设置PCA模块为PWM输出方式。PCA0
CR=1;
CCAP1H=0x80;
if(tt>=200)
{
PCA_PWM1 = 0x03; //关PWM
CR=0;
tt=0;
keyn=0;
}
}
}
void main()
{
port_mode();
Timer0Init();
while(1)
{
if(TF0==1)
{
TF0=0;
readkey();
initPWM1();//蜂鸣器
if(ON==1)
{
Cnt250us++;
if(Cnt250us>=4000)
{
Cnt250us=0;
Cnt1s++;
if(Cnt1s>=1200) //定时功能
{
Cnt1s =0;
ON=0;
led=1;
}
}
switch(n)
{
case 0 :led=0;break; //灯常亮
case 1 :LED_M75();break;//灯模式二
case 2 :LED_M50();break;//灯模式三
}
}
else //关机
{
Cnt250us=0;
Cnt1s= 0;
led=1;
ON=0;
}
}
}
}
作者:
还有谁?
时间:
2020-4-1 07:03
按键要放到定时中断里面去做,你想,你细想
作者:
我还是你大爷
时间:
2020-4-1 13:06
不管长按,还是短按,按键都有抖动的,你的ON值不会是保持为1的,还有不要把按键写在while(1)里,写在定时中断里,并且按键读取的程序需要加消抖的算法。这种算法网上能找到。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1