资源预览内容
第1页 / 共98页
第2页 / 共98页
第3页 / 共98页
第4页 / 共98页
第5页 / 共98页
第6页 / 共98页
第7页 / 共98页
第8页 / 共98页
第9页 / 共98页
第10页 / 共98页
亲,该文档总共98页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
单片机与常用外围设备接口电路单片机与常用外围设备接口电路 10.1 LED发光二极管发光二极管 发光二极管是半导体二极管的一种,可以把电能转化成光能;常简写为LED。发光二极管与普通二极管一样是由一个PN结组成,也具有单向导电性单向导电性。当给发光二极管加上正向电压后,从P区注入到N区的空穴和由N区注入到P区的电子,在PN结附近数微米内分别与N区的电子和P区的空穴复合,产生自发辐射的荧光。 不同的半导体材料中电子和空穴所处的能量状态不同能量状态不同。当电子和空穴复合时释放出的能量多少不同,释放出的能量越多,则发出的光的波长越短。常用的是发红光、绿光或黄光的二极管。发光二极管的外形如图10-1所示。 发光二极管的反向击穿电压约5伏。它的正向伏安特性曲线很陡,使用时必须串联限流电阻以控制通过管子的电流。限流电阻R可用下式计算: R=R=(E EUFUF)/IF/IF 式中E为电源电压,UF为LED的正向压降,IF为LED的一般工作电流。1讲10.1.1 物理特性 发光二极管的两根引线中较长的一根为正极,应接电源正极。有的发光二极管的两根引线一样长,但管壳上有一凸起的小舌,靠近小舌的引线是正极。 发光二极管与小白炽灯泡和氖灯相比,发光二极管的特点是:工作电压很低(有的仅一点几伏);工作电流很小(有的仅零点几毫安即可发光);抗冲击和抗震性能好,可靠性高,寿命长;通过调制通过的电流强弱可以方便地调制发光的强弱。由于有这些特点,发光二极管在一些光电控制设备中用作光源,在许多电子设备中用作信号显示器。把它的管心做成条状,用7条条状的发光管组成7段式半导体数码管,每个数码管可显示09十个数目字。多种颜色的发光二极管如图10-2所示。10.1.2 发光原理 50年前人们已经了解半导体材料可产生光线的基本知识,第一个商用二第一个商用二极管产生于极管产生于19601960年年。LED是英文light emitting diode(发光二极管)的缩写,它的基本结构是一块电致发光的半导体材料,置于一个有引线的架子上,然后四周用环氧树脂密封,起到保护内部芯线的作用,所以LED的抗震性能好。 发光二极管的核心部分是由P型半导体和N型半导体组成的晶片,在P型半导体和N型半导体之间有一个过渡层,称为PNPN结结。在某些半导体材料的PN结中,注入的少数载流子与多数载流子复合时会把多余的能量以光的形式释放出来,从而把电能直接转换为光能。 PN结加反向电压,少数载流子难以注入,故不发光。这种利用注入式电致发光原理制作的二极管叫发光二极管,通称LED。 当它处于正向工作状态时(即两端加上正向电压),电流从LED阳极流向阴极时,半导体晶体就发出从紫外到红外不同颜色的光线,光的强弱与电流有关。10.1.3 分类 发光二极管还可分为普通单色发光二极管、高亮度发光二极管、超高亮度发光二极管、变色发光二极管、闪烁发光二极管、电压控制型发光二极管、红外发光二极管和负阻发光二极管等。10.1.4 LED光源的特点 1. 电压 LED使用低压电源,供电电压在6-24V之间,根据产品不同而异,所以它是一个比使用高压电源更安全的电源,特别适用于公共场所。 2. 效能 消耗能量较同光效的白炽灯减少80% 3. 适用性 体积很小,每个单元LED小片是3-5mm2的正方形,所以可以制备成各种形状的器件,并且适合于易变的环境的发光二极管 4. 稳定性 10万小时,光衰为初始的50% 5. 响应时间 其白炽灯的响应时间为毫秒级,LED灯的响应时间为纳秒级 6. 对环境污染 无有害金属汞 7. 颜色 发光二极管方便地通过化学修饰方法,调整材料的能带结构和禁带宽度,实现红黄绿蓝橙多色发光。红光管工作电压较小,颜色不同的红、橙、黄、绿、蓝的发光二极管的工作电压依次升高。 8. 价格 LED的价格现在越来越平民化,因LED省电的特性,也许不久的将来,人们都会的把白炽灯换成LED灯。现在,我国部分城市公路、学校、厂区等场所已换装万LED路灯、节能灯等。10.1.5 LED光参数介绍 LED的光学参数中重要的几个方面就是:光通量、发光效率、发光强度、光强分布、波长。 发光效率和光通量发光效率和光通量。发光效率就是光通量与电功率之比。发光效率表征了光源的节能特性,这是衡量现代光源性能的一个重要指标。 发光强度和光强分布发光强度和光强分布。LED发光强度是表征它在某个方向上的发光强弱,由于LED在不同的空间角度光强相差很多,随之而来我们研究了LED的光强分布特性。这个参数实际意义很大,直接影响到LED显示装置的最小观察角度。比如体育场馆的LED大型彩色显示屏,如果选用的LED单管分布范围很窄,那么面对显示屏处于较大角度的观众将看到失真的图像。而且交通标志灯也要求较大范围的人能识别。 波长波长。对于LED的光谱特性我们主要看它的单色性是否优良,而且要注意到红、黄、蓝、绿、白色LED等主要的颜色是否纯正。因为在许多场合下,比如交通信号灯对颜色就要求比较严格,现在我国的一些LED信号灯中绿色的为深绿,红色的为深红,从这个现象来看我们对LED的光谱特性进行专门研究是非常必要而且很有意义的。10.1.6 发光二极管的检测 1. 普通发光二极管的检测(1)用万用表检测用万用表检测。利用具有10k挡的指针式万用表可以大致判断发光二极管的好坏。正常时,二极管正向电阻阻值为几十至200k,反向电阻的值为。如果正向电阻值为0或为,反向电阻值很小或为0,则已损坏。这种检测方法,不能实质地看到发光管的发光情况,因为10k挡不能向LED提供较大正向电流。 如果有两块指针万用表(最好同型号)可以较好地检查发光二极管的发光情况。用一根导线将其中一块万用表的“+”接线柱与另一块表的“-”接线柱连接。余下的“-”笔接被测发光管的正极(P区),余下的“+”笔接被测发光管的负极(N区)。两块万用表均置10k挡。正常情况下,接通后就能正常发光。若亮度很低,甚至不发光,可将两块万用表均拨至1兆若,若仍很暗,甚至不发光,则说明该发光二极管性能不良或损坏。应注意,不能一开始测量就将两块万用表置于1m,以免电流过大,损坏发光二极管。 (2)外接电源测量外接电源测量。用3V稳压源或两节串联的干电池及万用表(指针式或数字式皆可)可以较准确测量发光二极管的光、电特性。 如果测得VF在1.43V之间,且发光亮度正常,可以说明发光正常。如果测得VF=0或VF3V,且不发光,说明发光管已坏。 2. 红外发光二极管的检测 由于红外发光二极管,它发射13m的红外光,眼看不到。通常单只红外发光二极管发射功率只有数mW,不同型号的红外LED发光强度也不相同。红外LED的正向压降一般为1.32.5V。正由于其发射的红外光人眼看不见,所以利用上述可见光LED的检测法只能判定其PN结正、反向电学特性是否正常,而无法判定其发光情况正常否。为此,最好准备一只光敏光敏器件器件(如2CR、2DR型硅光电池)作接收器。用万用表测光电池两端电压的变化情况。来判断红外LED加上适当正向电流后是否发射红外光。10.1.7 发光二极管发光二极管LED与单片机的应用与单片机的应用 例10-1 如图10-3所示,单片机的P0口经74LS373锁存器和发光二极管D1-D8连接,D1-D8的正极经过R1-R8限流电阻接+5V电压,P0口因为没有上拉电阻,所以要外加RP1排阻。编程实现LED发光二极管流水灯闪烁效果。 程序如下: #include #include void delay(unsigned char tmp);/延时子函数 codecode unsigned chartmpled50=0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80,0X81,0X82,0X84,0X88,0X90,0XA0,0XC0,0XC1,0XC2,0XC4,0XC8,0XD0,0XE0,0XE1,0XE2,0XE4,0XE8,0XF0,0XF1,0XF2,0XF4,0XF8,0XF9,0XFA,0XFC,0XFD,0XFE,0XFF,0XFF,0X00,0XFF,0X00;/定义数组常量,前面加code表示常量在程序代码中存放,/不占用RAM。该数组为发光二极管的输出数据注意:实际定义了多少个具体的内容注意:实际定义了多少个具体的内容void main(void) /入口函数unsigned char i;/定义变量while(1) /无限循环 for(i=0;i50;i+)/连续输出50个数据 P0=tmpledi; /这个符号是取反,因发光二极管采用共阳极,所以将数据取反再输出delay(50); /调用延时子函数,改变参数大小,调整变化速度void delay(unsigned char tmp)/延时子函数unsigned char i,j;i=tmp;while(i) i-;j=255;while(j) j-; 10.2 数码管数码管 数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按能显示多少个“8”可分为1位、2位、4位等数码管。常用的LED显示器有LED状态显示器(俗称发光二极管)、LED七段显示器(俗称数码管)和LED十六段显示器。 发光二极管可显示两种状态,用于系统状态显示;数码管用于数字显示;LED十六段显示器用于字符显示。10.2.1 数码管简介 1. 数码管结构数码管结构如图10-4所示。 数码管由8个发光二极管(以下简称字段)构成,通过不同的组合可用来显示数字0-9、字符A -F、H、L、P、R、U、Y、符号“”及小数点“”。 数码管又分为共阴极和共阳极两种结构。 LED数码管分类:1)按其内部结构可分为共阴型和共阳型;2)按其外形尺寸有多种形式,使用较多的是0.5和0.8;3)按显示颜色也有多种形式,主要有红色和绿色;4)按亮度强弱可分为超亮、高亮和普亮。5)正向压降一般为1.52V,额定电流为10mA,最大电流为40mA。2. 2. 数码管工作原理数码管工作原理 共阳极数码管的8个发光二极管的阳极(二极管正端)连接在一起。通常,公共阳极接高电平(一般接电源),其它管脚接段驱动电路输出端。当某段驱动电路的输出端为低电平时,则该端所连接的字段导通并点亮。根据发光字段的不同组合可显示出各种数字或字符。此时,要求段驱动电路能吸收额定的段导通电流,还需根据外接电源及额定段导通电流来确定相应的限流电阻。 共阴极数码管的8个发光二极管的阴极(二极管负端)连接在一起。通常,公共阴极接低电平(一般接地),其它管脚接段驱动电路输出端。当某段驱动电路的输出端为高电平时,则该端所连接的字段导通并点亮,根据发光字段的不同组合可显示出各种数字或字符。此时, 要求段驱动电路能提供额定的段导通电流,还需根据外接电源及额定段导通电流来确定相应的限流电阻。 3. 数码管字形编码(重点学习重点学习)要使数码管显示出相应的数字或字符,必须使段数据口输出相应的字形编码。字型码各位定义为:数据线D0与a字段对应,D1与b字段对应,依此类推。 如使用共阳极数码管,数据为0表示对应字段亮,数据为1表示对应字段暗;如使用共阴极数码管,数据为0表示对应字段暗,数据为1表示对应字段亮。如要显示“0”,共阳极数码管的字型编码应为:11000000B(即C0H);共阴极数码管的字型编码应为:00111111B(即3FH)。依此类推。数码管字形编码表如表10-1所示。10.2.2 驱动方式 数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出我们要的数字,因此根据数码管的驱动方式的不同,可以分为静态静态驱动驱动和动态动态驱动驱动两类。 静态显示静态显示是指数码管显示某一字符时,相应的发光二极管恒定导通或恒定截止。这种显示方式的各位数码管相互独立,公共端恒定接地(共阴极)或接正电源(共阳极)。每个数码管的8个字段分别与一个8位I/O口地址相连,I/O口只要有段码输出,相应字符即显示出来,并保持不变,直到I/O口输出新的段码。采用静态显示方式,较小的电流即可获得较高的亮度,且占用CPU时间少,编程简单,显示便于监测和控制,但其占用的口线多,硬件电路复杂,成本高,只适合于显示位数较少的场合。 动态显示动态显示是一位一位地轮流点亮各位数码管,这种逐位点亮显示器的方式称为位扫描。通常,各位数码管的段选线相应并联在一起,由一个8位的I/O口控制;各位的位选线(公共阴极或阳极)由另外的I/O口线控制。动态方式显示时,各数码管分时轮流选通,要使其稳定显示,必须采用扫描方式,即在某一时刻只选通一位数码管,并送出相应的段码,在另一时刻选通另一位数码管,并送出相应的段码。依此规律循环,即可使各位数码管显示将要显示的字符。 虽然这些字符是在不同的时刻分别显示,但由于人眼存在视觉暂留效应视觉暂留效应,只要每位显示间隔足够短就可以给人以同时显示的感觉。 采用动态显示方式比较节省I/O口,硬件电路也较静态显示方式简单,但其亮度不如静态显示方式,而且在显示位数较多时,CPU要依次扫描,占用CPU较多的时间。10.2.3 常见问题常见问题 一、恒流驱动与非恒流驱动对数码管的影响一、恒流驱动与非恒流驱动对数码管的影响 1、显示效果 由于发光二极管基本上属于电流敏感器件,其正向压降的分散性很大, 并且还与温度有关,为了保证数码管具有良好的亮度均匀度,就需要使其具有恒定的工作电流,且不能受温度及其它因素的影响。另外,当温度变化时驱动芯片还要能够自动调节输出电流的大小以实现色差平衡温度补偿。 2、安全性 即使是短时间的电流过载也可能对发光管造成永久性的损坏,采用恒流驱动电路后可防止 由于电流故障所引起的数码管的大面积损坏。另外,我们所采用的超大规模集成电路还 具有级联延时开关特性,可防止反向尖峰电压对发光二极管的损害。超大规模集成电路还具有热保护功能,当任何一片的温度超过一定值时可自动关断,并且可在控制室内看到故障显示。二、数码管二、数码管LEDLED显示使用三极管的注意事项显示使用三极管的注意事项(注意注意)1、使用三极管目的是放大电流2、三极管三脚顺序ebc(三极管平的一面向自己时的顺序),3、NPN(箭头向出):脚e接数码管的公共脚,脚c接+5V电源,脚b接P1.7;4、数码管的脚abcdefgh并不是按一定的顺序排列的,要用万用表进行测量,看那段发亮;5、PNP(箭头向入);6、电解电容长为正|-符号,短(灰白色)为负(-符号三、为什么数码管亮度不均匀?三、为什么数码管亮度不均匀? 关于亮度一致性的问题是一个行业内的常见问题。 有二个大的因素影响到亮度一致性。一是使用原材料芯片的选取,一是使用数码管时采取的控制方式。 1、原材料-芯片的UF和亮度和波长是一个正态分布正态分布,即使筛选过芯片,UF和亮度和波长已在一个很小的范围了,生产出来的产品还是在一个范围内,结果就是亮度不一致。 2、要保证数码管亮度一样,在控制方式选取上也有差别。最好的办法是恒流控制,流过每一个发光二极管的电流都是相同的,这样发光二极管看起来亮度就是一样的了。如恒压控制,则导致UF不相同的发光二极管分到的电流不相同,所以亮度也不同。当然以上二个条件是相辅相成的。 四、怎样测量数码管引脚,分共阴和共阳四、怎样测量数码管引脚,分共阴和共阳? ? (重点学习)(重点学习) 找公共共阴和公共共阳:首先,我们找个电源(3到5伏)和1个1K(几百欧的也行)的电阻,Vcc串接一个电阻后和GND接在任意2个脚上,组合有很多,但总有一个LED会发光的,找到一个就够了,然后GND不动,Vcc(串电阻)逐个碰剩下的脚,如果有多个LED(一般是8个),那它就是共阴的了。相反用Vcc不动,GND逐个碰剩下的脚,如果有多个LED(一般是8个),那它就是共阳的。也可以直接用数字万用表,红表笔是电源的正极,黑表笔是电源的负极。10.2.4 10.2.4 数码管与单片机的应用数码管与单片机的应用 例10-2 如图10-5所示,单片机的P2口接数码管的字形口,P1.0-P1.2接译码器74LS138的A-C实现片选Y0-Y7,E1、E2、E3为使能端,E2=E3=0(4脚、5脚接低电平),E1=1(6脚接高电平),74LS138被选通工作。数码管的字位口接74LS128的Y0-Y7,因为Y0-Y7是低电平(即0)表示选中,所以数码管应该采用共阴管。要求:在数码管上动态显示24C02。 分析:分析: 1)采用74LS138译码器为中间器件,采用减少P口的使用,只用了P1.0-P1.2则可实现8个数码管字位的控制;2)在实际硬件制作过程中,由于采用共阴管,靠P2口提供的电流令数码管发光,存在电流拉动不够,管不够亮的情况;解决办法解决办法一一:可以在74LS138后再加74LS240芯片,再把共阴管改为共阳管则可(记得程序代码也要做相应调整)。市面上现在也很少八为一体数码管,可以用2个四为一体的代替。解决办法二:解决办法二:在P2口和数码管之间增加74LS373锁存器(或者74HC573锁存器)3)74LS240是八反相缓冲器/线驱动器。也就是一片芯片上,有八路(个)反相缓冲器/线驱动器。反相的意思是当输入是高电平,输出就是低电平,当输入是低电平,输出就是高电平。缓冲器,因为芯片有三态门,数据可在用时打开三态门,驱动能力强,可用于总线上驱动用。 4)四位一体数码管有12个脚,有4个公共端,8个字型端。万用表选X10电阻挡,红笔出来“负”,黑笔出来“正”。 思考:有没有译码器是高电平输出有效,若有则不需要用74LS240,硬件电路更加简单。图10-5 单片机与数片机与数码管的管的连接接/*数码管的显示*/#include #include void display(unsigned char *lp,unsigned char lc); /数字的显示函数;lp为指向数组的地址,lc为显示的个数void displaystr(unsigned char *lp,unsigned char lc); /字符的显示函数,同上void delay(); /延时子函数,5个空指令code unsigned char table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00;/共阴数码管 0-9 , , 全灭unsigned char l_tmpdate8=0,1,2,3,4,5,6,7;/定义数组变量,并赋值0,12,3,4,5,6,7,就是本程序要显示的八个数code unsigned char l_24C025=0x5b,0x66,0x39,0x3f,0x5b;/24C02 /定义数组常量,前面加code表示常量在程序代码中存放,ROM /不占用RAM,在数码管上显示24C02void main(void) unsigned char i=0;while(1) display(l_tmpdate,8);/用数字显示函数显示八个数字 /displaystr(l_24C02,5);/或者用这个函数显示5个字符 void display(unsigned char *lp,unsigned char lc) /显示 unsigned char i;/定义变量 P2=0;/端口2为输出 P1=P1&0xF8; /将P1口的前3位输出0,对应74LS138译门输入脚,全0为第一位数码管 for(i=0;ilc;i+) /循环显示 P2=tablelpi; /查表法得到要显示数字的数码段 delay( ); /延时5个空指令 if(i=7) /检测显示完8位否,完成直接退出,不让P1口再加1,否则进位影响到第四位数据 break; P2=0;/清0端口,准备显示下位 P1+;/下一位数码管void displaystr(unsigned char *lp,unsigned char lc)/显示unsigned char i;P2=0;P1=P1&0xF8;for(i=0;ilc;i+) P2=lpi;/本函数跟上面函数一样,不同的是它不用查表, /直接输出显示已设定好的数值到数码段 delay(); if(i=7) break; P2=0; P1+;void delay(void) /空5个指令_nop_();_nop_();_nop_();_nop_();_nop_();10.3 点阵点阵 为集中反映晶体结构的周期性而引入的一个概念。首先考虑一张二维周期性结构的图像。可在图上任选一点 O作为原点。在图上就可以找到一系列与O点环境完全相同的点子,这一组无限多的点子就构成了点阵点阵。将图像作一平移,对应于从原点O移至点阵的任意位置,图像仍然不变。这种不变性表明点阵反映了原结构的平移对称性。上述的考虑显然可以推广到具有三维周期性结构的无限大晶体。应该指出,原点位置可以任意选,但得到的点阵却是等同的。 点阵平移矢量L总可以选用三个非共面的基矢A1、A2及A3的组合来表示:L=mA1+nA2+pA3,这里的m、n、p为三个整数。A1、A2与A3所构成的平行六面体,称为晶胞或初基晶胞,它包含了晶体结构的基本重复单元。 值得注意:基矢与晶胞的选择都不是唯一的,存在无限多种选择方案。一个初基晶胞是晶体结构的最小单元。但是有时为了能更充分地反映出点阵的对称性,也可选用稍大一些的非初基晶胞(即晶胞中包含一个以上的阵点)。2讲 一个点阵可以还原为一系列平行的阵点行列(简称阵列),或一系列的平行的阵点平面(简称阵面)。可用由一组基矢所确定的坐标系来描述某一组特定的阵列或阵面族的取向。 我们选取通过原点的阵列上任意阵点的三个坐标分量,约化为互质的整数u、v、w作为阵列方向的指标,可用符号【uvw】来表示。为了标志某一特定阵面族的方向,可选择最靠近(但不通过)原点的阵面,读取它在三个坐标轴上截距的倒数,将这三个数约化为互质的数h、k、l就得该阵面旋的方向指标,可用符号(hkl)来表示。这就是阵面族的密勒指数。点阵外形图如图10-6所示,点阵电路结构图图10-7所示。 图图10-6 点阵外形图点阵外形图 图图10-6 点阵外形图点阵外形图 图图10-7 点阵结构图点阵结构图 例10-3 如图10-8所示,点阵8*8的行X0-X7接单片机P2.0-P2.7,列L0-L7接P3.0-P3.7,实现行列扫描。(重点学习)(重点学习) 单片机的P1.0接按键,初始状态点阵显示数码“0”,每按一下按键,数码管则加1显示,到数码“9”,再按则变回“0”,即0-9循环。 测量:行用黑笔,列用红笔测量:行用黑笔,列用红笔 图图10-8 单片机和点阵的连接单片机和点阵的连接程序如下:#include #define hang P2 /*定义行的IO口*/#define lie P3 /*定义列的IO口*/sbit an = P10; /定义按键char shu=0 ; /定义一个变量记下当前的数字unsigned char code tab =0x00,0x7E,0xFF,0xC3,0xC3,0xFF,0x7E,0x00, /字符00x00,0x00,0x43,0xFF,0xFF,0x03,0x00,0x00, /字符10x00,0x63,0xC7,0xCF,0xDB,0xF3,0x63,0x00, /字符20x00,0x42,0xDB,0xDB,0xDB,0xFF,0x66,0x00, /字符30x00,0x3E,0x46,0xFF,0xFF,0x06,0x06,0x00, /字符40x00,0xF6,0xF7,0xD3,0xD3,0xDF,0xDE,0x00, /字符50x00,0x7E,0xFF,0xDB,0xDB,0xDF,0x4E,0x00, /字符60x00,0xC0,0xC0,0xC7,0xFF,0xF8,0xC0,0x00, /字符70x00,0xFF,0xFF,0xDB,0xDB,0xFF,0xFF,0x00, /字符80x00,0x72,0xFB,0xDB,0xDB,0xFF,0x7E,0x00, /字符9 ;void delay(unsigned int a)/延时子函数 while(a-);/*8x8点阵子函数,显示数字子函数*/void draw_8x8(char tu) /定义一个名为tu的数组,形参用数组 char n; /变量标记扫描的次数 for(n=0;n8;n+) hang=1n; /选行 /hang=1=00000001B0,向左边移动0位,就是说首次不用移动 /P2.0=1,有效,选中首行,即第0行; lie=tun; /送出8个列的状态,即显示tu0。 delay(50); xing=0; /xing=0; /消影消影 lie=0;lie=0; void qudoudong()/按键去抖动子函数 char a=10; while(a-) draw_8x8(&tabshu*8);/去抖动时显示当前数字void main() unsigned int n=0;/按键超时变量 while(1) draw_8x8(&tabshu*8); /显示数字 /实参用指针变量;&tabshu*8是变量tabshu*8的地址;&是取地址运算符 /设shu=1,则darw_8x8(&tab1*8)=darw_8x8(&tab8),意思是指向tab8, /从第9个内容开始抽数,一抽抽8个,这样送列才会显示1; an=1;/按键没有按下则为1;(按键首状态) if(an=0)/有按下 qudoudong();/去抖动; if(an=0)/真的按下了键(再判) while(an=0) /等手放开,放手则不能进入这个循环体,因为an=1; draw_8x8(&tabshu*8);/显示数字 n+; if(n=100) /n起到判断作用,按的时间长了,就break,转到去做显示 break; /如果按键超时则退出 n=0;/回复按键超时变量为0 shu+; if(shu=10) /如果数字超过了9 shu=0; /回复为0 an=1; 例10-4 如图10-9所示,在16*16点阵上循环显示“单片机点阵实验!”字样。初始点阵屏幕显示“单”字,向左移动。按下按键,则字样向右移动。 图10-9 点阵16*16#include #include #include /*字模*/unsigned char code zdan32= /单0x10,0x10,0x08,0x20,0x04,0x48,0x3f,0xfc,0x21,0x08,0x21,0x08,0x3f,0xf8,0x21,0x08,0x21,0x08,0x3f,0xf8,0x21,0x00,0x01,0x04,0xff,0xfe,0x01,0x00,0x01,0x00,0x01,0x00;unsigned char code zpian32= /片0x00,0x80,0x20,0x80,0x20,0x80,0x20,0x80,0x20,0x84,0x3f,0xfe,0x20,0x00,0x20,0x00,0x3f,0xc0,0x20,0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x40,0x40,0x80,0x40;unsigned char code zji32= /机0x10,0x00,0x10,0x10,0x11,0xf8,0x11,0x10,0xfd,0x10,0x11,0x10,0x31,0x10,0x39,0x10,0x55,0x10,0x51,0x10,0x91,0x10,0x11,0x10,0x11,0x12,0x12,0x12,0x14,0x0e,0x18,0x00;unsigned char code zdian32= /点0x02,0x00,0x02,0x00,0x02,0x08,0x03,0xfc,0x02,0x00,0x02,0x10,0x3f,0xf8,0x20,0x10,0x20,0x10,0x20,0x10,0x3f,0xf0,0x00,0x00,0x29,0x10,0x24,0xc8,0x44,0x44,0x80,0x04;unsigned char code zzhen32= /阵0x00,0x80,0x78,0x84,0x4f,0xfe,0x50,0x80,0x50,0xa0,0x61,0x20,0x51,0x28,0x4b,0xfc,0x48,0x20,0x48,0x20,0x68,0x24,0x57,0xfe,0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x20;unsigned char code zshi32= /实0x02,0x00,0x01,0x00,0x7f,0xfe,0x48,0x02,0x86,0x84,0x02,0x80,0x10,0x80,0x0c,0x80,0x04,0x84,0xff,0xfe,0x01,0x00,0x01,0x40,0x02,0x20,0x04,0x10,0x18,0x0c,0x60,0x04;unsigned char code zyan32= /验0x08,0x40,0xfc,0x40,0x08,0xa0,0x48,0xa0,0x49,0x10,0x4a,0x0e,0x4d,0xf4,0x48,0x00,0x7c,0x48,0x06,0x48,0x05,0x48,0x1d,0x50,0xe5,0x10,0x44,0x24,0x17,0xfe,0x08,0x00;unsigned char code ztanhao32= /!0x00,0x00,0x01,0x80,0x03,0xc0,0x03,0xc0,0x03,0xc0,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x00,0x00,0x00,0x00,0x01,0x80,0x01,0x80,0x00,0x00,0x00,0x00;unsigned char *z_q=zdan,zpian,zji,zdian,zzhen,zshi,zyan,ztanhao,0; /要显示的字/定义了*z_q指针指向数组,只是它的每一个数组元素又是一个数组(二维数组)unsigned char TU32; /要显示的画面sbit A_A =P11 ; /移动sbit P21 =P21 ;sbit P22 =P22 ;sbit P23 =P23 ;sbit P24 =P24 ;#define P00P0#define ZUO(a) P00=a;P24=0;P24=1#define YOU(a) P00=a;P21=0;P21=1#define SHANG(a) P00=a;P22=0;P22=1#define XIA(a) P00=a;P23=0;P23=1extern void xianshiyanshi(unsigned int n); /显示延时子程序extern void chuqitu(void); /初始图第一个字单extern void dian1616(unsigned char ZZ); /显示画图子程序extern void DELAY(unsigned int a); /延时子函数 void DELAY(unsigned int a) /延时子函数a最大为十进制65535 while(a-) ; void dian1616(unsigned char ZZ)/显示画图子程序 unsigned char a,b; /a放行号,b放字在数组的序号 b=0;XIA(0x00);/不送出下半部分 for(a=0x01;a!=0;a=(a1)/上半个字 DELAY(2) ; /延时一小段时间为看清楚 ZUO(ZZb); b+ ; YOU(ZZb); /送出右 b+ ; SHANG(a) ;/送出行号 DELAY(30) ;/延时一小段时间为了字型显示更清楚 ZUO(0) ; /消影 YOU(0); SHANG(0x00);/不送出上半部分 for(a=0x01;a!=0;a=(a1)/下半个字 DELAY(2) ;/延时一小段时间为看清楚 ZUO(ZZb) ; b+ ; YOU(ZZb); /送出右 b+ ; XIA(a); /送出行号 DELAY(30) ;/延时一小段时间为了字型显示更清楚 ZUO(0) ; /消影 YOU(0); void chuqitu(void)/初始图为第一个字单 char n; for(n=0;n32;n+) TUn=z_q0n; /二维数组 void xianshiyanshi(unsigned int n)/显示延时 while(n-) dian1616(TU);/显示画图子程序void zychulimain(void)/左右处理子程序 unsigned char hao=0; /记第一序号 idata unsigned char haox=1; /记下一个序号 unsigned char n=0; /当前的处理的地方unsigned char n_n=0; /移动后的地方标记 haox=1; while(1) n_n+; if(n_n=16) n_n=0; haox+; if(z_qhaox=0) /如下一个序号为最后复位为0 haox=0; hao+; if(z_qhao=0) /如下第一序号为最后复位为0 hao=0; for(n=0;n16;n+)/左右处理 A_A=1; if(A_A=1)/没有按下则左移 TU2*n7)&1); TU2*n+1=1;/右半处理 if(n_n(7-n_n)&0x01); else TU2*n+1|=(z_qhaox2*n+1(15-n_n)&0x01); else/有按下右移 TU2*n+1=1;/右半处理 TU2*n+1|=(TU2*n=1;/左半处理 if(n_n8) TU2*n|=(z_qhaox2*n+1(7-n_n)&0x80); else TU2*n|=(z_qhaox2*n(15-n_n)&0x80); xianshiyanshi(15);/显示延时 main( ) /主程序 chuqitu(); /初始图为第一个字单while(1) zychulimain() ;/左右处理子程序 10.4 键盘接口原理键盘接口原理10.4.1 按键的分类 按键按照结构原理可分为两类,一类是触点式开关按键,如机械式开关、导电橡胶式开关等;另一类是无触点式开关按键,如电气式按键,磁感应按键等。前者造价低,后者寿命长。目前,微机系统中最常见的是触点式开关按键。 10.4.2 输入原理 在单片机应用系统中,除了复位按键有专门的复位电路及专一的复位功能外,其它按键都是以开关状态来设置控制功能或输入数据的。当所设置的功能键或数字键按下时,计算机应用系统应完成该按键所设定的功能,键信息输入是与软件结构密切相关的过程。 对于一组键或一个键盘,总有一个接口电路与CPU相连。CPU可以采用查询或中断方式了解有无将键输入,并检查是3讲 哪一个键按下,将该键号送入累加器ACC,然后通过跳转指令转入执行该键的功能程序,执行完后再返回主程序10.4.3按键结构与特点 微机键盘通常使用机械触点式按键开关机械触点式按键开关,其主要功能是把机械上的通断转换成为电气上的逻辑关系。也就是说,它能提供标准的TTL逻辑电平,以便与通用数字系统的逻辑电平相容。机械式按键再按下或释放时,由于机械弹性作用的影响,通常伴随有一定时间的触点机械抖动触点机械抖动,然后其触点才稳定下来。其抖动过程如下图所示,抖动时间的长短与开关的机械特性有关,一般为510 ms。在触点抖动期间检测按键的通与断状态,可能导致判断出错,即按键一次按下或释放被错误地认为是多次操作,这种情况是不允许出现的。为了克服按键触点机械抖动所致的检测误判,必须采取去抖动措施。这一点可从硬件、软件两方面予以考虑。在键数较少时,可采用硬件去抖,而当键数较多时,采用软件去抖。按键触点机械抖动如图10-10所示。 图图10-10 按键触点机械抖动按键触点机械抖动 1. 1. 按键编码按键编码 一组按键或键盘都要通过I/O口线查询按键的开关状态。根据键盘结构的不同,采用不同的编码。无论有无编码,以及采用什么编码,最后都要转换成为与累加器中数值相对应的键值,以实现按键功能程序的跳转。 2. 2. 键盘程序键盘程序 一个完善的键盘控制程序应具备以下功能: (1) 检测有无按键按下,并采取硬件或软件措施,消除键盘按键机械触点抖动的影响。 (2) 有可靠的逻辑处理办法。每次只处理一个按键,其间对任何按键的操作对系统不产生影响,且无论一次按键时间有多长,系统仅执行一次按键功能程序。 (3) 准确输出按键值(或键号),以满足跳转指令要求。 3. 3. 独立式按键独立式按键 单片机控制系统中,往往只需要几个功能键,此时,可采用独立式按键结构。 1)独立式按键结构独立式按键是直接用I/O口线构成的单个按键电路,其特点是每个按键单独占用一根I/O口线,每个按键的工作不会影响其它I/O口线的状态。独立式按键的典型应用如图所示。独立式按键电路配置灵活,软件结构简单,但每个按键必须占用一根I/O口线,因此,在按键较多时,I/O口线浪费较大,不宜采用。独立式按键如图10-11所示。8051 图图10-11 独立式按键独立式按键 2) 独立式按键的软件结构 独立式按键的软件常采用查询式结构。先逐位查询每根I/O口线的输入状态,如某一根I/O口线输入为低电平,则可确认该I/O口线所对应的按键已按下,然后,再转向该键的功能处理程序。4. 矩阵式按键矩阵式按键 单片机系统中,若使用按键较多时,通常采用矩阵式(也称行列式)键盘。 1) 矩阵式键盘的结构及原理 矩阵式键盘由行线和列线组成,按键位于行、列线的交叉点上,其结构如下图所示。 由图可知,一个44的行、列结构可以构成一个含有16个按键的键盘,显然,在按键数量较多时,矩阵式键盘较之独立式按键键盘要节省很多I/O口。行列式按键如图10-12所示。 矩阵式键盘中,行、列线分别连接到按键开关的两端,行线通过矩阵式键盘中,行、列线分别连接到按键开关的两端,行线通过上拉电阻接到上拉电阻接到5V5V上。当无键按下时,行线处于高电平状态;当有键上。当无键按下时,行线处于高电平状态;当有键按下时,行、列线将导通,此时,行线电平将由与此行线相连的列线按下时,行、列线将导通,此时,行线电平将由与此行线相连的列线电平决定。这是识别按键是否按下的关键。然而,矩阵键盘中的行线、电平决定。这是识别按键是否按下的关键。然而,矩阵键盘中的行线、列线和多个键相连,各按键按下与否均影响该键所在行线和列线的电列线和多个键相连,各按键按下与否均影响该键所在行线和列线的电平,各按键间将相互影响,因此,必须将行线、列线信号配合起来作平,各按键间将相互影响,因此,必须将行线、列线信号配合起来作适当处理,才能确定闭合键的位置。适当处理,才能确定闭合键的位置。(重点掌握)(重点掌握)(重点掌握)(重点掌握) 2) 矩阵式键盘按键的识别 识别按键的方法很多,其中,最常见的方法是扫描法。 按键按下时,与此键相连的行线与列线导通,行线在无键按下时处在高电平。显然,如果让所有的列线也处在高电平,那么,按键按下与否不会引起行线电平的变化,因此,必须使所有列线处在低电平。只有这样,当有键按下时,该键所在的行电平才会由高电平变为低电平。CPU根据行电平的变化,便能判定相应的行有键按下。 3) 键盘的编码 对于独立式按键键盘,因按键数量少,可根据实际需要灵活编码。对于矩阵式键盘,按键的位置由行号和列号惟一确定,因此可分别对行号和列号进行二进制编码,然后将两值合成一个字节,高4位是行号,低4位是列号。10.4.4 键盘的工作方式 对键盘的响应取决于键盘的工作方式,键盘的工作方式应根据实际应用系统中CPU的工作状况而定,其选取的原则是既要保证CPU能及时响应按键操作,又不要过多占用CPU的工作时间。通常,键盘的工作方式有三种,即编程扫描、定时扫描和中断扫描。 1. 编程扫描方式 编程扫描方式是利用CPU完成其它工作的空余时间,调用键盘扫描子程序来响应键盘输入的要求。在执行键功能程序时,CPU不再响应键输入要求,直到CPU重新扫描键盘为止。2. 定时扫描方式 定时扫描方式就是每隔一段时间对键盘扫描一次,它利用单片机内部的定时器产生一定时间(例如10 ms)的定时,当定时时间到就产生定时器溢出中断。CPU响应中断后对键盘进行扫描,并在有键按下时识别出该键,再执行该键的功能程序。 3. 中断扫描方式 采用上述两种键盘扫描方式时,无论是否按键,CPU都要定时扫描键盘,而单片机应用系统工作时,并非经常需要键盘输入,因此,CPU经常处于空扫描状态。 为提高CPU工作效率,可采用中断扫描工作方式。其工作过程如下:当无键按下时,CPU处理自己的工作,当有键按下时,产生中断请求,CPU转去执行键盘扫描子程序,并识别键号。10.4.5 实例分析实例分析 例10.5 如图10-13所示,编程实现4x4键盘,按“0”号键在数码管显示“0”,按“1”号键在数码管显示“1”,.,按“F”号键在数码管显示“F”。 分析: 在单片机应用系统中,键盘是人机对话不可缺少的组件之一。在按键比较少时,我们可以一个单片机I/O口接一个按键,但当按键需要很多,I/O资源又比较紧张时,使用矩阵式键盘无疑是最好的选择。 4x4矩阵键盘是运用得最多的键盘形式,也是单片机入门必需掌握的一种键盘识别技术,下面我们就以实例来说明一下4 x 4矩阵键盘的识别方法。如下图所示,我们把按键接成矩阵的形式,这样用8个I/O口就可以对16个按键进行识别了,节省了I/O口资源。重点掌握重点掌握 (1)我们的识别思路是这样的,初使化时我们先让P1口的低四位输出低电平,高四位输出高电平,即让P1口输出0xF0。 (2)扫描键盘的时候,我们读P1口,看P1是 否还为0xF0,如果仍为0xF0,则表示没有按键按下;如果不0xF0,我们先等待10ms左右,再读P1口,再次确认是否为0xF0,这是为了防止是 抖动干扰造成错误识别,如果不是那就说明是真的有按键按下了,我们就可以读键码来识别到底是哪一个键按下了。 (3)识别的过程是这样的,初使化时我们让P1口的低四位输出低电平,高四位输出高电平,确认了真的有按键按下时,我们首先读P1口的高四位,然后P1口输出 0x0F,即让P1口的低四位输出高电平,高四位输出低电平,然后读P1口的低四位,最后我们把高四位读到的值与低四位读到的值做或运算就得到了该按键的 键码。就可以知道是哪个键按下了。 (4)以0键为例,初使化时P1输出0xF0,当0键按下时,我们读高四位的状态应为1110,即P1为0xe0,然后让P1输出0x0F,读低四位产状态应为1110,即P1为0x0e,让两次读数相与得0xee。图图10-13 4*4键盘的数码管显示键盘的数码管显示程序如下:/* 4*4行列式键盘的C程序编写 */#include#include#include#define uchar unsigned char#define uint unsigned intuchar code Tab16= 0xC0,/*0*/ 0xF9,/*1*/ 0xA4,/*2*/ 0xB0,/*3*/ 0x99,/*4*/ 0x92,/*5*/ 0x82,/*6*/ 0xF8,/*7*/ 0x80,/*8*/ 0x90,/*9*/ 0x88,/*A*/ 0x83,/*b*/ 0xC6,/*C*/ 0xA1,/*d*/ 0x86,/*E*/ 0x8E,/*F*/;uchar idata com1,com2;void delay10ms() uchar i,j,k; for(i=5;i0;i-) for(j=4;j0;j-) for(k=248;k0;k-);uchar key_scan() uchar temp; uchar com;delay10ms(); /键盘抖动 P1=0xf0; /为再读P1口做准备 if(P1!=0xf0) /再判P1口,若为真表示有键按下 com1=P1&0xf0;/高4位保留,提取行信息;低4位屏蔽 P1=0x0f; /即让P1口的低四位输出高电平,高四位输出低电平,然后读P1口的低四位 com2=P1&0x0f;/低4位保留,提取列信息;高4位屏蔽 P1=0xf0;/重新把P1口设置为处始化状态,才可以再判键盘是否放开 while(P1!=0xf0); /若有键按下,则P1!=0xf0成立,则while(1),在此等待 /若无键按下,则P1!=0xf0不成立,则while(0),顺序执行下面的操作 temp=com1|com2; /行列合并,就是键值if(temp=0xee)com=0;if(temp=0xed)com=1;if(temp=0xeb)com=2;if(temp=0xe7)com=3; if(temp=0xde)com=4;if(temp=0xdd)com=5;if(temp=0xdb)com=6;if(temp=0xd7)com=7;if(temp=0xbe)com=8;if(temp=0xbd)com=9;if(temp=0xbb)com=10; if(temp=0xb7)com=11;if(temp=0x7e)com=12;if(temp=0x7d)com=13;if(temp=0x7b)com=14;if(temp=0x77)com=15;return(com);void main() uchar dat; while(1) P1=0xf0; /初使化;先让P1口的低四位输出低电平,高四位输出高电平, while(P1!=0xf0)/若P1不等于0xf0,则有键按下; dat=key_scan();/调用键值识别子函数,并把键值返回给dat P0=Tabdat; /查Tab数组,把字型送P0口做显示; 例10.6 如图10-14所示,编程实现4x4键盘,按“0”号键在数码管显示“0”,按“1”号键在数码管显示“1”,.,按“F”号键在数码管显示“F”。 分析:/*键盘程序,本程序涉及到外中断,定时器中断,比较复杂,需耐心学,帮助了解中断事件*/图图10-14 4*4键盘的数码管显示键盘的数码管显示(带中断带中断)程序如下:#include #include sbit SPK=P34;/SPK定义为P3口的第4位,就是驱动蜂鸣器的P3.4脚code unsigned char table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;/共阴数码管 0-9 a-f 表code unsigned char key_tab17=0xed,0x7e,0x7d,0x7b, 0xbe,0xbd,0xbb,0xde, 0xdd,0xdb,0x77,0xb7,0xee,0xd7,0xeb,0xe7,0XFF;/=此数组为键盘编码/本人采用类式类似电话按键的编码方式,方便以后设计/123a 0x01 0x02 0x03 0x0a/456b 对应16进制码: 0x04 0x05 0x06 0x0b/789e 0x07 0x08 0x09 0x0e/*0#f 0x0c 0x00 0x0e 0x0f/打个比方,如果你按下0键,P0口读到数据为0xed/如果你按下2键,P0口读到数据为0x7d,按下9键为0xdb,/将读到的P0口数据经过查表法就能得到相应的16进制码/键盘的读取,采用中断法,电路用一个4与门(74HC21)接入/中断口(INT0),利用中断来扫描键盘矩阵,读取数据 unsigned char l_tmpdate8=0,0,0,0,0,0,0,0; /定义数组变量unsigned char l_key=0x00; /定义变量,存放键值unsigned char l_keyold=0xff; /做为按键松开否的凭证void ReadKey(void); /扫描键盘 获取键值void delay();/延时子函数,5个空指令void display(unsigned char *lp,unsigned char lc);/数字的显示函数;lp为指向数组的地址,lc为显示的个数void main(void) /入口函数 EA=1;/首先开启总中断EX0=1; /开启外部中断 0IT0=1; /设置成下降沿触发方式P0=0xf0;/P0口高位输高电平,经过74HC21四输入与门,连接外中断0,有键按下调用中断函数while(1)display(&l_key,1);/输出获取的键值码void key_scan() interrupt 0 /外部中断 0 0的优先级最高EX0=0;/在读键盘期间,关闭中断,防止干扰带来的多次中断/为了消除抖动带来的干扰,在按下键后我们采用延时十多毫秒再读取键值 /如果采用循环语句来延时,比如(for,while.)会使CPU处理循环而占用/系统资源,所以这里我们采用定时器中断法,让定时器等待十多毫秒触发定时器/中断,这里用到定时器0TMOD=0x01;/设置定时器0为模式1方式,TH0=0xD1;/设置初值,为12毫秒TL0=0x20;ET0=1;/开启定时器中断0TR0=1;/启动定时器计数 void timer0_isr(void) interrupt 1/定时器0的中断函数TR0=0;/中断后,停止计数 ReadKey();/定时器计数12毫秒后产生中断,调用此函数,读取键值void ReadKey(void)/读键盘值unsigned char i,j,key;j=0xfe; /11111110Bkey=0xff;/设定初值for (i=0;i4;i+)P0=j;/P0口低4位循环输出0,扫描键盘if (P0&0xf0)!=0xf0) /如果有键按下,P0口高4位不会为1key=P0; /读取P0口,如果有键按下,而且为真才来到key=P0这里,读取P0数值后,通过break跳出break;j=_crol_(j,1);/此函数功能为左循环移位if (key=0xff) /如果读取不到P0口的值,比如是干扰,则不做键值处理,返回l_keyold=0xff;P0=0xf0;/恢复P0口,等待按键按下 EX0=1; /返回之前,开启外中断SPK=1;return; SPK=0; /有键按下,驱动蜂鸣器响if(l_keyold=key) /检测按键放开否,如果一样表明没放开,TH0=0xD1;/继续启动定时器,检测按键松开否TL0=0x20;TR0=1; return;TH0=0xD1;TL0=0x20;TR0=1;/继续启动定时器,检测按键松开否l_keyold=key;/获取键码做为放开的凭证for(i=0;i17;i+) /查表获得相应的16进制值存放l_key变量中if (key=key_tabi)l_key=i;break;/程序运行到这里,就表明有键值被读取存放于l_key变量中,主程序就可以检测此变量做相应外理,/此时回到主程序 void display(unsigned char *lp,unsigned char lc)/显示unsigned char i;/定义变量P2=0;/端口2为输出 P1=P1&0xF8;/将P1口的前3位输出0,对应74LS138译门输入脚,全0为第一位数码管for(i=0;ilc;i+) /循环显示 P2=tablelpi;/查表法得到要显示数字的数码段 delay();/延时5个空指令 if(i=7)/检测显示完8位否,完成直接退出,不让P1口再加1,否则进位影响到第四位数据 break; P2=0;/清0端口,准备显示下位 P1+;/下一位数码管void delay(void) /空5个指令 nop_();_nop_();_nop_();_nop_();_nop_(); 本章小结本章小结 发光二极管是半导体二极管的一种,可以把电能转化成光能;常简写为LED。发光二极管与普通二极管一样是由一个PN结组成,也具有单向导电性。发光二极管还可分为普通单色发光二极管、高亮度发光二极管、超高亮度发光 发光二极管二极管、变色发光二极管、闪烁发光二极管、电压控制型发光二极管、红外发光二极管和负阻发光二极管等。 数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按能显示多少个“8”可分为1位、2位、4位等等数码管。常用的LED显示器有LED状态显示器(俗称发光二极管)、LED七段显示器(俗称数码管)和LED十六段显示器。发光二极管可显示两种状态,用于系统状态显示;数码管用于数字显示;LED十六段显示器用于字符显示。 一个点阵可以还原为一系列平行的阵点行列(简称阵列),或一系列的平行的阵点平面(简称阵面)。可用由一组矢量所确定的坐标系来描述某一组特定的阵列或阵面族的取向。 按键按照结构原理可分为两类,一类是触点式开关按键,如机械式开关、导电橡胶式开关等;另一类是无触点式开关按键,如电气式按键,磁感应按键等。前者造价低,后者寿命长。目前,微机系统中最常见的是触点式开关按键。思考题及习题思考题及习题101. 简述数码管的结构和分类。2. 什么叫静态显示方式?有什么特点?3. 什么叫动态显示方式?有什么特点?4. 按键开关为什么有去抖动问题?如何消除?5. 键盘扫描控制方式有哪几种?各有什么优点缺点?13.3 13.3 基本单元制作基本单元制作(ISP(ISP烧写模式或烧写模式或USBUSB烧写模式烧写模式) ) 13.3.1 13.3.1 单片机基本单元制作单片机基本单元制作ISPISP烧写模式烧写模式(重点学习)(重点学习)(重点学习)(重点学习)1. 单片机基本单元制作ISP烧写模式电路图,如图13-24所示。图图13-24 单片机基本单元制作单片机基本单元制作ISP烧写模式烧写模式 2. 工作原理说明 RS-232C接口是EIA(美国电子工业协会)1969年修订RS-232C标准。RS-232C定义了数据终端设备(DTE)与数据通信设备(DCE)之间的物理接口标准。 1) 机械特性 RS-232C接口规定使用25针连接器,连接器的尺寸及每个插针的排列位置都有明确的定义。(阳头)2) 功能特性( (重点学习重点学习) )3. 元件清单 51单片机芯片及活动IC座各1个 MAX232芯片及IC座各1个 12MH晶振1个 电解电容10uF 1个 非极性瓷片电容30pF 2个 非极性瓷片电容104 5个 点触开关1个 自锁开关1个 发光LED灯1个 电阻500、10K各1个 带专用串口的万能板1块 母串口(DB9母) 1个 USB方口1个 带USB的方口电源线1条(建议网上购买) 带USB的公串口线1条(建议网上买专用)4. 源程序代码功能:一个灯在做秒闪烁 #include/头文件#define uint unsigned int/宏定义sbit led=P10;/声明单片机P1口的第一位void delay( );/声明延时子函数void main(void main( )/)/主函数主函数while(1)/大循环led=0;/点亮led灯delay();/调用延时函数led=1;/熄灭led灯delay();/调用延时函数 void delay(void delay( )/)/延延时时函数体函数体uint i,j;for(i=500;i0;i-)for(j=110;j0;j-);13.3.2 单片机基本单元制作单片机基本单元制作USB烧写模式烧写模式1. 单片机基本单元制作USB烧写模式电路图,如图13-24所示。 2. 工作原理说明 PL2303是Prolific公司生产的一种高度集成的RS232-USB接口转换器,可提供一个RS232全双工异步串行通信装置与USB功能接口便利联接的解决方案。该器件内置USB功能控制器、USB收发器、振荡器和带有全部调制解调器控制信号的UART,只需外接几只电容就可实现USB信号与RS232信号的转换,能够方便嵌入到手持设备。该器件作为USBRS232双向转换器,一方面从主机接收USB数据并将其转换为RS232信息流格式发送给外设;另一方面从RS232外设接收数据转换为USB数据格式传送回主机。 PL2303的高兼容驱动可在大多操作系统上模拟成传统COM端口,并允许基于COM端口应用可方便地转换成USB接口应用,通讯波特率高达6 Mbs。在工作模式和休眠模式时都具有功耗低,是嵌入式系统手持设备的理想选择。 该器件具有以下特征:完全兼容USBl1协议;可调节的35 V输出电压,满足3 V、33 V和5 V不同应用需求;支持完整的RS232接口,可编程设置的波特率:75 bs6 Mbs,并为外部串行接口提供电源;512字节可调的双向数据缓存;支持默认的ROM和外部EEPROM存储设备配置信息,具有I2C总线接口,支持从外部MODEM信号远程唤醒。 将PL2303的TXD(PINl)和RXD(PIN5)分别与单片机上的串口(TXD和RXD)连接,DM、DP与计算机的USB接口连接,再加上其他外围元件,就可实现单片机与计算机之间的通讯。PL2303支持默认ROM和外部EEPROM 2种不同的存储方法,可存储包括PID(Pinduct ID),VID(Vendor ID)和器件收发器控制和状态等信息,如果不希望采用默认的设置,则需外扩一个EEPROM(如ST公司的M24C02)。3. 元件清单 51单片机芯片及活动IC座各1个 PL2303芯片及IC座各1个 12MH晶振2个 电解电容10uF 1个 非极性瓷片电容30pF 4个 非极性瓷片电容104 5个 点触开关1个 自锁开关1个 发光LED灯1个 电阻若干 USB接口1个 USB线1条 万能板1块
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号