基于AT89C51单片机的病房呼叫系统的设计(含文档、源码与proteus仿真,以及系统详细介绍)

本篇文章论述的是基于AT89C51单片机的病房呼叫系统的设计的详情介绍,如果对您有帮助的话,还请关注一下哦,如果有资源方面的需要可以联系我。

目录

摘要

仿真图

系统总体方案

代码实现

系统论文

资源下载


摘要

随着无线技术的发展,无线应用技术已经渗透到生活的各个领域,无线传输技术也越来越成熟,本设计是将无线传输技术应用到临床上的研究型课题,实现基于单片机AT89C5l和无线传输系统构成的无线多路病床呼叫系统。本设计是以AT89C51单片机为核心,辅以矩阵键盘、LED显示电路和部分简单模拟和数字电路组成的能够实现病人与医护人员的远距离沟通。在此设计中每个病房都有一个按键,,按下按键,此时值班室的显示屏上会显示相应病房号,指示灯亮,声音报警,医护人员按下复位键取消当前呼叫。从硬件和软件方面阐述了该控制系统的设计方法,并经过调试和运行使该系统达到预期目标,通过对病区的的数据采集,实现医院医疗人员值班室与病人室之间的通信呼叫联系,是无线网络技术在临床上的大胆应用,具有反应快、功能齐全、实用性强的特点。

关键词:AT89C51;数码管;呼叫系统;矩阵键盘;

仿真图


系统总体方案


代码实现(部分)


#include <reg51.h>
#define uint unsigned int
#define uchr unsigned char
sbit led0=P2^2;
sbit buzzer=P2^3;
sbit dula=P2^6;                //声明段选线选通端
sbit wela=P2^7;                //声明位选线选通端
sbit clear=P3^4;
uchr key,shi,ge,count;
uchr code tab[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
0x76,0x79,0x38,0x3f};
/*延时子函数,xms为形参*/
void delay(uint xms)
{
    uint x,y;
    for(x=xms;x>0;x--)
        for(y=110;y>0;y--);
}

/*矩阵键盘扫描子程序*/
void matrixkeyscan()
{
    uint temp;
    P3=0xf7;                             //给P3口赋值
    temp=P3;
    temp=temp&0xf0;
    if(temp!=0xf0)                       //检测是否有键按下
    {
        delay(10);                       //延时去抖
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)                   //再次检测是否有键按下
        {
            temp=P3;
            switch(temp)
            {
                case 0x77:
                    key=1;
                    break;
                case 0xb7:
                    key=2;
                    break;
                case 0xd7:
                    key=3;
                    break;
                case 0xe7:
                    key=4;
                    break;              //判断按下的是哪个键
            }
            while(temp!=0xf0)
            {
                temp=P3;
                temp=temp&0xf0;        
            }                           //等待按键释放
        }
    }
    P3=0xfb;
    temp=P3;
    temp=temp&0xf0;
    if(temp!=0xf0)
    {
        delay(10);
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
            temp=P3;
            switch(temp)
            {
case 0x7b:
                    key=5;
                    break;
                case 0xbb:
                    key=6;
                    break;
                case 0xdb:
                    key=7;
                    break;
                case 0xeb:
                    key=8;
                    break;
            }
            while(temp!=0xf0)
            {
                temp=P3;
                temp=temp&0xf0;
            }
        }
    }
    P3=0xfd;
    temp=P3;
    temp=temp&0xf0;
    if(temp!=0xf0)
    {
        delay(10);
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
            temp=P3;
            switch(temp)
            {
                case 0x7d:
                    key=9;
                    break;
                case 0xbd:
                    key=10;
                    break;
               case 0xdd:
                    key=11;
                    break;
                case 0xed:
                    key=12;
                    break;
            }
            while(temp!=0xf0)
            {
                temp=P3;
                temp=temp&0xf0;
            }
        }
    }
    P3=0xfe;
    temp=P3;
    temp=temp&0xf0;
    if(temp!=0xf0)
    {
        delay(10);
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
            temp=P3;
            switch(temp)
            {
                case 0x7e:
                    key=13;
                    break;
                case 0xbe:
                    key=14;
                    break;
                case 0xde:
                    key=15;
                    break;
                case 0xee:
                    key=16;
                    break;
            }
            while(temp!=0xf0)
            {
                temp=P3;
                temp=temp&0xf0;
            }
        }
    }
}
/*主函数*/
void alarm()
{  
	buzzer=~buzzer;
	led0=~led0;
	delay(100);
}

系统论文(在这里只介绍部分)


Abstract

