51单片机病房呼叫器(8位病床)

这篇具有很好参考价值的文章主要介绍了51单片机病房呼叫器(8位病床)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

内容描述

工具

总体设计

Proteus仿真图:

 Keil程序完整代码:

完整成品链接

程序流程图

 详细描述


内容描述

系统若某一个病房呼叫,护士站内的显示模块能显示相应的病房号,而且与该病房号对应的指示灯也要点亮,并响铃报警;当护士处理完相应病房的事情时,可按下按键,红色报警灯熄灭表示护士已处理完事情。

        功能:(1) 系统能控制8个病房的情况;

                (2)每个病房有独立的按键和指示灯;

                (3)要求护士值班室有1个响应键;

                (4)要求护士站内有显示;

                (5)要求护士站内有与病房号对应的警报灯和蜂鸣器;

                (6)按下复位键后系统重新自检。

工具

代码编写:Keil uVision5

仿真工具:Proteus 8 Professional

总体设计

整个系统有八部分组成:单片机控制模块、按键扫描模块、数码管显示模块、LED灯显示模块、晶振模块、复位模块、报警灯和蜂鸣器模块、响应模块。

其中单片机控制器则是采用的是AT89C51,AT89SC51是一个低功耗,高性能CMOS 8位单片机,片内含4k Flash,40个引脚,对于完成这个任务非常适合。

按键扫描模块使用的是类似矩阵按键,这样按键占用较少的引脚就能实现较多按键值的读取。

数码管显示模块负责床号的显示,用来提示护士哪个床号有病人呼叫。

LED灯显示模块用来提示护士哪个病床需要帮助。

晶振模块为单片机系统提供基准时钟信号。

复位模块使单片机系统初始化。

报警灯和蜂鸣器模块为本系统提供声音和LED灯指示的报警用来提示护士有病床需要帮助。

响应电路:当护士处理完相应病房的事情时,可按下按键,绿色报警灯和红色LED灯熄灭表示护士已处理完事情。

Proteus仿真图:

51单片机病房呼叫器(8位病床)

 Keil程序完整代码:

#include<reg51.h>  
#define uchar unsigned char
#define uint unsigned int
sbit LED=	P3^0;		  //定义LED指示灯接口
sbit BUZZER =	P3^3;	//蜂鸣器接口
sbit key=	P3^7;		  //清除按键

sbit led1 =	P2^0;
sbit led2 =	P2^1;
sbit led3 =	P2^2;
sbit led4 =	P2^3;
sbit led5 =	P2^4;
sbit led6 =	P2^5;
sbit led7 =	P2^6;
sbit led8 =	P2^7;
uint array[10]={1,1,1,1,1,1,1,1,1};



