基于单片机病房呼叫器(亲测可用)课设_第1页
基于单片机病房呼叫器(亲测可用)课设_第2页
基于单片机病房呼叫器(亲测可用)课设_第3页
基于单片机病房呼叫器(亲测可用)课设_第4页
基于单片机病房呼叫器(亲测可用)课设_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、电子信息工程专业课程设计任务书题目:单片机病房呼叫系统设计设计内容设计一个单片机病房呼叫系统,可容64张床位的病房呼叫,每当患者需要呼叫护士时,按下按钮,此时护士值班室内的呼叫系统板上显示该患者的床位号,并振铃3秒。当护士按下“响应”键时,结束当前呼叫。设计步骤总体方案设计基于单片机的病房呼叫系统设计,附有复位电路,时钟电路,键盘电路等。复位电路是单片机的初始化操作,为摆脱困境,通过复位电路可以重新开始。时钟电路采用12MHz的晶振,作为系统的时钟源,具有较高的准确性。二、硬件选型工作:对所使用的电路元件应选择型号。三、硬件的设计和实现1. 选择所用的51单片机;2. 设计单片机最小系统,在此

2、基础上进行扩展;3. 设计支持系统工作的外围电路;四、软件设计 编写系统初始化和主程序模块; 画出电路流程图; 编写子程序; 显示程序。五、编写课程设计说明书,绘制完整的系统电路图(A3幅面)。课程设计说明书要求1. 课程设计说明书应书写在学院统一印制的课程设计(论文)说明书上,书写应认真,字迹工整,论文格式参考国家正式出版的书籍和论文编排。2. 论理正确、逻辑性强、文理通顾、层次分明、表达确切,并提出自己的见解和观点。3. 打印不少于12页(除附图外)。4. 每组单独一个题目,每组上限5人。时间安排课程设计计划时间4周。课程设计题目于17周下发。课程设计完成后于20周三中午下班前送交电子信息

3、办公室(实验楼三楼),届时指导教师安排短暂答辩。辅导时间和地点1720周每周2、周3和周4。目录TOC o 1-3 h u HYPERLINK l _Toc27806 一、设计要求 PAGEREF _Toc27806 3 HYPERLINK l _Toc21503 二、设计目的 PAGEREF _Toc21503 4 HYPERLINK l _Toc11642 三、设计的具体实现 PAGEREF _Toc11642 5 HYPERLINK l _Toc31844 3.1系统概述 PAGEREF _Toc31844 5 HYPERLINK l _Toc7944 3.2单元电路设计 PAGEREF

4、 _Toc7944 6 HYPERLINK l _Toc25762 3.2.1 单片机的引脚介绍 PAGEREF _Toc25762 6 HYPERLINK l _Toc14386 3.2.2 单片机复位电路介绍 PAGEREF _Toc14386 7 HYPERLINK l _Toc2460 3.2.3 时钟电路的介绍 PAGEREF _Toc2460 8 HYPERLINK l _Toc17791 3.2.4 详细设计 PAGEREF _Toc17791 10 HYPERLINK l _Toc1058 3.3软件程序设计 PAGEREF _Toc1058 12 HYPERLINK l _T

5、oc10561 3.3.1 系统软件的设计 PAGEREF _Toc10561 12 HYPERLINK l _Toc12028 3.3.2 主程序流程图 PAGEREF _Toc12028 13 HYPERLINK l _Toc13814 3.3.3子程序流程图 PAGEREF _Toc13814 13 HYPERLINK l _Toc12855 3.3.4 源程序代码 PAGEREF _Toc12855 16 HYPERLINK l _Toc15571 四、结论与展望 PAGEREF _Toc15571 21 HYPERLINK l _Toc17936 五、心得体会及建议 PAGEREF

6、_Toc17936 22 HYPERLINK l _Toc31132 六、附录 PAGEREF _Toc31132 24 HYPERLINK l _Toc20966 七、参考文献 PAGEREF _Toc20966 26单片机病房呼叫系统设计报告一、设计要求1、设计一个可容64张床位的病房呼叫系统。2、要求每个床位都有一个按钮,当患者需要呼叫护士时,按下按钮。此时护士值班室内的呼叫系统板上显示该患者的床位号,并振铃3秒。3、当护士按下“响应”键时,取消当前呼叫。二、设计目的在大型机关,旅馆和医院中,常需要有一种内部联络和呼叫系统,以便在旅客(病员)和服务人员之间建立必要的联络,而一般的内部通话