As wireless application technology has penetrated all aspects of life, wireless transmission technology is more and more sophisticated .This design is the wireless transmission technology to the clinical research on the subject, and the realization of wireless transmission based on single chip AT89C5l modules consisting of multiple beds call system. The system is award call system based on the 51 series micro-chip design. The system uses AT89CS1 micro-controller as the core, supplemented by matrix keyboard, LED dot matrix display of a simple circuit and some analog and digital circuits to achieve the transfer of information between patients and health care. In this design, each ward has a button, when patients in need, press the button, the display of the duty room to display the number of beds in this patient, people use to achieve circular display, press the medical staff "response" to cancel the current call. The design was introduced according to hardware and software. And through the commissioning and operation to achieve the desired goals .Based on data collection, ward hospital medical personnel duty and patient rooms of communication between the connect .The system is bold application of the wireless network technology in the clinical it has fast response, functional and practical features.

****Keywords:****AT89C51 , Digital pipe ,Calling system , Matrix keyboard

第3章 单片机AT89C51简介

3.1 AT89C51的基本结构

AT89C51是一种带4K字节闪存可编程可擦除只读存储器(FPEROM---Flash Programmable and Erasable Read Only Memory)的低电压,高性能CMOS 8位微处理器,俗称单片机。AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除100次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU(Cenctral Processing Unit)和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。AT89C系列单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。其管脚图如3-1所示:

图3-1 89C51管脚图

部分引脚说明:

  1. 时钟电路引脚XTAL1 和XTAL2:

XTAL2(18 脚):接外部晶体和微调电容的一端;在8051 片内它是振荡电路反相放大器的输出端,振荡电路的频率就是晶体固有频率。若需采用外部时钟电路时,该引脚输入外部时钟脉冲。
要检查8051/8031 的振荡电路是否正常工作,可用示波器查看XTAL2 端是否有脉冲信号输出。

XTAL1(19 脚):接外部晶体和微调电容的另一端;在片内它是振荡电路反相放大器的输入端。在采用外部时钟时,该引脚必须接地。

控制信号引脚RST,ALE,PSEN 和EA:

RST/VPD(9 脚):RST 是复位信号输入端,高电平有效。

ALE/PROG(30 脚):地址锁存允许信号端。当8051 上电正常工作后,ALE 引脚不断向外输出正脉冲信号,此频率为振荡器频率fOSC 的1/6。CPU 访问片外存储器时,ALE 输出信号作为锁存低8 位地址的控制信号。

ALE端的负载驱动能力为8 个LS 型TTL(低功耗甚高速TTL)负载。

此引脚的第二功能PROG 在对片内带有4KB EPROM 的8751 编程写入(固化程序)时,作为编程脉冲输入端。

PSEN(29 脚):程序存储允许输出信号端。在访问片外程序存储器时,此端定时输出负脉冲作为读片外存储器的选通信号。此引肢接EPROM 的OE 端(见后面几章任何一个小系统硬件图)。PSEN 端有效,即允许读出EPROM/ROM 中的指令码。PSEN 端同样可驱动8 个LS 型TTL 负载。要检查一个8051/8031 小系统上电后CPU 能否正常到EPROM/ROM 中读取指令码,也可用示波器看PSEN 端有无脉冲输出。如有则说明基本上工作正常。

EA/Vpp(31 脚):外部程序存储器地址允许输入端/固化编程电压输入端。

  1. 输入/输出端口P0/P1/P2/P3:

P0口(P0.0~P0.7,39~32 脚):P0口是一个漏极开路的8 位准双向I/O口。作为漏极开路的输出端口,每位能驱动8 个LS 型TTL 负载。当P0 口作为输入口使用时,应先向口锁存器(地址80H)写入全1,此时P0 口的全部引脚浮空,可作为高阻抗输入。作输入口使用时要先写1,这就是准双向口的含义。在CPU 访问片外存储器时,P0口分时提供低8 位地址和8 位数据的复用总线。在此期间,P0口内部上拉电阻有效。

P1口(P1.0~P1.7,1~8 脚):P1口是一个带内部上拉电阻的8 位准双向I/O口。P1口每位能驱动4 个LS 型TTL 负载。在P1口作为输入口使用时,应先向P1口锁存地址(90H)写入全1,此时P1口引脚由内部上拉电阻拉成高电平。

P2口(P2.0~P2.7,21~28 脚):P2口是一个带内部上拉电阻的8 位准双向I/O口。P口每位能驱动4个LS 型TTL 负载。在访问片外EPROM/RAM 时,它输出高8 位地址。
P3口(P3.0~P3.7,10~17 脚):P3口是一个带内部上拉电阻的8 位准双向I/O口。P3口每位能驱动4个LS型TTL负载。P3口与其它I/O 端口有很大的区别,它的每个引脚都有第二功能,如下:

P3.0:(RXD)串行数据接收。

P3.1:(RXD)串行数据发送。