uchar code table[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//共阳数码管编码
uchar Key_scan() //扫描按键
{
	static uchar key_down;
	uchar t=200;
	uchar key_num=0xff,tem,i; 
	uchar keynum_tab[14]={0x7e,0xd7,0xb7,0x77,0xdb,0xbb,0x7b,0xdd,0xbd,0x7d,0xde,0xbe,0x7e};//表格数据是根据按键值和个按键的定义的出来的
	P1 = 0xf0;
	if(P1 != 0xf0)//说明有按键按下
	{	
		while(t--);//延时去抖动				
		if((key_down==0))	
		{
			tem = P1;
			P1=0XFF;
			P1 = (tem|0x0f);
			key_num = P1;
			key_down=1;	 
		
			for(i=1;i<9;i++)
			{
				if(keynum_tab[i]==key_num){
					array[i]=0;
					
				break;}
			}
			return i;
				
		}
		else
			return 0xff;		  		   
	}	
	else
	{
		key_down = 0;
		return 0xff;		
	}  
  
}
 //刷新显示num
 void Dispaly(uchar num)
 {
 	//static uchar t=0;
		P0=0xff;
	
	 if(num!=0){
		 P0=table[num];
	 }
	 if(array[1]==0){
		 led1=0;
	 }
	 if(array[2]==0){
		 led2=0;
	 }
	 if(array[3]==0){
		 led3=0;
	 }
	 if(array[4]==0){
		 led4=0;
	 }
	 if(array[5]==0){
		 led5=0;
	 }
	 if(array[6]==0){
		 led6=0;
	 }
	 if(array[7]==0){
		 led7=0;
	 }
	 if(array[8]==0){
		 led8=0;
	 }
   
 }
/*主函数*/						  
void main(void)
{
  uchar num=0,House_num=0;
  uchar flag=0;
  uchar i=200;
	
	uint j=1;
	led1=1;
	led2=1;
	led3=1;
	led4=1;
	led5=1;
	led6=1;
	led7=1;
	led8=1;
	
  while(1)
  {
  	num=Key_scan(); //获取矩阵按键数值
	  if(num<9&&flag==0) //有按键按下就打开指示灯和报警
	  {
		House_num=num;
		LED=0;
		BUZZER=0;
		flag=1;
	  }
	  if(key==0)//清零键按下
	  {
	  	while(i--);	//延时去抖
			if(key==0)//清除报警和指示灯
			{
				LED=1;
				BUZZER=1;
				
				flag=0;	
			/*	if(House_num==1){
						array[1]=1; 
						led1=1;
				}else if(House_num==2){
						array[2]=1;
						led2=1;
				}else if(House_num==3){
						array[3]=1;
						led3=1;
				}else if(House_num==4){
						array[4]=1;
						led4=1;
				}else if(House_num==5){
						array[5]=1;
						led5=1;
				}else if(House_num==6){
										array[6]=1;
										led6=1;
				}else if(House_num==7){
										array[7]=1;
										led7=1;
				}else if(House_num==8){
										array[8]=1;
										led8=1;
			 }*/
		
			 switch(House_num){
				 case 1:
								array[1]=1; 
								led1=1;
								break;
				 case 2:
								array[2]=1;
								led2=1;
								break;
				 case 3:
								array[3]=1;
								led3=1;
								break;
				 case 4: 
								array[4]=1;
								led4=1;
								break;
				 case 5:
								array[5]=1;
								led5=1;
								break;
				 case 6:
								array[6]=1;
								led6=1;
								break;
				 case 7:
								array[7]=1;
								led7=1;break;
				 case 8:
								array[8]=1;
								led8=1;
								break;
				 default:
								break;
			 }
				House_num=0;//清除房间号		
			 
		}
	  }
	  
	   for(j=1;j<9;j++){
			 if(array[j]==0){
				 House_num=j;
				 break;
		 }
	 }
		Dispaly(House_num);//显示相应的房间号 
	}
}

完整成品链接

病房呼叫器

程序流程图

51单片机病房呼叫器(8位病床)

 详细描述

复位电路:由电容串联电阻构成,由图并结合“电容电压不能突变”的性质,可以知道,当系统一上电,RST脚将会出现高电平,并且,这个高电平持续的时间由电路的RC值来决定。典型的51单片机当RST脚的高电平持续两个机器周期以上就将复位,所以,适当组合RC的取值就可以保证可靠的复位,C取1u,R取100,让RC组合可以在RST脚上产生不少于2个机周期的高电平。根据电路分析,可以算出电容充电到电源电压的0.7倍(单片机的电源是5V,所以充电到0.7倍即为3.5V),需要的时间100k*1UF=0.1S,大于两个机器周期2us((1个机器周期等于12个振荡周期,即计数频率为晶振频率的1/12),所以单片机就能复位。

 晶振电路:典型的晶振取1MHz可以准确地得到9600波特率和19200波特率,用于有串口通讯的场合;取12MHz可以产生精确的uS级时歇,方便定时操作,这里我们没有用到串口通讯,直接使用12MHz的晶振以获得更加精确的时间。

数码管显示电路,这里使用的是一个一位的共阳数码管,用来显示具体是哪个床位呼叫,接入到单片机的P0端口,给低电平能够点亮。数码管的动态扫描是利用人眼的视觉暂留效应,让数码管分时段依次点亮,当轮寻的频率快到一定程度的时候,人眼就感觉不到数码管在闪烁了,这就是所谓的数码管动态扫描。动态扫描相较于静态显示的优势是占用较少的单片机引脚。

指示灯电路比较简单,主要由LED灯和排阻组成,接入到单片机的P2端口,给的电平能够点亮。根据LED灯的颜色和封装不同电流也不同,一般点亮一个LED灯只需要几毫安就可以了。电流越大指示灯越亮。如果想要点亮LED灯只需要把相应的IO口拉低就可以了。

蜂鸣器的驱动单路由一个蜂鸣器、电阻和一个PNP三极管组成,由于蜂鸣器的工作电流比较大所以使用三极管进行驱动。通过调整P3.3口的高低电平,来实现三极管的开关作用,之所以通过三极管的发射极引导电流进入集电极,而不是用P3.3直接加到蜂鸣器上,是因为单片机的功率很小,虽然可以输出很高的电压,但是是无法驱动这种功率器件的。

当P3.3口输出高电平(5V)时,VCC即电源也是5V,此时三极管没有导通,所以蜂鸣器无反应,当输出低电平时,发射极电压远大于基极,电流从发射极流入集电极,蜂鸣器震动。

报警灯电路比较简单,主要由LED灯和电阻组成,接入到单片机的P3.0端口,给低电平能够点亮。根据LED灯的颜色和封装不同电流也不同,一般点亮一个LED灯只需要几毫安就可以了。电流越大指示灯越亮。当有病房按键按下时,IO口拉低LED灯被点亮。

响应电路则是由一个按键构成,接到单片机的P3.7端口,当护士处理完事情时按下按键得到低电平,LED指示灯和报警灯同时熄灭,蜂鸣器停止鸣响。

一个类似矩阵的按键每行接在一起,每列接在一起,然后分别与单片机的P1口进行连接。其工作原理是单片机不断的逐行扫描按键来确定到底是哪一个按键被按下了,然后根据按下的按键再进行相应的操作。

起初,先给全体赋予高电平1(P1=0xFF),如果出现一个端口为低电平0,说明这条线路导通了,那么就可以判断是哪个按键按下了。

(由于P1端口有8个接口,用矩阵的方式最多可以形成16个按键,由于题目要求这里只做了8个)

 文章来源地址https://www.toymoban.com/news/detail-476851.html

到了这里,关于51单片机病房呼叫器(8位病床)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 51单片机项目(9)——基于51单片机的电子琴设计

    简易电子琴设计设计内容: 1.用矩阵键盘代表琴键,至少能弹出8个音符,分别是:音符1.23.4.,5,6,  2.键按下的时间长短表征节拍的长短,用蜂鸣器发出声音 3.数码管显示出当前音符 4.音量可调 (代码及其工程文件放在最后) 电路图如下: 51单片机电子琴是一种基于51单片机(

    2024年02月09日
    浏览(48)
  • 51单片机项目(7)——基于51单片机的温湿度测量仿真

    本次做的设计,是利用DHT11传感器,测量环境的温度以及湿度,同时具备温度报警的功能:利用两个按键,设置温度阈值的加和减,当所测温度大于温度阈值的时候,蜂鸣器就会响起,进行报警提示。 同时系统还有一个LCD1602屏幕,用于显示实时的温度湿度,还可以显示温度阈

    2024年02月10日
    浏览(50)
  • 51单片机实现贪吃蛇(清翔单片机)

    目录 一、创作背景 二、实现过程 1.一些声明与定义 2.键盘扫描 3.定时器中断 5.蛇的初始化 6.蛇体的移动 7.食物的创建 8.食物的检测和身体的增长 9.检测死亡 10.总代码 总结 由于大一的一个小作业,花了10天完成了这个小项目,中途克服了很多困难,发此文章以作纪念。 这些

    2024年02月08日
    浏览(47)
  • 51单片机:设计一单片机双机通信电路

    鱼弦:CSDN内容合伙人、CSDN新星导师、全栈领域优质创作者 、51CTO(Top红人+专家博主) 、github开源爱好者(go-zero源码二次开发、游戏后端架构 https://github.com/Peakchen) 设计一单片机双机通信电路。要求编程实现:甲单片机系统中的按键可以控制乙单片机系统中的数码管(MPX8)动

    2024年02月20日
    浏览(54)
  • 51单片机的基础知识——单片机简介

    仅用于学习交流!!! 仅用于学习交流!!! 仅用于学习交流!!! 单片机,即单片微型计算器,简称为单片机。用专业术语来讲单片机就是在一块硅片上集成了微处理器、存储器以及各种输入/输出(I/O,I指的是input,O指的是output)口的芯片。通俗点讲,单片机是一块集

    2024年02月03日
    浏览(61)
  • 【单片机】51单片机串口的收发实验,串口程序

    这段代码是使用C语言编写的用于8051单片机的串口通信程序。它实现了以下功能: 引入必要的头文件,包括reg52.h、intrins.h、string.h、stdio.h和stdlib.h。 定义了常量FSOC和BAUD,分别表示系统时钟频率和波特率。 定义了一个发送数据的函数send,该函数将数据发送到串口,等待数据

    2024年02月14日
    浏览(45)
  • 【51单片机系列】proteus仿真单片机的串口通信

    本文参考:https://zhuanlan.zhihu.com/p/425809292。 在proteus之外使用串口软件和单片机通信。通过在proteus设计一个单片机接收PC发送的数据,并将接收的数据发送出去,利用软件【Configure Virtual Serial Port Driver】创建一对虚拟串口,利用软件【串口助手】向单片机发送数据。 proteus仿真

    2024年01月17日
    浏览(52)
  • 单片机开发教程5——51单片机驱动TFT彩屏

    TFT.zip 开发资料中的例程有些瑕疵,上面是整理后的例程,修改了一些参数,也添加了不少函数,函数都有对应的注释,只要花心思去看一应该是能看懂怎么用的。此外,这个例程也可以作为你们工程的模板,往上面添加一些函数、完善一下内容,差不多就能做出一个作品了

    2023年04月23日
    浏览(47)
  • 51单片机(一)软硬件环境和单片机介绍

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋

    2024年02月11日
    浏览(50)
  • 【51单片机系列】单片机与PC进行串行通信

    工业现场的测控系统中,常使用单片机进行监测点的数据采集,然后单片机通过串口与PC通信,把采集的数据串行传送到PC机上,再在PC机上进行数据处理。 PC机配置的都是RS-232标准串口,为D型9针插座,输入/输出为RS-232电平。D型9针插头引脚如下: 如下表为RS-232C的D型9针插头

    2024年01月17日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包