1、 河南大学民生学院本科毕业论文学号:1103623042河南大学民生学院毕 业 论 文( 2015 届)年 级 11级 专 业 班 级 电子信息科学与技术(测控方向) 学 生 姓 名 指导教师姓名 耿涛 指导教师职称 副教授 论文完成时间 2015年 5月1日 目 录摘 要:11 前言31.1 医用无线呼叫系统的背景及意义31.2医用无线呼叫系统概述32 系统方案的论证42.1 单片机的选择42.2 通信方案选择42.3 显示模块方案选择42.4 报警模块方案选择53 系统硬件设计53.1 硬件总体设计框图53.2 电源电路的设计63.3 单片机STC89C52最小系统硬件设计73.4显示模块
2、的设计83.5报警硬件设计93.6无线模块硬件设计94 软件设计104.1 软件调试方法设计104.2 通信协议设计104.3 呼叫机程序流程图114.4 呼叫机程序设计124.5 接收机程序流程图194.6 接收机程序设计205 结论21参考文献2123医用无线呼叫系统的设计与实现(河南大学民生学院,河南 开封,475004)摘 要: 随着无线技术的发展,无线技术的可靠性也越来越高,在医用领域,传统的有线呼叫系统因为成本高,结构复杂,安装困难,检修不便等诸多缺点,给医院造成了财力,物力上的浪费,更多医院倾向于运用无线呼叫系统,无线呼叫系统不仅结构简单,价格低廉,而且方便移动,因此有广泛的应用
3、前景。本设计分为呼叫机和接收机,呼叫机和接收机都以STC89C52单片机为核心,通过呼叫机单片机串口驱动无线发射模块,发射编码信号,编码信号分起始码,开关码,病房码,校验码1,校验码2。无线接收模块接收编码信号后,通过串口将编码信号传给接收机单片机,接收机单片机先进行CRC校验,判断接收到的数据是否为编码信号,如果为编码信号则保留,并判断功能码,从而依据功能码判断语音报警方式,如果不是编码信号则舍弃,这样,实现了病人和医护人员的远距离及时沟通。通过软硬件设计,本系统实现了医用无线呼叫系统的设计要求,制作出实物,检测一切正常,可远距离300多米收发,运行稳定。关键词: 病房呼叫,无线通信,STC
4、89C52The design and implementation of wireless medical call systemXi Dao-bin(Henan University Minsheng College, Henan Kaifeng 475004, China)Abstract: With the development of wireless technology, the reliability of wireless technology is more and more high, in the medical field, the traditional wired
5、 calling system because of the high cost, complicated structure, difficult installation, maintenance inconvenience and other shortcomings, thus causing financial resources for the hospital, the hospital waste, more inclined to use wireless call system, wireless call system not only has the advantage
6、s of simple structure, low price, and convenient to move, so it has wide application prospect.The design is divided into call machine and receiver, and the receiver are calling the STC89C52 microcontroller as the core, through the microcontroller serial port driver call machine wireless transmitting
7、 module, transmit code signal, coding signal code, code switching, unit code, check code 1, code 2. The wireless receiving module receives the encoded signal, the coding signal is sent to the microcontroller through the serial port receiver, receiver chip first CRC check, judging the received data i
8、s coded signal, if the coded signal is retained, and determine the function code, and code to judge according to the function of voice alarm, if not coded signals are discarded, so to realize the long-distance, patient and medical personnel timely communication. Through the design of hardware and so
9、ftware, this system realizes the design requirements of medical wireless call system, making the physical test, everything is normal, can be more than 300 meters long distance transceiver, stable operation.Key words: Ward call , Wireless communication , STC89C52 1 前言1.1 医用无线呼叫系统的背景及意义随着社会的发展,人们对医疗设施
10、及服务有了更高的要求,人生病时对治疗的服务要求也今非昔比,现代化的医疗设施是医院必不可少的硬件设备,医护人员与患者之间的联系也不应再是传统的方式,因此呼叫系统应运而生,传统有线呼叫系统由于线路复杂,检修困难,施工成本高以及移动不灵活等诸多缺点,随着医院医疗条件的提高,越来越多的医院使用无线呼叫系统,无线呼叫系统不仅施工和维护简便,呼叫操作简单。而且能够快速呼叫医生、护士,从而保证患者的及时治疗,提高医院的治疗水平及管理水平,并具有广泛的应用前景。1.2医用无线呼叫系统概述病人通过呼叫机按键向接收机发射呼叫信号,接收机接到信号后,驱动接收机液晶屏显示病人病房号,接收机语音模块播报“病人呼叫”语音
11、,为了使信号准确无误,病人能知道呼叫已发出,接收机接收到信号之后,返回一个收到信号给呼叫机,呼叫机接收到信号后,驱动呼叫机语音播报模块,播报“呼叫已发出”语音,医生听到呼叫之后,查看液晶屏显示的病人病床号,火速赶往相应病房,并通过接收机按键发射应答信号,呼叫机接收到信号之后,驱动呼叫机语音播报模块,播报“医生正火速赶来”语音。这样,实现了呼叫系统的整个流程。本文以STC59C52单片机为控制芯片,通过对单片机进行编程,利用单片机串口驱动无线串口模块收发数据,无线串口模块是半双工无线传输模块,可以工作在433MHz公用频段,用于各种串口之间的无线通信,如电脑14、单片机、各种机器设备串口等,可以
12、直接在原来的有线连接上升级为无线链接,无需额外编程,完全兼容有线通讯串口协议10,使用简单方便灵活它有300米的传输距离,工作频率在433435MHz之间(默认433.92MHZ),并且可设置ID,显示部分使用LCD1602液晶屏,LCD1602具有显示字符大,背光可调,清晰大方的特点。报警部分采用语音播报模块,语音播报模块能够播报事先存储好的语音。电源部分采用开关电源,开断电源是现在比较流行的电源转换电路,它具有体积小,价格低廉,输入范围广,输出稳定性强的特点,因此在仪器仪表、自动化系统里有广泛的应用。另外,在设计过程中,采用多种调试技巧,并创新性的利用接收回馈的方法,将接收到的指令回馈给发
13、射机,病人通过判断是否有反馈,从而判断通信是否成功。2 系统方案的论证医用无线呼叫系统的设计方案有很多,可供选择的器件种类也很多,在满足各项功能的前提下,我们优先选择简单便捷,易于实现的设计方案,在硬件的选择上我们选择稳定性强,价格合理,低功耗的产品。2.1 单片机的选择本设计采用STC89C52RC芯片21作为硬件核-心,STC89C52是一种低电压,高性能CMOS 8位单片机1,片内含8k bytes的可反复擦写的Flash只读程序存储器和256 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央
14、处理器和Flash存储单元,功能强大的STC89C52单片机可为您提供许多较复杂系统控制应用场合。2.2 通信方案选择方案一:利用485模块6可以实现呼叫机和接收机的通信,数据不易丢失,稳定性强,但是医院病房较多,所需的信号线也较多,线路复杂,因此成本较高。方案二:利用蓝牙模块使系统摆脱众多信号线的困扰,且价格便宜,呼叫机和接收机只需要一对蓝牙模块即可,但蓝牙模块又有自身的局限性,蓝牙模块只能在15米以内相互识别,距离超过15米,无发传送数据指令,使医用呼叫系统覆盖面积太小。另外蓝牙穿墙能力差。方案三:利用无线串口模块20,使医用呼叫系统不需要信号线,其穿墙能力强,覆盖面积可以达到300m以内
15、,足以覆盖整个住院部,达到良好的通信效果,但是无线模块反应迟钝,不够稳定。综上所述,综合考虑各方面优缺点之后,我们选择无线模块。2.3 显示模块方案选择方案一:采用点阵式led显示,点阵式led是由八行八列的发光二极管7组成,对于显示文字比较适合,如采用在显示数字显得太浪费,且价格也相对较高,所以也不用此种作为显示。方案二:采用7段数码管动态扫描,7段数码管5价格虽适中,对于显示数字也最合适。但是,需要采用动态扫描法与单片机连接,占用的单片机口线多,同时占用单片机内部资源。如果采用串转并芯片,可以减少IO口的使用,但会让设计复杂,同时增加成本。方案三:采用LCD液晶显示屏,液晶显示屏的显示功能
16、强大,可显示大量字符和图形,背光可调,清晰大方。对于显示数据而言,一个1602的液晶屏即可,价格也能接受。缺点是需要的接口线较多。综合以上,此设计中采用LCD1602液晶显示屏作为显示模块。2.4 报警模块方案选择方案一:蜂鸣器报警21是一种简便可靠的报警方式,其电路简单,运行稳定,缺点是不能发出人们易于辨别的语音,不能播报病房号及病床号。方案二:语音播报模块语音播报模块3能够播报人们易于识别的语音,并且能够播报病房号及病床号,缺点是结构复杂,成本本较高。综合考虑我们选择蜂鸣器报警,蜂鸣器报警不但电路简单,运行稳定,而且成本低。3 系统硬件设计3.1 硬件总体设计框图本系统设计了分为接收机硬件
17、和呼叫机硬件,接收机有复位电路、按键电路,通信电路、显示电路、和报警电路。利用按键电路,触发单片机串口,再通过通信电路发射信号,通过单片机驱动显示电路,显示电路可以显示病房号,通过单片机驱动报警电路,报警电路进行相应报警。呼叫机跟接收机相比少了显示电路,其他电路跟接收机相似,这里不再重复,接收机硬件如图3-1所示,呼叫机硬件如图3-2所示。STC89C52复位液晶显示报警发射/接收按键图3-1接收机硬件STC89C52复位报警发射/接收按键图3-2呼叫机硬件3.2 电源电路的设计因为系统电压为5V,在电源电路的设计中我们采用两种方案,开关电源和电池。开关电源是现在比较常用的一种稳压电源2,它具
18、有体积小,成本低,输出范围广,技术成熟等优点,可升压可降压。5V电池具有方便携带的特点,因此在移动设备领域有广泛的应用。在呼叫机上,我们运用5V电池,因为利用5V电池之后,病人便可以将呼叫机随身带在身上,病人的呼叫范围不仅仅限于病房,病人在离接收机300米的范围内的任何地方都可以呼叫医务人员,极大的提高了呼叫系统地适用范围。 在接收机上,我们运用开关电源,因为接收机是运用在护士站等固定场所,开关电源具有电能转换效率高,持续稳定等优点。由UC3842构成开关电源电路19,220V市电由C1、L1滤除电磁干扰,负温度系数的热敏电阻Rt1限流,再经VC整流、C2滤波,电阻R1、电位器RP1降压后加到
19、UC3842的供电端(脚),为UC3842提供启动电压,电路启动后变压器的付绕组的整流滤波电压一方面为UC3842提供正常工作电压,另一方面经R3、R4分压加到误差放大器的反相输入端脚,为UC3842提供负反馈电压,其规律是此脚电压越高驱动脉冲的占空比越小,以此稳定输出电压。脚和脚外接的R6、C8决定了振荡频率,其振荡频率的最大值可达500KHz。R5、C6用于改善增益和频率特性。脚输出的方波信号经R7、R8分压后驱动MOSFEF功率管,变压器原边绕组的能量传递到付边各绕组,经整流滤波后输出各数值不同的直流电压供负载使用。电阻R10用于电流检测,经R9、C9滤滤后送入UC3842的脚形成电流反
20、馈环.所以由UC3842构成的电源是双闭环控制系统,电压稳定度非常高,当UC3842的脚电压高于1V时振荡器停振,保护功率管不至于过流而损坏。开关电源的电路设计图如图3-3所示。图3-3开关电源电路3.3 单片机STC89C52最小系统硬件设计本系统采用的是STC公司生产的STC89C52RC单片机 STC89C52RC单片机有40个引脚。P3口是一组带有内部上拉电阻的8位双向I/O,P3的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对P3口来说,他的更重要的用途是它的第二功能。本设计中的51单片机最小系统,由主芯片、复位电路、晶振电路组成。51单片机的供电是+5V的,因此不能超过
21、此电压,否则单片机有可能会被烧毁。在本设计中,复位电路由一个按键和电阻电容组成。51单片机的复位是高电平复位的,也就是说给复位脚(第9脚)高电平,则单片机会产生复位动作。正常工作时,9脚应该是低电平的。在本设计中,晶振采用12M晶振18,这样的话,单周期指令的执行时间只用1us,速度相当快了。在本设计中,利用P0口利用10K的上拉排阻接液晶屏,P2.7引脚、P2.6引脚、P2.5引脚是液晶屏的三个控制端. P2.7引脚接按键,也就是接呼叫按钮,P3.0和P3.1用他们的第二功能,也就是串口引脚,分别接蓝牙的TXD和RXD引脚。单片机最小系统电路图如图3-4所示。图3-4单片机最小系统电路3.4
22、显示模块的设计在显示界面的设计中,我们选择液晶屏1602,他有以下几个优点:1、显示质量高,由于液晶显示器每一个点在收到信号后就一直保持那种色彩和亮度,恒定发光,而不像阴极射线管显示器(CRT)那样需要不断刷新新亮点。因此,液晶显示器画质高且不会闪烁。2、数字式接口,液晶显示器都是数字式的,和数字系统的接口更加简单可靠,操作更加方便。3、体积小、重量轻,液晶显示器通过显示屏上的电极控制液晶分子状态来达到显示的目的,在重量上比相等显示面积的传统显示器要轻得多。4、功耗低,相对而言,液晶显示器的功耗主要消耗在其内部的电极和驱动IC上,因而耗电量比其它显示器要少得多。在液晶屏硬件设计中,从D0到D7
23、需要八位的数据引脚,所以我们选择单片机P0端口作为数据端口,给液晶模块提供数据,RS我们接P2.7,用于控制数据/命令选择,RW我们接P2.6,用于控制读写操作,EN我们接P2.5,用于使能,液晶屏引脚3,我们接一个电位器,这样可以控制液晶屏亮暗,液晶屏1、2脚分别是为了给液晶屏供电源地和电源VCC,15、16脚分别是背光源正极和背光源负极。其原理图如图3-5所示。 图3-5 LCD1602电路3.5报警硬件设计报警电路主要运用三极管S8550,当三极管工作在饱和区的时候,可以当开关管用,给基极一个适当电压,则“开关”就打开,蜂鸣器报警,当基极电压为零的时候,“开关”闭合,蜂鸣器停止,通过P2
24、.0管脚和单片机相连。其电路图如图3-6所示。 图3-6 报警电路3.6无线模块硬件设计无线模块是我们在网上购买的XL02-232AP1模块11,他是UART接口半双工无线传输模块,可以工作在433MHz公用频段,用于各种串口之间的无线通信,如电脑14、单片机、各种机器设备串口等,可以直接在原来的有线连接上升级为无线链接,无需额外编程,完全兼容有线通讯串口协议10,使用简单方便灵活它有300米的传输距离,工作频率在433435MHz之间(默认433.92MHZ),并且可设置ID,其范围为065535(默认ID:12345),另外,其串口速率为1.2K-38.4KBPS之间. (默认9.6KBP
25、S),数据格式为常用的8N1。4 软件设计4.1 软件调试方法设计为了有好又快的完成程序设计,使程序运行的各个状态更加清晰可见,我们对调试方法进行了设计,在调试期间,我们运用了一下几个调试技巧。首先我们利用51单片机开发板作为我们下载和调试程序的硬件工具,因为开发板硬件电路稳定,参考程序多样,更重要的是开发板省去了我们呼叫系统中下载模块的电路设计,我们只需要利用开发板把程序下载到单片机里面,然后从开发板上取下已经被烧写过程序的单片机,并安装到呼叫系统就可以了。其次我们先不用无线模块通信,我们利用串口线代替,因为串口线对于我们来说比较熟悉,并且51开发板上本身就带有串口接口,以及串口线,另外利用
26、串口线代替无线模块调试程序,调试成功之后,将串口线换成无线模块便可,不需要更改任何程序,这极大的方便了我们调试程序。再次我们不直接使呼叫机和接收机通信,因为这样的话,如果程序出现问题,我们很难判断出是接收机的问题还是呼叫机的问题,我们先利用串口线将呼叫机和PC连接,然后利用PC上的串口调试助手跟呼叫机通信,这时我们可以将PC串口调试助手当做接收机,通过串口调试助手,查看呼叫机发射的数据状态,这使我们对程序的运行状态有一个清晰的了解。方便查找程序出错原因。调试期间我们还利用两位的数码管来显示任何我们想要的数据,并且利用LED作为调试过程中的一些状态指示,当程序运行不正确时,这些状态指示为我们排除
27、一部分错误所在处提供了依据。4.2 通信协议设计在通信协议的设计中,我们设置包头码12为0xaa,其为固定值,主要有识别一帧数据的起始字节的作用,方便在串口调试助手中查看。开关码主要是有开关的作用,当开关码为0x01,就表明打开语音播报,当开关码为0x02,就表明关闭语音播报。病房码就是接收机接收到的病房号,其是16进制的,因此需要转换为10进制,当接收机接收到该病房号之后,就会在液晶屏上显示出病房号。校验码1和校验码217就是一帧数据中前面三个字节CRC16校验的结果,CRC16校验是一种比较稳定的校验方法,通过它可以保证接收到的数据是可靠的。CRC即循环冗余校验码10(Cyclic Red
28、undancy Check)它是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。其协议规则如表4.1所示。表4.1通信协议表包头码开关码病房码校验码1校验码20xaa0x01/0x02接收到的病房号CRC16校验码1CRC16校验码24.3 呼叫机程序流程图呼叫机程序流程图如图4-1 所示,首先先对程序硬件初始化,然后通过条件句判断按键是否按下,如果按键按下,就发送报警命令,另外判断是否接收到命令,如果接收
29、到命令,则判断命令码数据,从而播报不同的语音。 图4-1 呼叫机程序流程图4.4 呼叫机程序设计(1)主程序main():void main()TMOD=0x21;/定时器模式设置 定时器1 工作在8位自动重装,溢出时TH值自动重装TH1=0xfa; /定时器高8位 fd 19200 fa 9600 f4 4800 e8 2400 d0 1200TL1=0xfa; /定时器低8位TR1=1; /定时器1计数控制位 1为允许计数SM0=0;SM1=1; /串口工作方式设置 方式1 8位UART波特率可变 (2 SMOD/32) X 定时器1的溢出率REN=1; /允许串口接收控制位EA=1; /
30、开总中断开关ES=1; / 串口中断允许PCON=0x80; /SMOD=1 波特率加倍 SMOD0=0SCON 中的SM0/FE位用于SM0Time0_Init();tx_buf0=0xaa;tx_buf1=0x01;tx_buf2=0xBE;tx_buf3=0xD0;while(1)/rx_buf0=a;/ge=rx_buf1%10;/shi=rx_buf1/10;jsfanhui();ajfasong();pdbaojing(); 在主程序里,我们先初始化了Time0,Time1,串口,以及所要发送的数据命令。a. Time0,设置为模式1,16位定时器模式,初始化了TH0和TL0,设置
31、定时时间为1ms,并打开了定时器1和定时器1中断。b. Time1,设置为模式2,8位自动重装载,初始化TH1和TL1,设定了波特率,波特率为9600,同时打开了定时器1。c. 串口,设置为方式1,起始位、停止位、8位数据,同时设置串口接收控制位为允许,并打开了串口中断和总中断。 在主循环里有用于接受并返回数据的jsfanhui()子函数,用于按键发送数据的ajfasong()子函数,用于判断报警的pdbaojing()子函数。(2)接受并返回数据子函数ajfasong()void ajfasong()if(key1=0&flag3=0)Delay(10);if(key1=0) flag2=1
32、;if(flag2=1)flag2=0;flag3=1;for(z=0;z6;z+)ES=0; /关串口中断如在串口发送数据时同时有数据接收 会触发中断,使程序跑飞 因此先关闭串口中断 等数据发送完后再开启for(j=0;j4;j+)SBUF=tx_bufj;/将接收到的8位数据通过串口发送出去while(!TI); /等待TI=1即数据发送完后TI=0; /TIES=1;此函数通过按键触发发送,按键2按下前,Key1为高电平,按键按下后,Key1变为低电平,程序通过检测Key1电平的变化来确定按键是否按下,利用延时函数消除按键抖动,很好的弥补了硬件上抖动的干扰。在程序if(key1=0&fl
33、ag3=0)中,flag3等于0,当执行条件里的语句之后,flag3变为1,这是为了在按键按下之后,条件里面的程序只执行一次,如果条件里没有把flag3置1,那么当按键持续按下,则if(key1=0&flag3=0)一直满足条件,程序将循环执行,而这些循环是毫无意义的,所以需要将flag3置1,但是将flag3置1之后,下一次我们按呼叫按键的时候,将无法启动呼叫,因为flag3等于1,if条件不满足,因此我们应该在合适的时候将flag3置零,那么我们应该在什么时候置零呢?应该是在按键被持续按下之外的任意时刻都可以,因此我们选择当呼叫机接收到关闭报警命令时,我们置flag3为零,这样就解决了fl
34、ag3将呼叫按键锁定的问题。以上为方法之一,同时我们也可以这样做。if(key1=0)Delay(10);if(key1=0) while(!key1); flag2=1;利用while(!key1);这条语句,可以实现当按键按下不松开时程序持续等待,直到松开为止,这样也可以解决以上问题,但是按键在按下的几毫秒内程序是等待的,这浪费了单片机的资源,但总体来说都是可以的,因为其影响不大。在正常情况下,按键按下后,条件里面的语句循环6次发送数组21tx_bufj里面的4个数据,tx_buf0=0xaa, tx_buf1=0x01,tx_buf2=0xbe,tx_buf3=0xd0,其中tx_buf
35、0为包头,tx_buf1为开关码,tx_buf2和tx_buf3为别为16位CRC校验校验码的高八位和低八位。(3)接收返回子函数jsfanhui()及定时器0中断服务函数void jsfanhui()if(flag=1)crc1=0xffff;for(i=0;i4;i+)crc1=CRC_16(crc1, rx_bufi);if(!crc1&(rx_buf0=0xaa)&(flag=1)&rx_buf1=0x02)timejishi=1;time1out=1000;flagfa=1;flag=0;flag1=rx_buf1;if(!crc1&(rx_buf0=0xaa)&(flag=1)&r
36、x_buf1=0x01)flag=0; flag3=0;flag1=rx_buf1;if(flagfa=1&time1flag=1&rx_buf1=0x02)timejishi=0;flagfa=0;time1flag=0; for(z=0;z6;z+)ES=0; /关串口中断如在串口发送数据时同时有数据接收 会触发中断,使程序跑飞 因此先关闭串口中断 等数据发送完后再开启for(j=0;j4;j+)SBUF=rx_bufj;/将接收到的8位数据通过串口发送出去while(!TI); /等待TI=1即数据发送完后TI=0; /TIES=1; /开串口中断定时器0函数:.void Time0_I
37、nt() interrupt 1TH0 = (65535-1000)/256;TL0 = (65535-1000)%256; if(TimeOut != 0) TimeOut -; /通信超时值 else Timeflag=1; if(timejishi=1) if(time1out != 0) time1out -; /通信超时值 else time1flag=1; 在jsfanhui()接收返回子函数里,flag为接收到4个数据标志位,其为1,表明接收到4个数据,接收到数据后,利用CRC_16(crc1, rx_bufi)校验函数,校验数据,校验接收到的4个数据,如果校验结果为零,说明接收
38、数据正确。在接收数据正确之后,我们判断命令字rx_buf1,如果其为0x01,则说明此命令为接收机接收的打开蜂鸣器命令之后返回给呼叫机的命令,我们将蜂鸣器开关标志位flag1赋值rx_buf1(其值为0x01),蜂鸣器将打开,同时我们置flag3为零,上文已经介绍过,这里不再重复,此时我们将呼叫机按键解锁。如果其为0x02则为接收机发出的关闭蜂鸣器命令,我们将蜂鸣器开关标志位flag1赋值rx_buf1(其值为0x02),蜂鸣器将关闭。关闭蜂鸣器之后,我们需要关闭接收机自己的蜂鸣器,因此呼叫机需要返回接收到的数据,但是在调试的过程中,当我们使用串口线时,数据会很好的被返回,PC串口调试助手4能
39、够完美的接收我们预想的数据,但是当我们换成无线模块的时候,无线模块很难被驱动,即便被驱动,PC串口调试助手接收到的也是乱码,经过多次调试,我们发现,无线模块具有当发送数据后不能立即快速启动接收数据的缺点,也就是说其灵敏度不够,基于这样的特点,我们决定呼叫机接收到关闭蜂鸣器命令之后,不立即返回数据,而是先延时一秒,待延时结束后,再返回关闭蜂鸣器命令,这样极大地提高了系统的稳定性,另外为了更加稳定,我们决定返回时循环发射6次。结合定时器T0,我们看到,当要返回关闭蜂鸣器命令时,先将timejishi置1,启动定时一秒,time1out赋值1000,因为定时器T0为定时1ms,所以time1out为
40、1000时,刚好其为1秒,定时一秒结束后,我们将发送标志位flagfa置1,开始循环6次发送,并将必要的标志位清零。 此函数调试心得:刚开始调试串口时,我们利用串口线发送,数据可以顺利接收,但是换成串口无线模块儿之后,数据接收后无法立刻返回,即便返回出去,也经常出现乱码,这时,我们不断的尝试,找到一些现象的蛛丝马迹,利用输出数据、判断标志位状态等调试技巧,最终经过多次试验,我们终于找到了问题的根源,并通过合理的方法,得到了理想的效果。(4)报警子函数pdbaojing()void pdbaojing()if(flag1=0x01) P1=0xfe; fengming=0; if(flag1=0
41、x02) P1=0xef; fengming=1; 在报警函数里,flag1为判断报警标志位,当flag1为报警命令字0x01时,蜂鸣器报警,当flag1为报警命令字0x02时,蜂鸣器关闭。(5)串口中断服务函数void serial() interrupt 4 /串口中断服务程序,注意:中断号为4if ( RI ) if(Timeflag=1) m =0;RI = 0;rx_bufm+=SBUF; /RX1BUFm+=SBUF; else RI = 0; rx_bufm+=SBUF; if(m=4)m=0;flag=1; /标志位置1TimeOut=300;/超时值Timeflag=0;定时
42、器0函数定时时间为1ms,在接收数据时,有可能出现接收过程中,突然停止现象,这会造成下次接收时数据错位,如果数据连续错位,程序将得不到正确的数据,系统将无法正常运行,为了避免这种情况的发生,我们利用定时器0,规定每接收一个数据字8,用时不得超过300毫秒,如果接收的某个数据字用时超过300毫秒,我们自动认为这个数据字是4个数据字里面的第一个数据字,从而很好的解决了以上问题。 Timeflag为超时标志位,当其为1,则表明接收超时,下一次接收时,接收到的第一个数据将对应于数组里的第一个元素,TimeOut为300,是为了规定每次定时300毫秒。4.5 接收机程序流程图接收机程序中,大部分和发送机
43、程序相似,接收机只添加液晶显示,当不同的房间发射不同的命令时,液晶屏上显示不同的病房号,其程序流程图如4-2所示。 图4-2 接收机程序流程图4.6 接收机程序设计接收机程序中,大部分和发送机程序相似,接收机只添加液晶显示,用于显示患者病房号,下面简单介绍液晶屏程序 :液晶屏1602驱动程序子函数5:LCM_WriteData(uchar WDLCM);LCM_WriteCommand(uchar WCLCM,BuysC);LCM_ReadData(void);LCM_ReadStatus(void);在主函数里我们先利用LCM_Init(void)初始化1602,1602LCD的一般初始化(复位)过程有,指令38H:显示模式设置写指令,01H:显示清屏写指令,06H:显示光标移动设置写指令,0CH:显示开及光标设置,从而设置液晶屏的显示模式、光标等等,利用DisplayOneChar(uchar X, uchar Y, uchar DData)子函数显