P3.2:(INT0#)外部中断0输入。

P3.3:(INT1#)外部中断1输入。

P3.4:(T0)定时/计数器0的外部计数输入。

P3.5:(T1)定时/计数器1的外部计数输入。

P3.6:(WR#)外部数据存储器写选通。

P3.7:(RD#)外部数据存储器读选通。

3.2 AT89C51的指令系统

AT89C51的指令系统是一种简明、易掌握、效率较高的指令系统,它共有7种寻址方式,111条指令,按其功能可分为五大类:

  1. 数据传送类指令(28条);
  2. 算术运算类指令(24条);
  3. 逻辑操作类指令(25条);
  4. 控制转移类指令(17条);
  5. 位操作类指令(17条)。

指令的表示方法称为指令格式。一条指令通常有两部分组成:操作码和操作数。大多数指令在执行时都需要使用操作数。寻址方式就是在指令中说明操作数所在地址的方法,一般来说,寻址方式越多,单片机的功能就越强,灵活性则越大,指令系统则就越复杂,AT89C51单片机的指令系统有7中寻址方式。分别是:寄存器寻址方式、直接寻址方式、寄存器间接寻址方式、立即数寻址方式、基址寄存器加变址寄存器间接寻址方式、相对寻址方式和位寻址方式。

3.3 AT89C51单片机的定时/计数器

在单片机应用系统中,常常会有定时控制需求,如定时输出、定时检测、定时扫描等;也经常要对外部事件进行计数。80C51单片机内集成有两个可编程的定时/计数器:T0和T1,它们既可以工作于定时模式,也可以工作于外部事件计数模式,此外,T1还可以作为串行口的波特率发生器。

第4章 系统软件设计

4.1 单片机C语言程序设计步骤

程序设计步骤包括绘制程序流程图,编写程序,运行调试,仿真模拟等步骤。

病房呼叫系统软件设计均采用模块化设计,整个程序主要包括主程序、键盘扫描程序、显示程序。所有程序均采用单片机C语言编写。病房呼叫系统的软件设计思路说明如下:主程序的作用为程序初始化,显示病房编号(病房号的获得在键盘扫描程序中实现)。通过不断的扫描,检查是否有病人呼叫。显示程序通过扫描16个病床的判断标志截来决定是否需要显示床号。键盘扫描程序是重要组成部分,它的功能是判困是否有按键并进一步确认是哪个按键按下或释放,同时修改相应的标志位,以运用到显示程序中。

4.2 系统主程序流程图

主程序流程图给出了系统工作的基本过程,,描述了信号的基本流向,起到了一个向导的作用。

图4-1主程序流程图
主程序描述:首先对各存储单元初始化,设定定时初值,清零键,然后继续扫描键盘,

如扫描到键盘有键按下,则进而判断是嘟个床位按下,进而显示病床号时,要判断标志位, 若已经按下,则不响应,否则显示病床号。最后,返回扫描键值程序,准备下一次的判断。

4.3 显示程序流程图

显示程序主要是来判断是否需要显示,以及如何去显示,是十分重要的程序之一。设计流程图如4-2图所示。

图 4-2 显示程序流程图

显示程序描述:设定床号标志为,令n从1开始,判断床号是否为0,若不为0,表示有病房呼叫,则显示床号,继续扫描键值判断是否有别的病房呼叫,若n为0,表示无呼叫,则继续扫描下一病床号。
4.4 键盘扫描流程图

键盘电路设计为4*4矩阵式,在程序中可以先判断按键编码,然后在显示子程序中通过程序进行译码,再显示。设计流程图如图4-3所示:

图4-3 键盘扫描程序流程图


资源下载


如果有需要这个系统的源码、仿真、论文等资源的可以私信我。感谢你的阅读~

相关推荐
森旺电子2 小时前
51单片机仿真摇号抽奖机源程序 12864液晶显示
单片机·嵌入式硬件·51单片机
不过四级不改名6774 小时前
蓝桥杯嵌入式备赛教程(1、led,2、lcd,3、key)
stm32·嵌入式硬件·蓝桥杯
小A1594 小时前
STM32完全学习——SPI接口的FLASH(DMA模式)
stm32·嵌入式硬件·学习
Rorsion4 小时前
各种电机原理介绍
单片机·嵌入式硬件
善 .7 小时前
单片机的内存是指RAM还是ROM
单片机·嵌入式硬件
超级码农ProMax7 小时前
STM32——“SPI Flash”
stm32·单片机·嵌入式硬件
Asa3198 小时前
stm32点灯Hal库
stm32·单片机·嵌入式硬件
end_SJ10 小时前
初学stm32 --- 外部中断
stm32·单片机·嵌入式硬件
gantengsheng11 小时前
基于51单片机和OLED12864的小游戏《贪吃蛇》
单片机·嵌入式硬件·游戏·51单片机
嵌入式小强工作室11 小时前
stm32 查找进硬件错误方法
stm32·单片机·嵌入式硬件