7、系统都比较少,经常使用的是比较便宜的呼叫指示,这种呼叫指示系统在提示的同时,能够用数码管显示各呼叫的号码。病房呼叫系统是病人请求值班医生或护士进行诊断或护理的紧急呼叫工具,它主要用于协助医院病员在病床上方便地呼叫医务人员,可将病人的请求快速传送给值班医生或护士,是提高医院和病房护理水平的必备设备之一。医院的竞争越来越激烈,商业医院的生存是第一位的,提升档次和服务质量迫在眉睫,陪护问题一直是医患矛盾的主体,也是长期困扰卫生系统服务质量的大问题,使用病房呼叫系统,方便病人更快找到医生,以节约病人的宝贵时间。因此该系统具有很大的应用前景和广阔的市场发展空间。本设计是以AT89C51为核心的病人呼叫系

8、统,对该系统的硬件和软件结构进行了相应的描述。此系统主要由89C51单片机,按键,数码管,喇叭等组成。每个病人要呼叫可以按键,同时会有喇叭响,数码管显示不同床位号,相应的指示灯亮通过对病区的数据采集,实现医院医疗人员值班室和病人房之间的通信呼叫联系,具有使用方便、操作简单等特点。三、设计的具体实现3.1系统概述在本系统中,我采用单片机AT89C51为核心的系统主要包括2个部分:数据采集和数据的输出,数据的输出用来进行呼叫,编码使用单片机完成,数据采集负责接收分机发来的信号,并显示该患者的床位号,并响铃,主机上设有键盘可以取消当前呼叫。其实现结构框图如图3.1所示。图3.1 系统总体方案图由88

9、键盘矩阵采集到的键值经过P1、P2口输入到单片机AT89C51中,然后通过P0口把相关信息传送到数码管显示。同时报警警示灯闪烁、报警声响起。医疗人员可以通过控制键盘操作,完成呼叫响应和信息查询等监护工作。3.2单元电路设计3.2.1 单片机的引脚介绍AT89C51可以说是最常用的51单片机了,下图介绍AT89C51的引脚图资料。如图3.2所示。图3.2 AT89C51引脚图(1) RESET一般接2个元件:接10K电阻到地,接10电容到电源。(2) / VPP一般情况下接高电平(这时使用MCU内部RAM/ROM)。(3)ALE / PROG一般情况下空着(这时使用MCU内部RAM/ROM)。(

10、4)一般情况下空着(当使用MCU内部RAM/ROM时)。(5)P0内部没有上拉电阻,所以必要时需要在每个引脚外接5.1K左右上拉电阻到电源。(6) XTAL1是片内振荡器的反相放大器输入端,XTAL2则是输出端,使用外部振荡器时,外部振荡信号应直接加到XTAL1,而XTAL2悬空。内部方式时,时钟发生器对振荡脉冲二分频,如晶振为12MHz,时钟频率就为6MHz,晶振的频率可以在1MHz-24MHz内选择,电容取20PF左右。(7) VDD:电源+5V。 VSS:GND接地。引脚功能说明:电源引脚 Vcc(40脚):典型值5V。 Vss(20脚):接低电平。输入输出口引脚: P0口:I/O双向口

11、。作输入口时,应先软件置“ 1”。 P1口:I/O双向口。作输入口时,应先软件置“ 1”。 P2口:I/O双向口。作输入口时,应先软件置“ 1”。 P3口:I/O双向口。作输入口时,应先软件置“ 1”。控制引脚: RST/Vpd、ALE/、/Vpp组成了MSC-51的控制总线。 RST/Vpd(9脚):复位信号输入端(高电平有效)。 第二功能:加+5V备用电源,可以实现掉电保护RAM信息不丢失。 ALE/ (30脚):地址锁存信号输出端。 第二功能:编程脉冲输入。 (29脚):外部程序存储器读选通信号。 /Vpp(31脚):外部程序存储器使能端。3.2.2 单片机复位电路介绍当MCS-51系列

12、单片机的复位引脚RST出现两个机器周期以上的高电平时,单片机就执行复位操作。如果RST持续为高电平,单片机就处于循环复位状态。根据应用的要求,复位操作通常有两种基本的方式:上电复位和上电或开关复位。上电复位要求接通电源后,自动实现复位操作。常用的上电复位如下图3中所示。图中电容C1和电阻对电源+5V来说构成微分电路。上电后,保持RST一段高电平时间,由于单片机内的等效电阻的作用,不用图中电阻,也能达到上电复位的操作功能。如下图3.3和3.4中所示。图 3.3 上电复位电路 图 3.4 上电复位和按钮复位电路3.2.3 时钟电路的介绍采用时钟方式时,在XTAL1和XTAL2之间接入石英晶体振荡器

