用定时器设计门铃,按下按键时蜂鸣器发出叮咚的门铃声

叮咚 产生的方式

在这里插入图片描述

仿真

在这里插入图片描述

程序代码

#include<reg51.h>
sbit key=P3^4;//设置一个按键的接口
sbit beep=P1^5;//设置门铃接口
#define CRYSTAL_FREQ 12000000  //晶振
#define INTERRUPT_PERIOD_0 4000//分频系数  1/4000s=250us
#define uchar unsigned char
#define uint  unsigned int
	
uchar ding,dong,start,stop;
uint flag;
//
//
void delayms(uchar x)//按键消抖毫秒级延时
{
	int i,j;
	for(i=x;i>0;i--)
		for(j=0;j<120;j++);
}
//https://blog.csdn.net/qq_43033547/article/details/89678078
//关于延时函数的一些说明
void Canshu_Init()
{
	ding=0;
	dong=0;
	start=0;
	stop=0;
	flag=0;
}
//
//
void Interrupt_Init()//中断初始化,注意事先关闭定时器0所以TR0先没有赋1
{
  TMOD = 0x01;	
  TH0 = (65536 - CRYSTAL_FREQ / 12 / INTERRUPT_PERIOD_0) / 256;
  TL0 = (65536 - CRYSTAL_FREQ / 12 / INTERRUPT_PERIOD_0) % 256;
  ET0 = 1;	
  EA  = 1;	
}
//
//
void main()
{
Canshu_Init();
Interrupt_Init();
while(1)							//一直检测有没有按键按下
	{
	if(key==0)
	{
		delayms(5);
		if(key==0)
		{
			  TR0 = 1;//timer0 start
			while(stop);//直到按键松开
	 	}
	}
			
	}
}

//
//
  void Timer0() interrupt 1//重点函数
{
 
  TH0 = (65536 - CRYSTAL_FREQ / 12 / INTERRUPT_PERIOD_0) / 256;
  TL0 = (65536 - CRYSTAL_FREQ / 12 / INTERRUPT_PERIOD_0) % 256;
	flag++;//记录每一个250us
	
	if(flag==2000)//0.5s get   					函数1,切换叮咚
	{
		flag=0;
		if(start==0)  //
		{
		start=~start;
		}
		else
		{
			start=0;
			stop=~stop;
			TR0=0;//关闭定时器,等待下次按铃
		}
	}
	if(start==0)//								函数2,检测到按键后ding响,0.5s后执行函数1,让start=1
	{
	ding++;
	if(ding==3)
		{
			ding=0;
			beep=~beep;
		}
	}
	else	//									函数3,start=1之后开始执行,执行完执行函数1
	{
	dong++;
	if(dong==4)
		{
			dong=0;
			beep=~beep;
		
		}
	}

	
	}



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值