山东大学单片机原理与应用实验 4.1 按键声光报警实验

该博客围绕51单片机按键声光报警实验展开,介绍了实验题目、要求,阐述实验过程,先通过Proteus和keil进行软件仿真验证代码,后进行硬件实验,记录了硬件连接、程序设置等步骤,还给出实验流程图和源代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、实验题目

二、实验要求

三、实验过程及结果

四、实验流程图

五、实验源代码


一、实验题目

4.4按键声光报警实验

二、实验要求

1、画出实验的流程图

2、编写源程序并进行注释

3、记录实验过程

4、记录程序运行结果截图

三、实验过程及结果

本实验联系静态按键识别,发光二极管驱动,以及外部中断的使用方法,实验原理图如下图1所示(注:图中元件编号中括号里面的内容表示该元件所在的板子名称,如CPU 表示该元器件位于CPU 板,以下类同)。

图1:实验原理图

要求利用外部硬件中断,按键按下一次产生一次外部中断,在中断服务程序中计数器加1,同时,通过发光二极管的闪烁和蜂鸣器响的次数,指示计数器的当前值。当计数到10时,再次按键将重新从1开始计。

1. 在实验前先采用软件仿真的方式验证代码。

   1)使用Proteus软件搭建实验电路如下所示:

图2:实验电路图

 2)使用keil软件新建工程与文件,将代码写入,并且build,将hex文件导入

 3)观察实验结果如下图所示,可知程序运行符合题意:

图3:仿真实验结果

2. 硬件实验运行

1)关掉实验箱电源。将 MCU 板插接在母板上,按照前面连接关系表将硬件连接好。

2)在仿真器断电情况下将仿真器的仿真头插在 MCU 板的MCU 插座上。将仿真器与开发PC 机的通信口连接好,打开实验箱及仿真器的电源。

3)运行 Keil uVision2 开发环境,建立工程int0_c.uV2,MCU 为AT89S51,包含启动文件STARTUP.A51。

4)按照实验功能要求创建源程序 int0.c 并加入到工程int0_c.uV2,并设置工程

int0_c.uV2 属性,将其晶振频率设置为11.0592MHz,选择输出可执行文件,DEBUG方式选择硬件DEBUG,并选择其中的“WAVE V series MCS51 Driver”仿真器。
5)构造(Build)工程 int0_c.uV2。如果编程有误进行修改,直至构造正确为止。

6)运行程序,按下 MCU 板上的KEY0 按键,观察每次按键按下时主板上的发光二极管的闪烁和蜂鸣器响的次数,是否符合程序要求,若不符合要求,分析出错原因,继续重复第4、5 步的步骤,直至结果正确。

通过硬件实验可知,按下按键即可看到灯闪一次,蜂鸣器响一次;再次按下,就是闪两次,响两次。一直到最后闪10次,响十次;再次按下时,跳回1重新开始。

四、实验流程图

图4:实验流程图

五、实验源代码

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit led=P3^0;     //定义led灯控制端口
sbit bell=P3^1;    //定义蜂鸣器控制端口
sbit key=P3^2;    //定义报警控制端口
uchar count,i;    //定义计数器
void delay(uchar count)  // 定义延时函数
{
	uint x,y;
	for(x=count;x>0;x--)   //循环嵌套
    	for(y=110;y>0;y--);  //1ms延时函数
}//总延时为count*1 ms 

void show(uchar count)  // 定义蜂鸣器报警并且灯光闪烁
{     i=count; 	//循环变量
      for(;i!=0;i--)   //函数循环次数
          {led=0;   //置低电平则LED灯亮
           bell=0;   // 置低电平则蜂鸣器响
           delay(500); //调用延时函数
           led=1; //置高电平则LED灯灭
           bell=1; //置高电平蜂鸣器不响
           delay(500); //调用延时函数
           }
}
void s_timer0() interrupt 0 using 0 // 定义中断程序
{
EA=0;   //屏蔽中断请求
     if(count!=10)
          count=count+1;   //count自增
     show(count); 
     delay(50);//延时
     if(count==10)   // 紧接着就要判断是否是10,否则,再响十次之后,下一次不会是响一次。
           count=0;  //若count为10则结束,重新赋值为0
     EA=1;  //允许中断
}
void main()     // 主程序
{     
    EA=1;    //允许中断
	EX0=1;     //允许外部中断0中断
	IT0=0;   //设置外中断0为电平触发方式
	while(1);   //循环 
}

初学单片机,可能存在错误之处,还请各位不吝赐教。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

timerring

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值