13、(晶振)即可使内部振荡器起振,产生单片机工作所需的时钟脉冲。如图3.5所示。时钟是时序的基础,8951核片内由一个反相放大器构成振荡器,可以由它产生时钟,时钟可以由两种方式产生内部方式和外部方式。本系统采用内部方式,在XTAL1和XTAL2端外接石英晶体作为定时元件,内部反相放大器自激振荡,产生时钟。时钟发生器对振荡脉冲二分频。电容采用22nF MCS-51单片机时钟脉冲也可以由外部产生,但芯片的制造工艺不同,外部时钟源的输入方式有所不同。对于HMOS型芯片,外部振荡信号接至XIAL2引脚,XTAL1接地,XTAL2引脚对电源接入上拉电阻。而CHMOS型芯片,外部振荡信号接至XTAL1,XTA

14、L2悬空。图3.5 时钟电路 3.2.4 详细设计(1) 数码管显示模块本系统采用了较为简单的由单片机直接驱动数码管的显示电路,由于51单片机P0口内部是漏极开路型(作I/O口用时),P0口内部没有设置上拉电阻,不接上拉电阻的话输出会不正常,比如输出高电平时得不到高电平。电路如图3.6。 图3.6 单片机与数码管接口图(2)报警电路设计主机在接受到呼叫后,进行报警告知值班人员。报警分为两个部分,第一个部分是当有病床进行呼叫后值班台警示灯闪烁三次后保持常亮,显示为当前有病床呼叫;第二个部分是响铃三秒后自动停止,当值班人员听到响铃会知道当前有病床呼叫,观察显示面板可知是几号病床呼叫,从而进行快速处

15、理。报警电路用单片机如图3.7所示。图3.7 报警电路设计图(3) 键盘模块电路设计88键盘矩阵和64个LED警示灯模块组成,在键盘扫描和LED驱动部分,使用了LED显示电路原理图如图3.8所示。图3.8 键盘模块电路图(4) 键盘的工作方式介绍键盘的工作方式应该根据实际应用系统中CPU的工作状况而定,其选取的原则是既要保证CPU能及时响应按键操作,又不要过多占用CPU的工作时间。通常,键盘的工作方式有三种,即编程扫描、定时扫描和中断扫描。编程扫描方式:编程扫描方式是利用CPU完成其他工作的空余时间,调用键盘扫描子程序来检验按键状态,响应键盘输入。执行键功能程序时,CPU不再享有键输入要求,直

16、到CPU重新扫描键盘为止。定时扫描方式:定时扫描方式就是每隔一段时间对键盘扫描一次,她利用单片机内部的定时器产生一定时间(如20ms)的定时,定时时间到产生定时器溢出中断。CPU在中断服务程序中键盘进行扫描,并在有键按下时识别出该键并保存键号,然后在中断服务程序或主程序中执行该键的功能程序。中断扫描方式:本设计采用上述两种键盘扫描方式时,无论是否有键按下,CPU都要定时扫描键盘,而单片机应用系统工作时,并非经常需要键盘输入。因此,CPU经常处于空扫描状态,浪费CPU大量时间,CPU不扫描键盘,而有键按下时,通过相应电路产生中断请求,CPU相应中断,执行键盘扫描子程序,并识别键号。3.3软件程序

17、设计3.3.1 系统软件的设计该系统软件主要完成以AT89C51为核心的数据的采集、处理和有线传输。采用模块化程序设计方法,将系统软件的设计主要分为显示模块,输入模块,输出模块。单片机扫描发射键,如果扫描到有发射键按下,系统便扫描拨码开关的状态以确定地址码,通过P1口和P2口开始地址码传送当服务台接收到呼叫信号后,护士值班室内的呼叫系统板上显示该患者的床位号,并振铃。当护士按下“响应”键时,结束当前呼叫。3.3.2 主程序流程图单片机扫描发射键,如果扫描到有发射键按下,系统便扫描拨码开关的状态以确定地址码,再进行中断初始化,去除键的延时抖动,分辨行、列值,进入死循环,这时病房指示灯点亮,服务台

18、显示出床号并响铃,病房等待服务台的回应,如果没有扫描到信号输入,则单片机始终处于初始状态。如图3.9所示。图3.9 主程序流程图3.3.3子程序流程图子程序如图3.10是一个中断式键盘的流程图,当单片机收到信号后,中断入口开始初始化,去除键的延时抖动。而一般的削抖方式有软件和硬件两种,硬件削抖虽能够解决键抖动问题,但如果应用系统所需按键较多,本系统采用的是软件削抖,当检测出有键闭合时,先执行一个延时子程序产数毫秒的延时,待接通时的前沿抖动消失后再判别是否有键按下,分辨出行、列值。当按键释放时,也要经过数毫秒延时,待后沿抖动消失后再判别是否有键按下。图3.10 子程序流程图中断程序:void k

