单片机应用实践篇之定时/计数器实现门铃打铃的声音_哔哩哔哩_bilibili
/***** 代码源自B站UP主金善愚老师 **********/
#include <REGX51.H>
#include "delay.h"
sbit beep =P1^3;
sbit LED = P1^2;
unsigned int TickCnt =0;
unsigned char Beep_Flag =0;
unsigned char uc500HZ =0; //咚
unsigned char uc700HZ =0; //叮
void Timer0_Init(void);
void Key_Init(void);
void main()
{
Timer0_Init();
Key_Init();
while(1)
{
}
}
void Timer0_Init(void) //250微秒@12.000MHz
{
// AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x06; //设置定时初始值
TH0 = 0xFF; //设置定时初始值
TF0 = 0; //清除TF0标志
//TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
EA =1;
}
void Key_Init(void)
{
IT0 = 1; //设置下降沿触发
EX0 = 1;
EA = 1 ;
}
void Timer0_Isr(void) interrupt 1
{
TR0 =0;
TL0 = 0x06; //设置定时初始值
TH0 = 0xFF; //设置定时初始值
TickCnt++;
if(TickCnt>=2000) //500MS叮 500MS咚
{
TickCnt=0;
Beep_Flag = ~Beep_Flag;
}
if(!Beep_Flag)
{
uc700HZ++;
if(uc700HZ>=3)
{
uc700HZ=0;
beep = ~beep;
}
}
if(Beep_Flag)
{
uc500HZ++;
if(uc500HZ>=4)
{
uc500HZ=0;
beep = ~beep;
}
}
TR0 =1;
}
void KEY_ISR() interrupt 0
{
TR0 = 1;
}