P1.5接蜂鸣器,P3.2接按键K1,开启外部中断,利用定时器T0在蜂鸣器引脚上产生1k赫兹或2k赫兹的方波,使蜂鸣器发出两种不同音调的声音,两种音调各持续0.1秒,初始状态蜂鸣器安静,按下K1蜂鸣器开始发声,再按下按键安静,以此反复
时间: 2024-05-04 11:17:54 浏览: 19
以下是8051单片机的代码实现:
```
#include <reg51.h>
sbit buzzer = P1^5; //定义蜂鸣器引脚
sbit key = P3^2; //定义按键引脚
void delay(int time) //延时函数
{
int i, j;
for(i=0; i<time; i++)
for(j=0; j<1275; j++);
}
void init() //初始化函数,包括定时器T0的设置和外部中断的设置
{
TMOD = 0x01; //设置定时器T0为模式1
TH0 = 0x3C; //设置定时器T0的初值
TL0 = 0xB0;
EA = 1; //开启总中断
ET0 = 1; //开启定时器T0中断
EX0 = 1; //开启外部中断INT0
IT0 = 1; //设置外部中断INT0为下降沿触发
}
void main()
{
init(); //初始化
while(1)
{
if(key == 0) //检测按键是否按下
{
delay(5); //去抖动
if(key == 0)
{
buzzer = 1; //开启蜂鸣器
delay(10); //持续0.1秒
buzzer = 0; //关闭蜂鸣器
delay(5); //去抖动
}
}
}
}
void timer0() interrupt 1 //定时器T0中断服务程序
{
static int count = 0; //计数器
count++; //计数器自增
if(count == 1000) //当计数器为1000时,产生1k赫兹方波
{
buzzer = ~buzzer; //翻转蜂鸣器状态
count = 0; //计数器清零
}
}
void external0() interrupt 0 //外部中断INT0服务程序
{
buzzer = 1; //开启蜂鸣器
delay(10); //持续0.1秒
buzzer = 0; //关闭蜂鸣器
delay(5); //去抖动
}
```
在程序中,定时器T0被设置为模式1,其工作方式为16位定时器/计数器,每个机器周期计数器加1,当计数器溢出时,定时器中断标志位TF0被置位,同时重新加载初值TH0和TL0。本程序中TH0和TL0的初值为0x3CB0,这个值可以产生1ms的定时器中断。在定时器T0中断服务程序中,计数器被自增,当计数器为1000时,蜂鸣器的状态被翻转,从而产生1k赫兹的方波。
外部中断INT0被设置为下降沿触发,当按键被按下并松开时,产生下降沿触发,调用外部中断INT0的中断服务程序,在其中开启蜂鸣器,持续0.1秒后关闭。由于按键存在抖动,需要在按下按键后进行一定时间的延时,等待按键抖动结束。在主循环中,程序不断检测按键的状态,如果按下则调用外部中断INT0的中断服务程序,否则继续等待按键的按下。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)