19、ey(void) 扫描键盘值uchar hang,lie;P1=0 x00;P2=0 xff;delay(1); if(P2!=0 xff)delay(5); 延迟后查询行列值if(P2!=0 xff)switch(P2&0 xff) 扫描列值case 0 xfe:lie=0;break;case 0 xfd:lie=1;break;case 0 xfb:lie=2;break;case 0 xf7:lie=3;break;case 0 xef:lie=4;break;case 0 xdf:lie=5;break;case 0 xbf:lie=6;break;case 0 x7f:lie=7;

20、break;P2=0 x00;P1=0 xff;switch(P1&0 xff) 扫描行值case 0 xfe:hang=0;break;case 0 xfd:hang=1;break;case 0 xfb:hang=2;break;case 0 xf7:hang=3;break;case 0 xef:hang=4;break;case 0 xdf:hang=5;break;case 0 xbf:hang=6;break;case 0 x7f:hang=7;break;P2=0 xff;P1=0 x00;while(P2!=0 xff);bed_NO=keytabhanglie;TR0=1;

21、行列值赋值给bed_NOelsebed_NO=0;void time_init(void) 计数器的初始化TMOD=0 x01;TH0=(65536-8333)/256; 装入初值TL0=(65536-8333)%256;EA=1;ET0=1;void time(void) interrupt 1 using 1 定义中断块3.3.4 源程序代码源程序代码如下:#include#define uchar unsigned char #define uint unsigned intsbit B1=P36;sbit B2=P37;sbit buzzer=P35;sbit clear=P34; s

22、bit FMQ=P31; ucharcodedistab10=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f;uchar code keytab88=1,2,3,4,5,6,7,8, 9,10,11,12,13,14,15,16, 17,18,19,20,21,22,23,24, 25,26,27,28,29,30,31,32, 33,34,35,36,37,38,39,40, 41,42,43,44,45,46,47,48, 49,50,51,52,53,54,55,56, 57,58,59,60,61,62,63,64

23、,; uchar bed_NO;uchar btime;uchar itime; void delay(uint x) uint i,j;for(i=0;ix;i+)for(j=0;j=100)itime=0;btime+;if(btime6)TR0=0;btime=0;buzzer=!buzzer;FMQ=!FMQ;void main(void)FMQ=1;time_init();for(;)key();display();if(TR0=0)buzzer=1;if(clear=0) delay(10);if(clear=0)bed_NO=0;四、结论与展望本设计是以AT89C51为核心的病人

24、呼叫系统,对该系统的硬件和软件结构进行了相应的描述。通过对病区的数据采集,实现医院医疗人员值班室和病人房之间的通信联系,具有使用方便、操作简单等特点。伴随着医疗体制改革的不断深化和医疗事业的飞速发展,越来越多的人们需要迅捷、方便地得到医院的各种各样的医疗服务。这使得衡量一个医院的综合水平高低,不再仅局限于软、硬件的建设上,更要比服务。临床呼叫求助装置是传送临床信息的重要手段,关系病员安危,传统的有线呼叫系统历来受到各大医院的普遍重视。在医院的病房里每个床位边都装有一个呼叫按钮,当病人需要帮助时,按下呼叫按钮,护士办公室里呼叫显示板上相应房间号的指示灯点亮并进行声音提示,同时在值班室里安装一个电

25、子显示牌,使值班护土能及时的知道哪个房间的病人需要帮助或需要进行抢救。五、心得体会及建议本次课程设计结束了,在这次的课程设计中不仅检验了我所学习的知识,也培养了我如何去把握一件事情,如何去做一件事情,又如何完成一件事情。在设计过程中,与同学分工设计,和同学们相互探讨,相互学习,相互监督。学会了合作,学会了运筹帷幄,学会了宽容,学会了理解,也学会了做人与处世。课程设计是我们专业课程知识综合应用的实践训练,着是我们迈向社会,从事职业工作前一个必不少的过程。千里之行始于足下,通过这次毕业设计,我深深体会到这句千古名言的真正含义我今天认真的进行课程设计,学会脚踏实地迈开这一步,就是为明天能稳健地在社会

26、大潮中奔跑打下坚实的基础。通过这次单片机设计,我在多方面都有所提高。通过这次基于单片机的病房呼叫器设计,综合运用本专业所学课程的理论和生产实际知识进行一次单片机设计工作的实际训练从而培养和提高学生独立工作能力,巩固与扩充了单片机课程所学的内容,掌握单片机设计的方法和步骤,掌握单片机设计的基本的技能懂得了怎样分析电路,了解了单片机的基本结构,提高了计算能力,绘图能力,熟悉了规范和标准,同时各科相关的课程都有了全面的复习,独立思考的能力也有了提高。在这次设计过程中,体现出团队设计的团结以及综合运用知识的能力,体会了学以致用、突出自己劳动成果的喜悦心情,从中发现自己平时学习的不足和薄弱环节,从而加以

