本帖最后由 wulin 于 2018-12-2 10:47 编辑
给你一个利用定时器作驱动信号的无源蜂鸣器示例,详细注释。按一次键,响3下。
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit key1 = P1^4;
sbit beep = P1^5;
uchar num=0; //响铃计数变量
uint count=0; //中断计数变量
void Timer0Init() //250微秒@12.000MHz
{
TMOD |= 0x02; //自动重载模式
TL0 = 0x06; //设置定时初值
TH0 = 0x06; //设置定时重载值
TR0 = 1; //定时器0开始计时
EA=1; //开总中断
ET0=1; //开T0中断
}
void delay(uint z)//延时ms
{
uint x,y;
for(x=z;x>0;x--)
for(y=114;y>0;y--);
}
void keyscan()//按键扫描
{
if(!key1)
{
delay(10);
if(!key1)
num=3;//响铃3次
while(!key1);
}
}
void main()
{
Timer0Init();//初始化定时器
while(1)
{
keyscan();//按键扫描
}
}
void timer0() interrupt 1 //T0中断
{
if(num>0)
{
count++;
if(count<=1000)
beep=~beep; //蜂鸣器端口取反
if(count>1000) //0.25秒时间到
beep=1;
if(count>=2000)//0.5秒时间到
{
count=0; //计数清0
num--;
}
}
} |