基于51单片机的多路报警器Protues仿真设计

news2024/12/26 23:45:24

一、设计背景

        随着社会的发展和技术的进步,安全问题越来越受到重视。各种工业设施、家庭、商业场所以及公共场所的安全保障成为了重点。报警器作为安全防护系统的重要组成部分,在预防和及时应对各种突发事件中发挥着至关重要的作用。传统的报警器通常在功能上比较单一,仅能处理一种类型的警报事件,难以满足复杂环境下的多样化需求。因此,基于51单片机的多路报警器设计应运而生,以满足现代安全防护系统的需求。  

        51单片机因其结构简单、功能强大、价格低廉以及开发工具丰富等优点,广泛应用于各种电子项目中。特别是在需要实现多种功能和处理复杂逻辑的场合,51单片机展现了其独特的优势。基于51单片机的多路报警器能够通过其强大的计算和控制能力,支持多种传感器输入,实现多路报警功能,这对于提升报警系统的智能化水平和灵活性具有重要意义。

       本设计中,51单片机充当了核心控制器的角色,通过IO口与各个功能模块相连接。4*4矩阵键盘负责模拟16路报警信号,当矩阵键盘某个按键按下时,视为该路触发报警,此时会通过IO口电平的变化通知单片机,单片机会记录发生报警的路数,通过数码管显示当前的报警路数并通过蜂鸣器进行报警提示。

       软件系统采用C语言编写程序,包括显示程序,定时中断服务,延时程序等,并在KEIL5中调试运行,硬件系统利用PROTEUS8.11强大的功能来实现,简单切易于观察,在仿真中就可以观察到实际的工作状态。

二、实现功能

        以51单片机为控制核心,设计一种多路报警器。整个系统包括MCU、晶振电路、时钟电路、矩阵键盘、蜂鸣器控制电路以及数码管显示电路。该系统通过矩阵键盘不同按键按下模拟不同路数触发报警,利用共阳数码管实时显示发生报警的路数,并通过蜂鸣器进行报警提示。可具体实现以下功能:

    (1)使用4*4矩阵键盘模拟16路报警信号。
    (2)当某一个按键按下时,即视为该路发生报警,两位数码管显示当前发生报警的路数,并且以方波驱动蜂鸣器实现报警。
    (3)16路均未发生报警时,数码管显示00。

三、仿真演示

未运行仿真时,数码管不显示。

运行仿真后,进入非报警界面,此时未触发任何一路报警。

按下矩阵键盘的按键1,表示第1路触发报警,数码管显示01,蜂鸣器“滴答”3声进行报警提示。

按下矩阵键盘的按键6,表示第6路触发报警,数码管显示06,蜂鸣器“滴答”3声进行报警提示。 

按下矩阵键盘的按键14,表示第14路触发报警,数码管显示14,蜂鸣器“滴答”3声进行报警提示。 

按下矩阵键盘的按键16,表示第16路触发报警,数码管显示16,蜂鸣器“滴答”3声进行报警提示。 

四、源程序(部分)

#include "reg52.h"

sbit wei0=P3^2;
sbit wei1=P3^3;
sbit Beep=P0^0;//蜂鸣器