27、弥补。转眼之间课程设计就要结束了,这几周我过得虽然忙碌但是很充实,因为通过这次设计我学到了很多知识,对单片机也有了更深的认识,并且把以前学的知识又重新梳理了一遍,除此之外我也感觉到了自己知识的匮乏,设计过程中遇到许多困难,比如由于之前对单片机应用知识的不熟悉,程序编写无从下手以及对以前所学知识掌握的不够牢固等等,给了我很大的压力,真正的感觉到是学无止境这句话是什么含义。我一遇到不会的知识或者以前学过但现在却忘记的知识,我就上图书馆,上网去查,或者拿出以前的书再看看,尽力把它弄明白。我们小组在设计时一起讨论,一起研究,在大家的互相帮助下我们提高的很快,解决了很多问题,也通过这次设计我们在彼此身上

28、学到了很多知识,并且在我们即将面临实习的重要时刻,这次设计过程也让我们对我们自己的专业,和学习,工作的方向有了更清晰的认识。让我知道不论做什么工作都要努力,都要不断学习。此次设计为有线呼叫系统,虽存在布线复杂、维修不便、病房不能与值班室的语音对话等缺陷。但相对于无线呼叫系统而言,它的可靠性能高,而且不干扰其他医疗设备。如果采用无线传输,会节约布线和改造线路的资金,为医院节约成本,并且及时、简便可行,比目前的同类产品更能受到医院及病人的认可,有更强的竞争力,能大量推广。六、附录附录一:系统电路图图6.1 病房呼叫系统电路图附录二:元器件明细表表6.2 元件器件表器件参数数量电阻5002电容22p

29、F,20uF22pF2个,20uF1个芯片AT89C511晶振1蜂鸣器1数码管两位1排阻1按键66LEDRED1七、参考文献1孙俊逸,盛秋林单片机原理与应用北京清华大学出版社2006.2何立民 单片机高级教程-应用与设计北京航天航空大学出版社2000.3李朝青单片机原理及接口技术北京航天航空大学出版社1999.附录资料:不需要的可以自行删除 C语言图形模式速成第一节 图形模式的初始化Turbo C 提供了非常丰富的图形函数,所有图形函数的原型均在graphics. h 中,本节主要介绍图形模式的初始化、独立图形程序的建立、基本图形功能、图形窗口以及图形模式下的文本输出等函数。另外,使用图形函数

30、时要确保有显示器图形驱动程序*.BGI,同时将集成开发环境options/Linker中的Graphics lib选为on,只有这样才能保证正确使用图形函数。 不同的显示器适配器有不同的图形分辨率。即是同一显示器适配器,在不同模式下也有不同分辨率。因此,在屏幕作图之前,必须根据显示器适配器种类将显示器设置成为某种图形模式,在未设置图形模式之前,微机系统默认屏幕为文本模式(80列,25行字符模式),此时所有图形函数均不能工作。设置屏幕为图形模式,可用下列图形初始化函数:void far initgraph(int far *gdriver, int far *gmode,char *path);

31、其中gdriver和gmode分别表示图形驱动器和模式,path是指图形驱动程序所在的目录路径。有关图形驱动器、图形模式的符号常数及对应的分辨率见graphics. h。图形驱动程序由Turbo C出版商提供,文件扩展名为.BGI。 根据不同的图形适配器有不同的图形驱动程序。例如对于EGA、 VGA 图形适配器就调用驱动程序EGAVGA.BGI。#include stdio.h#include graphics.hint main()int gdriver, gmode;gdriver=VGA;gmode=VGAHI;initgraph(&gdriver, &gmode, C:TC2.0BGI

32、);bar3d(100, 100, 300, 250, 50, 1); /*画一长方体*/getch();closegraph();return 0;有时编程者并不知道所用的图形显示器适配器种类,或者需要将编写的程序用于不同图形驱动器,Turbo C 提供了一个自动检测显示器硬件的函数,其调用格式为:void far detectgraph(int *gdriver, *gmode);其中gdriver和gmode的意义与上面相同。 自动进行硬件测试后进行图形初始化:#include stdio.h#include graphics.hint main()int gdriver, gmode;

33、detectgraph(&gdriver, &gmode); /*自动测试硬件*/printf(the graphics driver is %d, mode is %dn,gdriver,gmode); /*输出测试结果*/getch();initgraph(&gdriver, &gmode, C:TC2.0BGI);/* 根据测试结果初始化图形*/bar3d(100, 100, 300, 250, 50, 1); /*画一长方体*/getch();closegraph();return 0;上例程序中先对图形显示器自动检测,然后再用图形初始化函数进行初始化设置,但Turbo C提供了一种更

