《基于单片机的电子换号牌毕业论文.doc》由会员分享,可在线阅读,更多相关《基于单片机的电子换号牌毕业论文.doc(31页珍藏版)》请在三一办公上搜索。
1、毕业设计(论文)报告题 目 基于单片机的 电子换号牌的设计系 别 专 业 班 级 学生姓名 学 号 指导教师 2013年 4 月基于单片机的电子换号牌的设计摘要:随着电子技术发展,电子产品也得到了非常广泛应用,尤其是单片机技术和数码显示产品的应用,给整个人类的生活产生了质的飞跃,以往在体育竞技场的换号牌采用电子显示设计,用电子数码管显示号码,用强的驱动电路来做为驱动显示,主要是采用电子输入数据号码,同时可以利用外部I2C通信技术的存储器进行数据存储,达到多功能换号码牌的一种电子产品,如今已经在很多大型比赛中多次应用,尤其中国成功举办2008年奥运会后,国家对体育事业的投入越来越多,电子产品在体
2、育等领域应用将更加广泛,本报告设计了一个简易的换人显示装置以满足实际换人的需要,通过采用单片机,矩阵式键盘,数码管制作一个具有输入数据,清除数据,手动或自动保存数据,查询保存的数据,自动待机,手动关闭开启数码管显示,状态指示等功能比赛场地用的电子换号牌。 关键词:单片机技术、存储器、数码显示Design of electron transfer number based on MCUAbstract: With the development of electronic technology, electronic products have been widely used, especia
3、lly the computer technology and digital display product application, produced a qualitative leap to the entire human life, in the plate for design using electronic display sports arena, with electronic digital display number, with a strong driving circuit for driving display, mainly using electronic
4、 input data number, memory also can use an external I2C communication technology for data storage, an electronic products to achieve the function to change the number of cards, now in many large-scale competition in several applications, especially Chinas successful hosting of the 2008 Olympic Games
5、, for sports more and more into the country, electronic products in the application of the sports fields will be more widely, the design of a simple change display device to meet the needs of actual substitutions, by using MCU, matrix keyboard, digital tube making clear the data have an input data,
6、save data, either manually or automatically, save a query data, automatic standby, manually open and close digital display, status indication function venues for electronic trade the number card .Key Words: SCM technology、memory、digital display目录第一章 设计的内容及要求21.1 设计的内容21.2 设计的要求2第二章 设计的各部分功能介绍32.1 控制
7、部分介绍32.1.1 AT89C52简介32.1.2 AT89C52的主要性能32.1.3 AT89C52的内部引脚示意图及各引脚功能32.2 显示模块介绍42.2.1 LED数码管介绍42.2.2 驱动IC(TD62783和ULN2003)介绍62.3 矩阵键盘显示的识别方法72.3.1 矩阵键盘的结构和工作原理82.3.2 矩阵键盘的识别方法8第三章 设计的原理和电路93.1 设计的概要93.2 设计的总电路图93.2.1 电源电路设计93.2.2 显示电路设计103.2.3 按键部分设计113.2.3存储电路设计114.1 Proteus功能介绍124.2 仿真电路124.3 操作步骤1
8、34.3 实验结果13致谢15参考文献16附录17前言随着电子技术科技发展和人们生活水平的提高,对日常用品的要求越来越高,电子换号牌的应用做为最普遍的体育用品,功能也越来越多,本文设计的多功能电子换号牌可以引申发展到日常生活的实际应用中,主要应用在运动场的运动员换场和计分等功能。球类比赛用的换人牌是执场裁判在收到换人或比赛延期等等信息时,双手举起的方框型信息显示装置,现在大多采用电子式,一般包括显示和驱动电路(多采用LED等亮度较高的器件)、微处理器、电源和按键等组成部分。换人或比赛延时信息一般需要由执场在裁判席获知后,利用按键人工将信息输入换人牌,确认后在显示器上显示并到球场边展示。由于大多
9、采取手动输入方式,而执场还承担入场队员的安全检查和人员复查工作,所以存在执场工作效率低、承担的任务多、出错的几率高等弊端。第一章 设计的内容及要求1.1 设计的内容本系统由3*4阵列键盘,单片机,驱动电路,数码管四个部分组成。其中单片机控制整个系统的运行,通过不断的对键盘进行扫描,判断是否有按下键,按一下了哪个一个键,从而执行相应的操作。单片机将从键盘输入的有效数据,送往驱动电路,在驱动电路驱动下,数码管显示相应的数据。由于在实际比赛中,需要换人的次数不会很多,而且换人的数据只对本次比赛有用,因而不需要另外扩展存储芯片,也不需要通过E2PROM永久保存数据,只需使用单片机内部的RAM保存换人数
10、据即可。换人的数据,只需在换人那段时间显示即可,不需要永久显示,因而可以通过单片机内部的定时器进行定时,当定时到一定时间,自动关闭数码管显示,用户也通过键盘按下某个键来手动关闭。1.2 设计的要求(1)换号功能:输入两组数据,一组绿色表示换上号码,一组红色表示换下号码。(2)存储功能:需要存储时候可以按下存储KEY确认保存功能,可查看历史数据。(3)亮度调节功能:根据外界光线亮度不同,可以调节不同的亮度来满足显示。(4)节能功能:在不需要显示时候可以进入低功耗功能,节能关闭显示。第二章 设计的各部分功能介绍2.1 控制部分介绍本设计控制部分,采用单片机AT89C51,单片机成本低,功耗小,性价
11、比高,能够简化外围电路并综合实际程序容量和数据存储量2.1.1 AT89C52简介AT89C52是一个低电压,高性能CMOS 8位单片机,片内含8k bytes的可反复擦写的Flash只读程序存储器和256 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,AT89C52单片机在电子行业中有着广泛的应用。AT89C52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2 个读写口线,AT89C52可
12、以按照常规方法进行编程,也可以在线编程。其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的 Flash存储器可有效地降低开发成本。 2.1.2 AT89C52的主要性能1、与MCS-51产品指令和引脚完全兼容 2、8Kbyte字节可重复擦写flash存储器 3、1000次擦写周期 4、全静态操作:0-24MHz时钟频率 5、三级加密程序存储器 6、256x8字节内部RAM 7、32个可编程I/O口 8、3个16们定时器/计数器 9、8个中断源 10、可编程串行UART通道 11、支持低功耗空闲及掉电模式2.1.3 AT89C52的内部引脚示意图及各引脚功能电源引脚VCC正常运行
13、和编程校验时为5V电源,VSS为接地端。 I/O总线P0.0-P0.7(P0口),P1.0-P1.7(P1口),P2.0-P2.7(P2口),P3.0-P3.7(P3口)为输入/输出引线。 时钟XTAL1:片内振荡器反相放大器的输入端。 XTAL2:片内振荡器反相器的输出端,也是内部时钟发生器的输入端。 控制总线ALE/PROG:地址锁存允许/编程信号线。当CPU访问外部存储器时,ALE用来锁存P0输出的地址信号的低8位。它的频率为振荡频率的1/6。在对8751编程时,此引脚输入编程脉冲信号。PSEN:外接程序存储器读选通信号。 EA/VPP:访问内部程序存储器的控制信号。当EA=1时,CPU
14、从片内ROM读取指令;EA=0时,CPU从片外ROM读取指令。此外,当对8751内部EPROM编程时,21V编程电源由此端输入。 RST/VPD:复位输入信号。当该引脚上出现2个机器周期以上的高电平时,可实现复位操作。此引脚为掉电保护后备电源之输入引脚2.2 显示模块介绍本设计采用数码管作为显示模块,数码管是一类价格便宜 使用简单,通过对其不同的管脚输入相对的电流,使其发亮,从而显示出数字能够显示 时间、日期、温度等所有可用数字表示的参数的器件。是集数码管,LED数码管研究、设计,生产及销售一条龙.数码管的一种是半导体发光器件,数码管可分为七段数码管和八段数码管,区别在于八段数码管比七段数码管
15、多一个发光二极管单元,其基本单元是发光二极管。2.2.1 LED数码管介绍LED数码管(LED Segment Displays)是由多个发光二极管封装在一起组成“8”字型的器件,引线已在内部连接完成,只需引出它们的各个笔划,公共电极。led数码管常用段数一般为7段有的另加一个小数点,还有一种是类似于3位“+1”型。位数有半位,1,2,3,4,5,6,8,10位等等,LED数码管根据LED的接法不同分为共阴和共阳两类,了解LED的这些特性,对编程是很重要的,因为不同类型的数码管,除了它们的硬件电路有差异外,编程方法也是不同的。图2是共阴和共阳极数码管的内部电路,它们的发光原理是一样的,只是它们
16、的电源极性不同而已。颜色有红,绿,蓝,黄等几种。led数码管广泛用于仪表,时钟,车站,家电等场合。选用时要注意产品尺寸颜色,功耗,亮度,波长等。图2-1:数码管驱动方式:概述:数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出我们要的数字,因此根据数码管的驱动方式的不同,可以分为静态式和动态式两类。静态显示驱动:静态驱动也称直流驱动。静态驱动是指每个数码管的每一个段码都由一个单片机的I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O端口多,如驱动5个数码管静态显示则需要58=40根I/O端口来驱动,要知道一
17、个89S51单片机可用的I/O端口才32个呢:),实际应用时必须增加译码驱动器进行驱动,增加了硬件电路的复杂性。动态显示驱动:数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划a,b,c,d,e,f,g,dp的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是哪个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。通过分时轮流控制各个数码管的的
18、COM端,就使各个数码管轮流受控显示,这就是动态驱动。在轮流显示过程中,每位数码管的点亮时间为12ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。显示效果由于发光二极管基本上属于电流敏感器件,其正向压降的分散性很大, 并且还与温度有关,为了保证数码管具有良好的亮度均匀度,就需要使其具有恒定的工作电流,且不能受温度及其它因素的影响。另外,当温度变化时驱动芯片还要能够自动调节输出电流 的大小以实现色差平衡温度补偿。2.
19、2.2 驱动IC(TD62783和ULN2003)介绍1、U1(TD62783)是阳极驱动,专门驱动数码管段显示的驱动,是并行输入行输出数据结构,内部是一组达林顿管,作为电流放大和驱动供电要求+5V +35V之间,同时每段数据输出可以提供近200MA的电流需求,可以同时驱动8段数码管同时工作。功能引脚如下图所示。图2-2:TDA62783管脚图管脚功能介绍:INPUT(1-8)是数据输入端口OUTPUT(11-18)是放大后数据输出端口VCC(10)电源正极输入端口GND(9)电源接地端口内部工作等效图如图2-3所示。 图2-3:内部工作原理图2、U3(ULN2003)特点如下:ULN2003
20、 的每一对达林顿都串联一个2.7K 的基极电阻,在5V 的工作电压下它能与TTL 和CMOS 电路直接相连,可以直接处理原先需要标准逻辑缓冲器来处理的数据。ULN2003 工作电压高,工作电流大,灌电流可达500mA,并且能够在关态时承受50V 的电压,输出还可以在高负载电流并行运行。ULN2003 采用DIP16 或SOP16 塑料封装。图2-4:ULN2003ULN2003是大电流驱动阵列,多用于单片机、智能仪表、PLC、数字量输出卡等控制电路中。可直接驱动继电器等负载。 输入5VTTL电平,输出可达500mA/50V。ULN2003是高耐压、大电流达林顿陈列,由七个硅NPN达林顿管组成。
21、 该电路的特点如下: ULN2003的每一对达林顿都串联一个2.7K的基极电阻,在5V的工作电压下它能与TTL和CMOS电路 直接相连,可以直接处理原先需要标准逻辑缓冲器来处理的数据。ULN2003 是高压大电流达林顿晶体管阵列系列产品,具有电流增益高、工作电压高、温度范围宽、带负载能力强等特点,适应于各类要求高速大功率驱动的系统。2.3 矩阵键盘显示的识别方法矩阵键盘是单片机外部设备中所使用的排布类似于矩阵的键盘组。键盘的工作原理: 按键设置在行、列线交点上,行、列线分别连接到按键开关的 两端。行线通过上拉电阻接到+5V 电源上。无按键按下时,行线处 于高电平的状态, 而当有按键按下时, 行
22、线电平与此行线相连的列 线电平决定。2.3.1 矩阵键盘的结构和工作原理在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样,一个端口(如P1口)就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。图2-5:3*4矩阵键盘布局图2.3.2 矩阵键盘的识别方法确定矩阵式键盘上何键被按下,介绍一种“行扫描法”。 行扫描
23、法: 行扫描法又称为逐行(或列)扫描查询法,是一种最常用的按键识别方法,介绍过程如下。 1、判断键盘中有无键按下 将全部行线Y0-Y3置低电平,然后检测列线的状态。只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。若所有列线均为高电平,则键盘中无键按下。 2、判断闭合键所在的位置 在确认有键按下后,即可进入确定具体闭合键的过程。其方法是:依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。 第三章 设计的原理
24、和电路3.1 设计的概要本系统由3*4阵列键盘,单片机,驱动电路,数码管四个部分组成。其中单片机控制整个系统的运行,通过不断的对键盘进行扫描,判断是否有按下键,按一下了哪个一个键,从而执行相应的操作。单片机将从键盘输入的有效数据,送往驱动电路,在驱动电路驱动下,数码管显示相应的数据。3.2 设计的总电路图本电路设计主要分成四部分结构:电源部分,控制部分,显示驱动部分,扩展部分;其中扩展部分又分为按键电路和存储电路。以及实际功能的需要,设计对应的电路块进行设计,电源部分主要是提供稳定的工作电源,控制部分主要是负责信号传送和输入,显示部分是主要的显示功能,扩展电路部分主要是存储扩展和按键功能扩展电
25、路。图3-1:总电路图3.2.1 电源电路设计整个电路处在弱电供电状态,而单片机供电是标准5V,所以在设计的时候我们采用单片机正常工作时候的电压设计,同时加上电容进行滤波,提高电源工作的稳定性;另外为了能给数码管显示亮度的调节,我们也提供+9V/+12V的电源/电池进行驱动部分电路的供电,以提高相应的电源的稳定性,这样根据电源不同,可以获得不同的电压,这样可以给显示驱动提供不同的电源,用来改变亮度。图3-2:电源电路3.2.2 显示电路设计显示部分主要是显示换号的数值如LED1,所以为了实际能够看清楚,我们选择了几个大点的数码管进行显示,同时使用不同的颜色进行设计,来区分那些是被换下,那些是换
26、上的号码,同时也加强了驱动部分的电路如U1/U3,防止电源拉动比较大,对整个电路电源供电产生比较大的影响,另外增家了S2来选择不同的电压,改变不同亮度要求。图3-3:显示电路3.2.3 按键部分设计矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些,列线通过电阻接正电源,并将行线所接的单片机的I/O口作为输出端,而列线所接的I/O口则作为输入。这样,当按键没有按下时,所有的输入端都是高电平,代表无键按下。行线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。图3-4:按键3.2.3存储电路设计存储器我们选择使用24C02,因为这颗IC是存储
27、容量为2K的,所以根据实际的需要符合要求,另外设计的时候电路应该增加上拉电阻如R18/R19,在设计时候PCB的走线不能太长,可能影响电路数据传送的质量,信号受到一定的影响等。图3-5:存储电路第四章 设计的仿真和调试4.1 Proteus功能介绍在现代的电子设计中,Proteus仿真技术已经称为一种普遍的工具。对设计者而言,熟练的掌握EDA技术,可以大大提高工作效率,祈祷事半功倍的效果。Proteus仿真技术即电子设计自动化。Proteus仿真技术的发展是以计算机科学、微电子技术的发展为基础,并融合了应用电子技术、智能技术以及计算机图形学、拓扑学、计算数学等众多学科的最新成果发展起来的。简单
28、的说,EDA就是立足于计算机工作平台而开发出来的一整套先进的设计电子系统的软件工具。4.2 仿真电路图4-1:仿真电路原件介绍S1: 电源控制开关,控制电源的输入与否。SB1: 键盘,0-9表示输入9个数字,根据你实际需要的数据输入,*KEY表示数据清零键,#键表示进入关闭显示节能状态,必须在按完四位显示数据以后按下,这样工作会比较稳定。SW1:确定保存按键,如果需要保存则保存好相关数据。SW2:确定调出按键,如果需要查看保存数据,可以调出查询。S2: 电源切换拨码开关,可以选择不同的电压来改变LED工作亮度要求。4.3 操作步骤第一步:检查好所以装置都为正常,闭合开关S1,接通工作电源。此时
29、数码管显示全部显示0000。第二步:选择你要的号码,如果12换下34,则连续输入3412数值,这个时候屏幕上就会出现红色34绿色12。第三步:如果暂时不保存,但是又要换号码,这个时候你要按下*按钮,把数据全部清为0000,然后重新输入你要的号码,同第二步要求一样。第四步:如果不想保存,也不想关机,但是要进入节能状态,你这个时候要按下#键,这个时候就会关闭显示功能,进入节能状态,当你要查看数据时候,再按下该键,上一次换下的号码重新显示,保持数据功能不清除。第五步:如果你要保存的话,你就可以选按下SW1确定保存,这个时候数据保存到外部存储器内。第六步:如果要调出刚保存的数据,则可以按下SW2调出查
30、询数据。第七步:使用完毕,关闭电源,断开S1开关。4.3 实验结果1.初始状态的时候,数据应该显示全部为0000图4-2:实验结果12.输入你要的号码把34换下12则输入3412就可以图4-2:实验结果23.按下#键关闭显示,此时电路照常工作,但是进入节能状态4.按下确定调出保存数据,则能把结果显示出来致谢在毕业论文的完成过程中,我首先要感谢我的指导教师朱芙菁老师的耐心指导!课程设计是检验我们课堂所学知识,提高我们的动手能力和团队协作能力的好机会,在知道我们即将开始课程设计时,我们决心要好好利用这次机会锻炼一下自己。然而,课程设计并不是课堂知识的简单叠加,而是更高层次的知识整合,对设计者的要求
31、很高。 最初接到老师的课题时,我们感到非常的茫然,觉得要实现的功能太多,完全没有头绪。后来经过指导老师的点拨,我们采取了各个击破的战术,先将整个换人显示牌的所有功能进行分类,然后分别进行电路设计以实现部分功能,最后将所有的功能模块接在一起以实现整个电路的所有功能。经过小组成员的不断讨论和设计,我们终于将仿真电路设计完成了。 然而,“万能仿真”并不是真正的“万能”,还得通过实践检验才能通过。在仿真中非常完美的功能在实际焊接过后却得不到预期的状况是经常会出现的,我们得做好心理准备进行进一步的排查。由于本电路的线路较为复杂,在焊接过程中尤其需要注意,我们便采取“两人上岗,轮流工作”的战术,确保在每次
32、焊接时焊接人员都有充沛的体力和清醒的大脑,这样就能最大限度降低焊接出错的可能性。 还要感谢和我同一设计小组的几位同学,是你们在我平时设计中和我一起探讨问题,并指出我设计上的误区,使我能及时的发现问题把设计顺利的进行下去,没有你们的帮助我不可能这样顺利地结稿,在此表示深深的谢意。参考文献 1 夏鸣风.数字电子技术实验M.重庆:重庆大学电气工程学院,2010.2 2 唐治德.数字电子技术基础M.第一版.北京:科学出版社,2009.8 3 潘松,黄继业.EDA技术使用教程M.北京:科学技术出版社,20024 王金明,杨吉斌.数字系统设计与Verilog HDL.北京:电子工业出版社,2002附录附录
33、1程序#includeat89x52.hunsigned char code dispcode10=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;/显示0-9编码unsigned char data databuf4=0,0,0,0;/显示初始值unsigned char x1;/定义一个数据变量出来unsigned char x2;unsigned char y1;unsigned char y2;unsigned char display_flag=0;#define uchar unsigned charsbit sda=P12;sb
34、it scl=P13;sbit k1=P10;/KEY输入端sbit k2=P11;/KEY输入端sbit k3=P14;/KEY输入端unsigned kflag2,kflag3, kflag1=0;unsigned int b=0;unsigned long z,x,y=0;unsigned char temp;unsigned char key;unsigned char i,j;void key_s(void)P2=0xff;P2_4=0;temp=P2;temp=temp & 0x0f;if (temp!=0x0f)for(i=50;i0;i-)for(j=200;j0;j-);te
35、mp=P2;temp=temp & 0x0f;if (temp!=0x0f)temp=P2;temp=temp & 0x0f;switch(temp)case 0x0e:key=3;break;case 0x0d:key=2;break;case 0x0b:key=1;break;temp=P2;x+; temp=temp & 0x0f;while(temp!=0x0f)temp=P2;temp=temp & 0x0f;P2=0xff;P2_5=0;temp=P2;temp=temp & 0x0f;if (temp!=0x0f)for(i=50;i0;i-)for(j=200;j0;j-);t
36、emp=P2;temp=temp & 0x0f;if (temp!=0x0f)temp=P2;temp=temp & 0x0f;switch(temp)case 0x0e:key=6;break;case 0x0d:key=5;break;case 0x0b:key=4;break;temp=P2;x+; temp=temp & 0x0f;while(temp!=0x0f)temp=P2;temp=temp & 0x0f;P2=0xff;P2_6=0;temp=P2;temp=temp & 0x0f;if (temp!=0x0f)for(i=50;i0;i-)for(j=200;j0;j-);
37、temp=P2;temp=temp & 0x0f;if (temp!=0x0f)temp=P2;temp=temp & 0x0f;switch(temp)case 0x0e:key=9;break;case 0x0d:key=8;break;case 0x0b:key=7;break;temp=P2;x+; temp=temp & 0x0f;while(temp!=0x0f)temp=P2;temp=temp & 0x0f;P2=0xff;P2_7=0;temp=P2;temp=temp & 0x0f;if (temp!=0x0f)for(i=50;i0;i-)for(j=200;j0;j-)
38、;temp=P2;temp=temp & 0x0f;if (temp!=0x0f)temp=P2;temp=temp & 0x0f;switch(temp)case 0x0e: z+;break;case 0x0d:key=0;break;case 0x0b:y=1;break;temp=P2; x+; temp=temp & 0x0f;while(temp!=0x0f)temp=P2;temp=temp & 0x0f;void key_scan() if(k2=0) if(b=10)if(k2=0) while(k2=0); kflag2+; b=0; uchar a;void delay(
39、) ; void start() /开始信号sda=1;delay();scl=1;delay();sda=0;delay();void stop() /停止sda=0;delay();scl=1;delay();sda=1;delay();void respons() /应答uchar i;scl=1;delay();while(sda=1)&(i250)i+;scl=0;delay();void init()sda=1;delay();scl=1;delay();void write_byte(uchar date)uchar i,temp;temp=date;for(i=0;i8;i+)
40、temp=temp1;scl=0; delay();sda=CY;delay();scl=1;delay();/scl=0; / delay();scl=0;delay();sda=1;delay();uchar read_byte()uchar i,k;scl=0;delay();sda=1;delay();for(i=0;i8;i+)scl=1;delay();k=(k0;a-) for(b=100;b0;b-);void write_add(uchar address,uchar date)start();write_byte(0xa0);respons();write_byte(add
41、ress);respons();write_byte(date);respons();stop();uchar read_add(uchar address)uchar date;start();write_byte(0xa0);respons();write_byte(address);respons();start();write_byte(0xa1);respons();date=read_byte();stop();return date;void display(void) switch(display_flag) case 1: if(z=0)P3=0xfe; P0=dispcod
42、edatabuf0;else P0=0x00;break;case 2: if(z=0)P3=0xfd;void key_wr() k1=1;/按键按下低电平有效,先赋予高值 if(k1=0) if(b=10)if(k1=0)/判断K1是否按下while(k1=0);/当K1处于被按下状态时候一直等待 kflag1+; b=0; if(kflag1=1) write_add(0x00,x1); delay1(20);write_add(0x01,x2); delay1(20);write_add(0x02,y1); delay1(20);write_add(0x03,y2); delay1(2
43、0); if(kflag1=2) /kflag1=0;void main () P3=0x00; /P1=0x00; P2=0x00; TMOD = 0x11; TH0=(65536-1000)/256; TL0=(65536-1000)%256; TH1=(65536-1000)/256; TL1=(65536-1000)%256; IE = 0x8a; EA=1; ET1=1; TR1 = 1; TR0 = 1; init(); while(1) key_wr(); display_data_change(); if(kflag2=1) x1=read_add(0x00); x2=read_add(0x01); y1=read_add(0x02); y2=read_add(0x03); if(kflag2=2) /kflag2=0; x1=read_add(0x04); x2=read_add(0x05); y1=read_add(