unsigned char a=0;
unsigned char disCode[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //数码管段码 0~9
unsigned char Num=0,number=0;//号码
unsigned int Jishu=0,BeepC=0;  //时间计数加
void DisplaySMG();//数码管延时
bit BeepFlag=0;

void Delay1ms(unsigned int n)
{
	unsigned char i, j;	
	for (; n>0; n--)
		for(i=0;i<10;i++)
			for(j=0;j<33;j++);	
}

/**定时器初始化函数**/
void Tim0_Init()
{
	TMOD=0x01;		  //设定定时器状态
	TH0=0xfc;		   //1ms
	TL0=0x18;		   //赋初值	
	ET0=1;			  //打开T0中断允许开关
	EA=1;			  //打开中断总开关
}

void disPlay(unsigned char num)	 //数码管、led显示函数
{
	P2 = 0xff;	//消除重影
	wei0=1;wei1=0; //位码输出
	P2 = disCode[num/10];	//段码输出
	Delay1ms(1);	//增加显示时间,防止显示过暗
	
	P2 = 0xff;	//消除重影
	wei1=1;wei0=0; //位码输出
	P2 = disCode[num%10];	//段码输出
	Delay1ms(1);	//增加显示时间,防止显示过暗
}

void SMGdelay(unsigned int t)
{
   while(t--)
	 {
	   disPlay(a);	 //数码管显示函数
	 }
}

void keycheckdown()				/* 反转法键盘扫描 */
{
	short temp1,temp2,temp;
	P1=0xf0;						/* 输入行值(或列值) */
	SMGdelay(20);				/* 延时 */
	temp1=P1;						/* 读列值(或行值) */
	P1=0xff;
	SMGdelay(20);				/* 延时 */
	P1=0x0f;						/* 输入列值(或行值) */
	SMGdelay(20);				/* 延时 */	
	temp2=P1;						/* 读行值(或列值) */
	P1=0xff;
	temp=(temp1&0xf0)|(temp2&0xf);	/* 将两次读入数据组合 */
	switch(temp)					/* 通过读入数据组合判断按键位置 */
	{
		case 0x7e :a=4;BeepFlag=1;TR0=1;break;// 	按键4
		case 0x7d :a=3;BeepFlag=1;TR0=1;break; //  按键3
		case 0x7b :a=2;BeepFlag=1;TR0=1;break; //  按键2 
		case 0x77 :a=1;BeepFlag=1;TR0=1;break; // 	按键1  

		case 0xbe :a=8;BeepFlag=1;TR0=1;break;//  按键8
		case 0xbd :a=7;BeepFlag=1;TR0=1;break; // 	按键7
		case 0xbb :a=6;BeepFlag=1;TR0=1;break; // 	按键6
		case 0xb7 :a=5;BeepFlag=1;TR0=1;break; // 	按键5

		case 0xde :a=12;BeepFlag=1;TR0=1;break;// 按键12
		case 0xdd :a=11;BeepFlag=1;TR0=1;break;	//  按键11
		case 0xdb :a=10;BeepFlag=1;TR0=1;break;	//  按键10
		case 0xd7 :a=9;BeepFlag=1;TR0=1;break;	//  按键9

		case 0xee :a=16;BeepFlag=1;TR0=1;break;//  按键16   
		case 0xed :a=15;BeepFlag=1;TR0=1;break;// 按键15
		case 0xeb :a=14;BeepFlag=1;TR0=1;break;// 按键14
		case 0xe7 :a=13;BeepFlag=1;TR0=1;break;// 按键13
	}
}

//主函数
void main()
{
	Tim0_Init();
	while(1)
	{
		 keycheckdown();	
     disPlay(a);	
	}
}
/**定时器T0工作函数**/
void Time0() interrupt 1
{
 TH0=0xfc;		   //1ms
 TL0=0x18;		   //重新赋初值
 Jishu++;  //计数加
 if(Jishu==500)//计数大于5000
 {
    Jishu=0;		//数据清零
	  if(BeepFlag==1)
		{
		  Beep=~Beep;
			BeepC++;
			if(BeepC==6)
			{
				 BeepC=0;
				 BeepFlag=0;
				 TR0=0;
			}
		}
  }
}

仿真源文件及源程序百度网盘链接:https://pan.baidu.com/s/1mQ3l7uxPm8QCPjz71WfQFA 
提取码:yevc 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1925799.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++】哈希(散列)表

目录 一、哈希表的基本概念1.哈希的概念2.哈希冲突2.1 哈希函数2.2 哈希冲突的解决办法2.2.1 闭散列2.2.2 开散列 二、哈希表的实现1.闭散列的实现1.1 闭散列的结构1.2 闭散列的插入1.3 闭散列的删除1.4 闭散列的查找 2.开散列的实现2.1 key值不能取模的情况2.2 开散列的结构2.…

Redis的安装配置及IDEA中使用

目录 一、安装redis&#xff0c;配置redis.conf 1.安装gcc 2.将redis的压缩包放到指定位置解压 [如下面放在 /opt 目录下] 3.编译安装 4.配置redis.conf文件 5.开机自启 二、解决虚拟机本地可以连接redis但是主机不能连接redis 1.虚拟机网络适配器网络连接设置为桥接模式…

STM32智能空气质量监测系统教程

目录 引言环境准备智能空气质量监测系统基础代码实现&#xff1a;实现智能空气质量监测系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;空气质量监测与优化问题解决方案与优化收尾与总结 1. 引言 智能空…

【练习】分治--归并排序

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f525;个人专栏&#xff1a;算法(Java)&#x1f4d5;格言&#xff1a;吾愚多不敏&#xff0c;而愿加学欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 归并排序 代码实现 交易逆序对的总数 题目描述 ​编辑 题解 代码实…

基于Vue和UCharts的前端组件化开发:实现高效、可维护的词云图与进度条组件

基于Vue和UCharts的前端组件化开发&#xff1a;实现高效、可维护的词云图与进度条组件 摘要 随着前端技术的迅速发展和业务场景的日益复杂&#xff0c;传统的整块应用开发方式已无法满足现代开发的需求。组件化开发作为一种有效的解决方案&#xff0c;能够将系统拆分为独立、…

汽车的驱动力,是驱动汽车行驶的力吗?

一、地面对驱动轮的反作用力&#xff1f; 汽车发动机产生的转矩&#xff0c;经传动系传至驱动轮上。此时作用于驱动轮上的转矩Tt产生一个对地面的圆周力F0&#xff0c;地面对驱动轮的反作用力Ft(方向与F0相反)即是驱动汽车的外力&#xff0c;此外力称为汽车的驱动力。 即汽车…

C++中跨平台类的设计方法

目录 1.引言 2.具体实现 2.1.单一继承实现 2.2.桥接方式实现 3.总结 1.引言 进行C代码的跨平台设计&#xff0c;主要目标是确保编写的代码能够在不同的操作系统&#xff08;如Windows、Linux、macOS等&#xff09;和硬件架构&#xff08;如x86、ARM等&#xff09;上无缝运…

leetcode--二叉树中的最大路径和

leetcode地址&#xff1a;二叉树中的最大路径和 二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点&#xff0c;且不一定经过根节点。 路径和 是路径中各节点值的总…

编译x-Wrt 全过程

参考自;​​​​​​c编译教程 | All about X-Wrt 需要详细了解的小伙伴还请参看原文 ^-^ 概念&#xff1a; x-wrt&#xff08;基于openwrt深度定制的发行版本&#xff09; 编译系统: ubuntu22.04 注意&#xff1a; 特别注意的是&#xff0c;整个编译过程&#xff0c;都是用 …

C到C嘎嘎的衔接篇

本篇文章&#xff0c;是帮助大家从C向C嘎嘎的过渡&#xff0c;那么我们直接开始吧 不知道大家是否有这样一个问题&#xff0c;学完C的时候感觉还能听懂&#xff0c;但是听C嘎嘎感觉就有点难度或者说很难听懂&#xff0c;那么本篇文章就是帮助大家从C过渡到C嘎嘎。 C嘎嘎与C的区…

代码随想录算法训练营第三十四天|322. 零钱兑换、279.完全平方数

322. 零钱兑换 给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额&#xff0c;返回 -1。 dp[j]凑足总额为j的方法有dp[j]个。 递推公式&#xff1a;凑足金额为j-coins[i]的方法有d…

linux下安装cutecom串口助手;centos安装cutecom串口助手;rpm安装包安装cutecom串口助手

在支持apt-get的系统下安装 在终端命令行中输入&#xff1a; sudo apt-get install cutecom 安装好后输入 sudo cutecom 就可以了 关于如何使用&#xff0c;可以看这个https://www.cnblogs.com/xingboy/p/14388610.html 如果你的电脑不支持apt-get。 那我们就通过安装包…

【Android】kotlin jdk版本冲突与Kotlin依赖管理插件

1、androidx.activity&#xff1a;activity&#xff1a;1.8.0 依赖版本错误问题 *依赖项“androidx.activity&#xff1a;activity&#xff1a;1.8.0”要求依赖它的库和应用针对版本 34 或更高版本 Android API 进行编译。&#xff1a;app 目前是针对 android-33 编译的。此外…

QTabWidget、QListWidget、QStackedWidget

The QTabWidget class provides a stack of tabbed widgets. More... The QListWidget class provides an item-based list widget. More... QStringList strlist;strlist<<"系统"<<"外观"<<"截图"<<"贴图"…

FPGA设计之跨时钟域(CDC)设计篇(1)----亚稳态到底是什么?

1、什么是亚稳态? 在数字电路中,如果数据传输时不满足触发器FF的建立时间要求Tsu和保持时间要求Th,就可能产生亚稳态(Metastability),此时触发器的输出端(Q端)在有效时钟沿之后比较长的一段时间都会处于不确定的状态(在0和1之间振荡),而不是等于数据输入端(D端)的…

Java NIO 总结: NIO技术基础回顾

❃博主首页 &#xff1a; 「码到三十五」 &#xff0c;同名公众号 :「码到三十五」&#xff0c;wx号 : 「liwu0213」 ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a…

k8s集群新增节点

目前集群状态 如K8S 集群搭建中规划的集群一样 Masternode01node02IP192.168.100.100192.168.100.101192.168.100.102OSCent OS 7.9Cent OS 7.9Cent OS 7.9 目前打算新增节点node03 Masternode01node02node03IP192.168.100.100192.168.100.101192.168.100.102192.168.100.1…

Java核心篇之JVM探秘:对象创建与内存分配机制

系列文章目录 第一章 Java核心篇之JVM探秘&#xff1a;内存模型与管理初探 第二章 Java核心篇之JVM探秘&#xff1a;对象创建与内存分配机制 第三章 Java核心篇之JVM探秘&#xff1a;垃圾回收算法与垃圾收集器 第四章 Java核心篇之JVM调优实战&#xff1a;Arthas工具使用及…

Windows11终端winget配置

一、工具安装 Windows11是自带该工具的&#xff0c;如果wind10&#xff0c;可以找应用商店和GitHub上进行下载。 安装地址使用 winget 工具安装和管理应用程序 | Microsoft Learn 发布地址 Releases microsoft/terminal GitHub 二、无法使用问题排错 在命令行界面出现以…

鸿蒙读取本地文件同步,异步的优化问题

一、问题引入 有这样一个业务场景&#xff0c; 在进入一个新页面前&#xff0c;需要读取本地文件 。 当这个文件比较大时 &#xff0c;会造成加载页面时间过长。 二、 问题讲解 一般在页面的aboutToAppear里&#xff0c;我们会同步读取文件 &#xff0c; 因为页面UI 依赖文件…