34、简单的方法, 即用gdriver=DETECT 语句后再跟initgraph()函数就行了。采用这种方法后,上例可改为:#include stdio.h#include graphics.hint main()int gdriver=DETECT, gmode;initgraph(&gdriver, &gmode, C:TC2.0BGI);bar3d(50, 50, 150, 30, 50, 1);getch();closegraph();return 0;另外,Turbo C 提供了退出图形状态的函数closegraph(),其调用格式为:void far closegraph(void);

35、第二节 屏幕颜色的设置和清屏函数对于图形模式的屏幕颜色设置,同样分为背景色的设置和前景色的设置。在Turbo C中分别用下面两个函数: 设置背景色: void far setbkcolor(int color);设置作图色: void far setcolor(int color);其中color 为图形方式下颜色的规定数值,对EGA,VGA显示器适配器,有关颜色的符号常数及数值见graphics.h。清除图形屏幕内容但不清除图形背景使用清屏函数,其调用格式如下: voide far cleardevice(void);#include stdio.h#include graphics.hin

36、t main()int gdriver, gmode, i,aa;gdriver=DETECT;initgraph(&gdriver, &gmode, C:TC2.0BGI); /*图形初始化*/setbkcolor(0); /*设置图形背景*/cleardevice();for(i=0; i=15; i+)setcolor(i); /*设置不同作图色*/circle(320, 240, 20+i*10); /*画半径不同的圆*/getch();for(i=0; i=15; i+)setbkcolor(i); /*设置不同背景色*/cleardevice();circle(320, 240,

37、20+i*10);getch();aa=getmaxcolor();printf(maxcolor=%d,aa);getch();closegraph();return 0;另外,TURBO C也提供了几个获得现行颜色设置情况的函数。 int far getbkcolor(void); 返回现行背景颜色值。int far getcolor(void); 返回现行作图颜色值。int far getmaxcolor(void); 返回最高可用的颜色值。第三节 基本画图函数基本图形函数包括画点,线以及其它一些基本图形的函数。本节对这些函数作一全面的介绍。 、画点. 画点函数 void far put

38、pixel(int x, int y, int color); 该函数表示有指定的象元画一个按color 所确定颜色的点。对于颜色color的值可从表3中获得而对x, y是指图形象元的坐标。在图形模式下,是按象元来定义坐标的。对VGA适配器,它的最高分辨率为640 x480,其中640为整个屏幕从左到右所有象元的个数,480为整个屏幕从上到下所有象元的个数。屏幕的左上角坐标为(0,0),右下角坐标为(639, 479),水平方向从左到右为x 轴正向,垂直方向从上到下为y轴正向。TURBO C的图形函数都是相对于图形屏幕坐标,即象元来说的。关于点的另外一个函数是: int far getpixe

39、l(int x, int y); 它获得当前点(x, y)的颜色值。 II、有关坐标位置的函数 int far getmaxx(void);返回x轴的最大值。int far getmaxy(void);返回y轴的最大值。int far getx(void); 返回游标在x轴的位置。void far gety(void); 返回游标有y轴的位置。void far moveto(int x, int y); 移动游标到(x, y)点,不是画点,在移动过程中亦画点。void far moverel(int dx, int dy); 移动游标从现行位置(x, y)移动到(x+dx, y+dy)的位置,

40、移动过程中不画点。、画线I. 画线函数TURBO C提供了一系列画线函数: void far line(int x0, int y0, int x1, int y1); 画一条从点(x0, y0)到(x1, y1)的直线。void far lineto(int x, int y); 画一作从现行游标到点(x, y)的直线。void far linerel(int dx, int dy); 画一条从现行游标(x,y)到按相对增量确定的点(x+dx, y+dy)的直线。void far circle(int x, int y, int radius); 以(x, y)为圆心,radius为半径,画

41、一个圆。void far arc(int x, int y, int stangle, int endangle,int radius); 以(x,y)为圆心,radius为半径,从stangle开始到endangle结束(用度表示)画一段圆弧线。在TURBO C中规定x轴正向为0 度,逆时针方向旋转一周, 依次为90,180, 270和360度(其它有关函数也按此规定,不再重述)。 void ellipse(int x, int y, int stangle, int endangle,int xradius,int yradius);以(x, y)为中心,xradius,yradius为x

42、轴和y轴半径,从角stangle 开始到endangle结束画一段椭圆线,当stangle=0,endangle=360时, 画出一个完整的椭圆。void far rectangle(int x1, int y1, int x2, inty2); 以(x1, y1)为左上角,(x2, y2)为右下角画一个矩形框。 void far drawpoly(int numpoints, int far *polypoints); 画一个顶点数为numpoints,各顶点坐标由polypoints给出的多边形。polypoints整型数组必须至少有2 倍顶点数个无素。每一个顶点的坐标都定义为x,y,并且

43、x在前。值得注意的是当画一个封闭的多边形时,numpoints 的值取实际多边形的顶点数加一,并且数组polypoints中第一个和最后一个点的坐标相同。下面举一个用drawpoly()函数画箭头的例子。#include stdio.h#include graphics.hint main()int gdriver, gmode, i;int arw16=200,102,300,102,300,107,330,100,300,93,300,98,200,98,200,102;gdriver=DETECT;initgraph(&gdriver, &gmode, C:TC2.0BGI);setbk

44、color(BLUE);cleardevice();setcolor(12); /*设置作图颜色*/drawpoly(8, arw); /*画一箭头*/getch();closegraph();return 0;II、设定线型函数在没有对线的特性进行设定之前,TURBO C 用其默认值,即一点宽的实线,但TURBO C 也提供了可以改变线型的函数。线型包括:宽度和形状。其中宽度只有两种选择:一点宽和三点宽。而线的形状则有五种。下面介绍有关线型的设置函数。void far setlinestyle(int linestyle,unsigned upattern,int thickness);该函

45、数用来设置线的有关信息,其中linestyle是线形状的规定,见graphics.h。对于upattern,只有linestyle选USERBIT_LINE 时才有意义 (选其它线型,uppattern取0即可)。此时uppattern的16位二进制数的每一位代表一个象元,如果那位为1,则该象元打开,否则该象元关闭。 void far getlinesettings(struct linesettingstypefar *lineinfo);该函数将有关线的信息存放到由lineinfo 指向的结构中,表中linesettingstype的结构如下:struct linesettingstype

46、int linestyle;unsigned upattern;int thickness;例如下面两句程序可以读出当前线的特性 struct linesettingstype *info;getlinesettings(info);void far setwritemode(int mode);该函数规定画线的方式。如果mode=0,则表示画线时将所画位置的原来信息覆盖了(这是TURBO C的默认方式)。如果mode=1, 则表示画线时用现在特性的线与所画之处原有的线进行异或(XOR)操作,实际上画出的线是原有线与现在规定的线进行异或后的结果。因此,当线的特性不变,进行两次画线操作相当于没有

47、画线。有关线型设定和画线函数的例子如下所示。#include stdio.h#include graphics.hint main()int gdriver, gmode, i;gdriver=DETECT;initgraph(&gdriver, &gmode, C:TC2.0BGI);setbkcolor(BLUE);cleardevice();setcolor(GREEN);circle(320, 240, 98);setlinestyle(0, 0, 3); /*设置三点宽实线*/setcolor(2);rectangle(220, 140, 420, 340);setcolor(WHI

48、TE);setlinestyle(4, 0 xaaaa, 1);/*设置一点宽用户定义线*/line(220, 240, 420, 240);line(320, 140, 320, 340);getch();closegraph();return 0;第四节 基本图形的填充填充就是用规定的颜色和图模填满一个封闭图形。 一般是先画轮廓再填充。TURBO C提供了一些先画出基本图形轮廓, 再按规定图模和颜色填充整个封闭图形的函数。在没有改变填充方式时,TURBO C 以默认方式填充。 void far bar(int x1, int y1, int x2, int y2);确定一个以(x1,y1)

49、为左上角,(x2,y2)为右下角的矩形窗口,再按规定图模和颜色填充。说明:此函数不画出边框,所以填充色为边框。void far bar3d(int x1, int y1, int x2, int y2,int depth,int topflag);当topflag为非0时, 画出一个三维的长方体。当topflag为0时,三维图形不封顶,实际上很少这样使用。说明: bar3d()函数中,长方体第三维的方向不随任何参数而变,即始终为45度的方向。void far pieslice(int x,int y,int stangle,int endangle,int radius);画一个以(x, y)

50、为圆心,radius为半径,stangle为起始角度,endangle 为终止角度的扇形,再按规定方式填充。当stangle=0,endangle=360 时变成一个实心圆,并在圆内从圆点沿X轴正向画一条半径。void far sector(int x, int y,int stanle,intendangle,int xradius, int yradius);画一个以(x, y)为圆心分别以xradius, yradius为x轴和y轴半径,stangle 为起始角,endangle为终止角的椭圆扇形,再按规定方式填充。第五节 设定填充方式TURBO C有四个与填充方式有关的函数。下面分别介

51、绍: void far setfillstyle(int pattern, int color); color的值是当前屏幕图形模式时颜色的有效值。pattern的值及与其等价的符号常数见graphics.h。除USER_FILL(用户定义填充式样)以外,其它填充式样均可由setfillstyle() 函数设置。当选用USER_FILL时,该函数对填充图模和颜色不作任何改变。 之所以定义USER_FILL主要因为在获得有关填充信息时用到此项。void far setfillpattern(char * upattern,int color); 设置用户定义的填充图模的颜色以供对封闭图形填充。其

52、中upattern是一个指向8个字节的指针。这8个字节定义了8x8点阵的图形。每个字节的8位二进制数表示水平8点,8个字节表示8行,然后以此为模型向个封闭区域填充。void far getfillpattern(char * upattern); 该函数将用户定义的填充图模存入upattern指针指向的内存区域。void far getfillsetings(struct fillsettingstypefar * fillinfo); 获得现行图模的颜色并将存入结构指针变量fillinfo中。其中fillsettingstype结构定义如下:struct fillsettingstypein

53、t pattern; /* 现行填充模式 * /int color; /* 现行填充模式 * /; 有关图形填充图模的颜色的选择,请看下面例程。#include stdio.h#include graphics.hmain()char str8=10,20,30,40,50,60,70,80; /*用户定义图模*/int gdriver,gmode,i;struct fillsettingstype save;/*定义一个用来存储填充信息的结构变量*/gdriver=DETECT;initgraph(&gdriver,&gmode,C:TC2.0BGI);setbkcolor(BLUE);cl

54、eardevice();for(i=0;i13;i+)setcolor(i+3);setfillstyle(i,2+i); /* 设置填充类型 */bar(100,150,200,50); /*画矩形并填充*/bar3d(300,100,500,200,70,1); /* 画长方体并填充*/pieslice(200, 300, 90, 180, 90);/*画扇形并填充*/sector(500,300,180,270,200,100);/*画椭圆扇形并填充*/getch();cleardevice();setcolor(14);setfillpattern(str, RED);bar(100,

55、150,200,50);bar3d(300,100,500,200,70,0);pieslice(200,300,0,360,90);sector(500,300,0,360,100,50);getch();getfillsettings(&save);/*获得用户定义的填充模式信息*/closegraph();clrscr();printf(The pattern is %d, The color of filling is %d,save.pattern, save.color);/*输出目前填充图模和颜色值*/getch();第六节 任意封闭图形的填充截止目前为止,我们只能对一些特定形状

56、的封闭图形进行填充,但还不能对任意封闭图形进行填充。为此,TURBO C 提供了一个可对任意封闭图形填充的函数,其调用格式如下: void far floodfill(int x, int y, int border); 其中:x, y为封闭图形内的任意一点,border为边界的颜色,也就是封闭图形轮廓的颜色。调用了该函数后,将用由函数setfillstyle()规定的颜色和模式填满整个封闭图形。注意:a. 如果x或y取在边界上,则不进行填充。b. 如果不是封闭图形则填充会从没有封闭的地方溢出去,填满其它地方。c. 如果x或y在图形外面,则填充封闭图形外的屏幕区域。d. 由border指定的颜

57、色值必须与图形轮廓的颜色值相同, 但填充色可选任意颜色。下例是有关floodfill()函数的用法,该程序填充了bar3d()所画长方体中其它两个未填充的面。#include stdio.h#include graphics.hmain()int gdriver, gmode;struct fillsettingstype save;gdriver=DETECT;initgraph(&gdriver, &gmode, C:TC2.0BGI);setbkcolor(BLUE);cleardevice();setcolor(LIGHTRED);setlinestyle(0,0,3);setfill

58、style(1,14); /*设置填充方式*/bar3d(100,200,400,350,200,1); /*画长方体并填充*/floodfill(450,300,LIGHTRED);/*填充长方体另外两个面*/floodfill(250,150, LIGHTRED);rectangle(450,400,500,450); /*画一矩形*/floodfill(470,420, LIGHTRED); /*填充矩形*/getch();closegraph();第七节屏幕操作函数除了清屏函数以外,关于屏幕操作还有以下函数: void far setactivepage(int pagenum); v

59、oid far setvisualpage(int pagenum);这两个函数只用于EGA,VGA 以及HERCULES图形适配器。setctivepage()函数是为图形输出选择激活页。所谓激活页是指后续图形的输出被写到函数选定的pagenum页面,该页面并不一定可见。setvisualpage()函数才使pagenum所指定的页面变成可见页。页面从0开始(Turbo C默认页)。如果先用setactivepage() 函数在不同页面上画出一幅幅图像,再用setvisualpage() 函数交替显示,就可以实现一些动画的效果。void far getimage(int xl,int yl,

60、 int x2,int y2,void far *mapbuf); void far putimge(int x,int,y,void * mapbuf, int op); unsined far imagesize(int xl,int yl,int x2,int y2);这三个函数用于将屏幕上的图像复制到内存,然后再将内存中的图像送回到屏幕上。首先通过函数imagesize() 测试要保存左上角为(xl,yl),右上角为(x2,y2)的图形屏幕区域内的全部内容需多少个字节,然后再给mapbuf分配一个所测数字节内存空间的指针。通过调用getimage()函数就可将该区域内的图像保存在内存中

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论