单片机C语言部分资料.docx

上传人:文*** 文档编号:68358259 上传时间:2022-12-27 格式:DOCX 页数:92 大小:805.80KB
返回 下载 相关 举报
单片机C语言部分资料.docx_第1页
第1页 / 共92页
单片机C语言部分资料.docx_第2页
第2页 / 共92页
点击查看更多>>
资源描述

《单片机C语言部分资料.docx》由会员分享,可在线阅读,更多相关《单片机C语言部分资料.docx(92页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第三章单片机C语言编程基础本章主要学习51单片机的外部引脚和内部结构等,叙述一下。本书任务驱动教学,引入案例有浅变深,循序渐进,给读者留下思考和发挥空间。3.1利用单片机的I/O 口驱动LED3.1.1利用单片机的P0.0端口驱动1只LED侬那R3K编程的目的,由延时函数决定,一、电路原m芝利用C语M控制单片机I/O端口按要求输卜甲IC STC89C51平形波脉J R2IK rLED1A s中信号,信号的周期LED2八大1此利用P0驱动负VI jurIl CY 12MHz 19 XT AL 1PO.O/ADOPO.I/ADI PO.2/AD2XTAL2PO.3/AD3P0.4/AD4 PO.5

2、/AD5 P0.6/AD6PO.7/AD7 RESETP2.WA8P2.I/A9P2.2/AIOWENP23/A1Iai pP2.4/A12”二P2.5/A13EAP2.6/A14P2.7/A15PIOP3.0/RXDPl.lP3.1/TXDPl.2P3.24PI.3P3.3/1NUPI.4P3.4/TOPl.5P3.5/T1Pl.6P3.6AVRPl.7P3.7/RD39加F-II 1 I 1RI 1K 1 I.STC-89C51单邱的P0口采缶疗1上拉出电疝,22载时有两种接法:口输出同电平时 STC-89C51端就制LED2的工作C脑加上拉暨31藕用1KC电阻接电源正极,此时P0做动有效

3、,在P0.7输出低电平时,题图3-3-1中的R3为限流电阻,限比LED品;另一种目熊入电流达20畦已流。3图3-1-1驱动LED电路原理单片机的最小系统包括晶体振荡电路,加电复位电路,同时要求单片机的31引脚正接高电平。时钟频率主要由晶体CY决定,Cl、C2为独石电容,用于微小调整单片机时钟的振荡频率;R1和C3组成加电复位电路,C3为电解电容器;整个电路由+5V电压供电。电路使用的元件参数见表3.1.1。表3.1.13-1-1电路元件表元件名称序号标称规格(封装,功率电压等参数)作用单片机ICSTC89C51DIP40核心芯片电容器30PF独石振荡电容器C230PF独石振荡电容器C310MF

4、点解电容器复位晶振CY12MHzS型振荡电阻R1IKfi1/4W,金属膜电容器C3放电电阻电阻R2IKfi1/4W,金属膜端口电位上拉电阻电阻R3IKfi1/4W,金属膜限流电阻发光二极管LED1中5红色高亮显示发光二极管LED205红色高亮显示二、程序设计1 .程序设计平台程序设计采用keil C软件,为了养成一个良好的文件管理习惯,建议:编程前,在计算机的某个硬盘分区下建立一个目录,目录的名字为你编写程序的主题,然后把keil C 产生的所有文件都放在该目录下。程序设计步骤如下:(1)运行keil C,创建一个项目。利用keil C菜单栏中project-new project创建,项目的

5、名字为你编程的主题,如本案例可以用“LED.uv2”或“一个LED闪烁实验.uv2”,存放目录为你的主题目录下;(2)创建建一个文件,然后以“.c”后缀名,文件存放在你的主题目录下;(3)把c文件添加在你的项目中,在project workspace窗口利用add file to group实现。如果软件界面不显示这个窗口,运行keil C菜单栏中的view-project window。(4)设置编译器,是编译过程中能生成“.hex”文件。默认文件名与主题名字相同。运行 project-option for target 1-output 窗口下点击 create HEX file。(5)在

6、编程区域写你的程序,结束后存储文件并编译,要做检查,尽量避免警告出现,直到程序编译无误为止。(6)程序烧写并试运行。这个过程称为软件和硬件联合调试,如果实验板无误,程序编译通过,但在硬件上运行不成功是常用的事情,需要对程序进行多次调试。在没有实验板的情况下,可以利用proteus软件仿真调试,也可以检验你的程序设计结果。2 .程序设计(1)利用P0.0口驱动LED闪烁,高电平有效#include包含头文件sbit LED = P0A。;LED 接 P0.0。在 kellC51软件中,定义 PO.O 为 POO,void delay(unsigned char x)unsigned char i

7、,j;for(i = 0;i x;i+)for(j = 0;j 200;j+);1void main(void)(While(l)(LED = 0;void dclay(lOO);LED= 1;void delay(100);)延时函数主函数/程序死循环/P0.0输出低电平,LED灭调用延时函数,延时段时间,约0.3秒,不精确/P0.0输出高电平,LED亮(2)利用P0.7端口驱动LED闪烁,低电平有效#includesbit LED = P0A7;void delay(unsigned char x)(unsigned char i,j;for(i = 0;ix;i+)for(j = 0;j

8、 1000;j+);)void main(void) while(l)包含头文件,程序为小5号字延时函数主函数LED =LED;/LED初始状态为灭,执行一次,LED改变一次状态void delay(lOO);延时段时间三、程序说明1 .应为使用的单片机芯片为STC89C51,因此程序开始处加入#include,文件reg51.h中包含了51芯片所有特殊功能寄存器的名称定义和相对应的地址值;2 .单片机程序单步顺序执行,先执行主函数,在主函数可以调用分函数,分函数可以调用分函数,但分函数不能调用主函数,程序执行一条命令再执行下一条,单片机等待的过程是执行了一个循环命令或一个浪费时间的程序,实际

9、执行过程永远不会结束。delay ()为函数延,单片机在执行此函数相关指令时占用的时间过长,在执行过程中,如果没有中断,单片机只能忙这一件事情。利用delay ()不能得到精确的延时。延时函数还可以利用下面的函数实现。void delay (unsigned int x)(while(x)x-;)/*/3 .利用位定义命令让LED等价于PO.O或P0.7,等于先sbit P0_0= P0A0,然后#defined LED P0_0,也在程序前面不做此类定义,在程序里面宜接写成P(T()=1或P0A0=0,先定义是为了增加程序的可读性。程序执行POP =1后,P0.0对以的单片机内部位寄存器就设

10、置为高电平,同时P0.0端口也输出高电平,单片机的所有I/O 口都可位未定义,也可以字节定义。4 .单片机C语言程序设计需要的C语言关键字不多,并且在keil C中用到的关键字是独有的,因此对于没有学习过C语言的人学习单片机C语言程序设计困难并不是很大,主要掌握单片机C语言书写格式,怎样用C语言控制单片机的硬件资源,另外在编程时,还要有清晰的逻辑思维头脑和认真实践,由浅逐步深入学习,当你坚持到最后时,单片机C 语言程序设计实际上很简单。VCC(+5V)R29 IK5 .每个人在编写程序时都有自己的风格。一般情况下,11sM工工工工业为0,其下每IC STC89C51条语句前留一个曲30曜闻廉数

11、个占名,XTALIr 3一个:*T伸隼手港有中文或英文PO.WADOXTAL2可读性。Rl IK幺 RESETPO.IZADI PO.2/AD2 PO.3/AD3 PO.4/AD4 PO.5/AD5 P0.6/AD6 PO.7/AD7朝当主工已于提高程序的层次感和3.1.2利用poqpj 8个i谭雪3 EA一、参考电隼C3 IOp信溜聂拓礴流水灯宽梁P2.2/AIO -22P2.3/AII -44.P2.4/A12 ng- ,P2.5/A13 WP2.WA14 VP2.7/A15 -2LED 1-8实验电路懈332所示,硬鹃P0 口的上拉电阻可以使用8个1K市P7 P4567留曜fcli.t,

12、P3.2/IKI0P3.3/INU 44P3.4/IO 4?P35/TIP3.6/WR 4P3.7/RD -12P0 口依次接入8个LED,图3-12流水灯电路在利用Proteus软件仿真时,可以用电阻排代替。单片机最小系统在单片机元件放置后已经默认,即Cl、C2、C3、CY、R1可以省略。其它元件选取见表3.1.2所示。表3.1.13-1-2电路Proteus软件元件表元件名称component总类 Category分类 Sub- Category结果 Results模型 Model type单片机Micoroprocessor IC8051 Family80C51电阻排ResistorRe

13、sistor PackRESPACK-8ANALOG发光二极管OptoelectronicsLEDsled-redDIGITAL二、参考程序#includevoid delay (void)(unsigned char i,j;for(i =0;i 255;i+) for(j =0;j 255j+);void main(void)(unsigned char j =0x01;while (1)j=j1;if(j =0x00) j =0x01;P0=j;delay();)三、程序说明1 .语句j=jL执行的目的是控制P0整个字节的数据在循环时左移变化,程序循环第一次,P0=0x02, P0.1连

14、接的LED亮,其它灭;循环第七次,P0.7连接的LED亮,其它灭;循环第八次,j =0x00, if语句条件满足,j=0x01, P0.0连接的LED亮,其它灭,然后依次变化下去。如果P0口驱动8个LED低电平有效,如下修该:/*/ void main(void)(unsigned charj = Oxfe;while (1)(j=(j1)10x01;if(j = Oxff) j = Oxfe;PO=j;delay();)2 . delay。函数无形参,延时时间不能设置。3.1.3利用P0口驱动一个数码管,显示0-9,并循环一、参考电路实验电路在单片机的最小系统基础上,P0口接一只共阳数码管,

15、见图3-1-3。带小数点的数码管是由8个LED组成,七个LED组成数字,另一只LED用来显示小数点。如果数码管内部的8只LED的正极接在一起,负极分别引出,引脚依次命名为a、b、c、d、e、f、 g和dot,称为带小数点的7段共阳极性数码管。vccP2.4/AI2P2.5/A13P2.6/AI4P2.7/AI5P3.Q/RXD P3.I/TXD P3.24nT()P3.3/INUP3.4/IOP3.5T1P3.6/WR P3.7/RD图3-1-3单片机驱动共阳数码管电路单片机的P0.0-P0.7分别接数码管的a-dot引脚,如果让数码管显示1,数码管b、c 段亮,程序控制P0输出Oxbe十六进

16、制编码即可,因此共阳数码管显示0-9十进制数字,需要利用10个显示码组成的数组。对于共阴数码管,也有相应的编码要求。小数点在不用时一般不让显示,高位端口 P0.7输出高电平即可。由于P0每个端口的灌电流达20mA,数码管每段LED正常显示5mA即可,因此需要 R29用来限制数码管每一段电流,以防止驱动电流过大而烧毁器件。利用Proteus软件仿真时,数码管采用 Optoelectronics 元件库中7-Segment Displays 下的7-SEG-COM-ANODE。二、参考程序/*/#include code unsigned char seven_seg10=0xc0,0xf?,0x

17、a4,0xb0,0x99,Ox92,Ox82,Oxf8,0x80,Ox90);/*时间延迟函数*/void delay (void)unsigned char i,j;for (i =0;i 255;i+) for (j =0;j =255;j+);void main (void)unsigned char i;/*变量i用来储存09*无穷循环*/while (1)for(i = 0; i10; i+)P0 = seven_segi;/*输出09到共阳七段显示器*/dclay();/*调用时间延迟函数delay*/三、程序说明1 .当程序中使用常量数据时,可以把数据存储在单片机的程序存储器中,

18、对此类数据声明时,前面需要加上关键字code或const,如本实验中的共阳数码管数字显示需要的编码,衣3-1-3是共阳数码管编码,表3-1-4是共阴数码管编码。单片机驱动液晶显示器显示的汉字也是一种常量数据。表3-1-3共阳数码管显示编码显示数字dotgfedcba16进制011000000OxcO111i110010xf92101001000xa4310110000OxbO410011000x995100100100x926100000100x827111110000xf88100000000x809100100000x90表314共阴数码管显示编码显示数字dotgfedcba16进制000

19、1111110x3f1000001100x062010110110x5b3010011110x4f40!001100x665011011010x6d6011111010x7d70000011I0x078011111110x7f9011011110x6f2 .本程序数码管显示使用了个for循环,让变量i依次由0递增到9,并将数字显示码送到P0,需要注意,seven_seg10有10各数据,seven_seg0为第一个数据,seven_seg9为第10个数据。数码管显示的数据变化时间由延时函数决定。for循环体嵌套在while循环体中,数码管回循环显示09,永不结束,除非电路断电。利用数码管也可以

20、显示日期和时间,在以后的程序设计案例中就可以学到。3.2单片机定时器/计数器应用3.2.1利用Timer。中断产生1秒延时,让数1个码管显示秒计数本案例主要目的是熟练掌握单片机内部TimerO或Timerl的编程控制方法,会利用 Timed)或Timerl中断精确定时。同时掌握数码管动态显示原理,学会6位数字显示的程序设计。本案例使用的电路为图3-1-3。一、程序设计#includecode unsigned char seven_seg10=(OxcO,Oxf9,Oxa4,OxbO,Ox99,Ox92,Ox82,Oxf8,0x80,Ox90);unsigned char cp,i;声明全局变

21、量void timerO_isr(void) interrupt 1/timerO中断服务函数iTR0=0;停止计数TL0=0xll;TL0重新预置TH0=0xee;TH0重新预置TR0=0;开始计数cp+;limert)中断1次,变量cp加1if(cp =200)中断200次,时间刚好为1秒(cp = O;i+;if(i =10)i =0;P0= seven_segiP0输出显示数据void timerO_in itialize( void) f/ timerO中断初始化函数EA =0;设置中断允许寄存器IE中的EA位,关闭中断总开关TMOD =0x01;设置计时器模式控制寄存器,Time。

22、工作在定时方式1TR0=0;设置计时器控制寄存器TCON寄存器的TR0位为0, TimerO停止计数TLO = Ox 1TH0=0xee;TimerO的16位计数器初始值为Oxee,12MHz晶体振频率,单片机的机器周期为1微妙,TimerO每1微秒加1计数,加满溢出变产生中断,从计数到中断刚好为5亳秒PT0=1;设置中断优先次序寄存器IP中的PT0位,Timert)中断优先ET0=1;设置中断允许寄存器IE中ET0的位,开启中断小开关EA=1;打开中断总开关TR0=1;/开始计数void main (void)timerO_initialize()/timerO初始化,为中断做好准备whil

23、e (1);等待中断/* I二、程序说明1 .中断服务函数名中,interruput为关键字,1为timed)中断号。在reg51.h头文件中已经定义,表3.2.1为单片机常用中断的中断号。在使用中断服务函数时,直接在名后加 interruput和中断号即可。表3.2.1 reg51.h中单片机常用中断号定义中断源中断触发原因中断号INTO外部INTO引脚有低电平或下降沿信号输入0TimerOTimerO计数溢出1INTI外部INTO引脚有低电平或卜.降沿信号输入2TimerlTime”计数溢出3串行中断串口缓存SBUF写入数据或读出数据42 . timer。可以用作计数,也可以用来定时,由由

24、TMOD寄存器中C厅为决定,作为计数器使用时,接受单片机外部引脚P3.4输入的脉冲加计数;作为定时器使用时,接受单片机内部的机器周期脉冲。如果单片机的振荡频率为,振荡周期为则机器周期为 r =12/f。本案例中f =12MHz,则7=1微秒,timerO工作在模式1为16为加计数器,当计数器初始值为Oxeel 1时,则从开始计数到产生中断需要的时间为Oxffff Oxeel 1个微秒,刚好为5000微秒,也即5毫秒。本案例timerO的初装也可以利用下面语句完成:#defined TEMORO_COUNT Oxeel ITLO = TEMORO_COUNT & OxOOff;/取 TEMORO

25、_COUNT 的低字节并装入 TLOTHO = TEMORO_COUNT8; TEMORO_COUNT 左移8位,并将低字节装入 TEMORO_COUNT利用定时器/计数器定时时,需要现设置工作模式,并计算它的初装值,计算初装值不好计算,常利用计算机中的计算器工具辅助。timed)工作在模式1可以最大65535微秒中断1次,如工作模式2,最大256微秒中断1次。3 .当程序中只涉及一个中断时,可以不对中断的优先级进行设置,因此在本案例中语句 PTO=1可以省略。程序中有多个中断但没有进行优先级设定的情况下,单片机中断优先级默认按终端号递增向依次降低。4 .数码管显示语句放在了 timed)中断

26、服务函数里面,由于5毫秒中断1次,因此数码管显示的数据会每5亳秒更新1次。1秒内更新200次,更新过程是把原来的数据覆盖,但显示数据1秒内变化1次。3.2.2利用4个数码管,实现秒信号加计数一、电路原理图3-2-1所示的电路中,4位七段数码管采用4只单个数码管组成,可以显示00009999,数据输入端并联后接P0口,位选即每个数码管的阳极分别接P2口,中间加非门驱动。因为P2口反相驱动,因此,如果千位数码管显示,P2.7输出低电平,P2的其它端口输出高电C230P r rRl IK1Ci-T18XTAL2RESETPO.2/AD2PO.3/AD3P0.4/AD4PO.5/AD5P0.6/AD6

27、PO.7/AD7of.y.y.y.Hb-C3 l()p3()31平,并且此时PO输出十位7SEG-海X4-CA,非门球电阻R29是限流电阻。才-X二、程序设计PSEN ALEEA.0,1,3,4.5.6,7P2.O/A8P2.I/A9P2.2/AIOP2.3/AIIP2.4/AI2P2.5/AI3P2.6/AI4P2.7/AI5P3.0/RXD P3.I/TXD P3.2/1NTO P3.3/jNTjP3.4/H)P3.5/TIP3.6/WRP3.7/RD27诬USCjJ欠,:伤帜时,甯类型品ZCZJii,.I.NOT1NOT2V阮+eg使用NOT3 XNOT4心& Inverters图3-2

28、-14位七段数码管显示#include#defined unsigned char uchar#defined unsigned int uintcode uchar seven_seg10=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90|;code uchar seg_scan4=0xef,0xdf,0xbf,0x7f);uchar counter4=0,0,0,0);uint cpj;void timerO_isr(void) interrupt 1(uchar j;TR0=0;TL0=0xll;TH0= Oxee;TR0=0;cp+;i

29、f(cp =200)cp = O;counter0+;)if(counler0=10)if(counter1=10)if(counter2=10)各个数码管对应的位选数据个位、十位、百位和千位数/timerO中断服务函数停止计数TL0重新预置TH0重新预置开始计数timed)中断1次,变量cp加1中断200次,时间刚好为1秒个位数,1秒加1counter|()=0; counter1+;)counlerl=0; counter2+:)counter2=0; counter3+;Jif(counter3=10) counter3=0;的74HC04oPO输出数据编码PO = seven_segc

30、ounterj;P2= seg_scan|j;/P2输出位选信号j+;if(j=4)j=0;void timerO_initialize(void)/ timerO 中断初始化函数(EA =0;TMOD =0x01;TR0=0;TL0=0xll;THO = Oxee;PTO=1;ET0=1;EA=1;TR0=1;)void main (void)(timerO_initialize()while (1);三、程序说明1 . imerO第1次中断,j =0,显示个位,显示5毫秒后,timerO第2次中断,j =1,显示十位,以后随着中断依次显示百位和千位,最后重新显示个位,每位显示停留的时间为5

31、毫秒。中断4次才能让4为依次扫描显示完,占用的时间为20毫秒,1秒钟内,4位数码管扫描显示50遍,根据人眼视觉暂留特点,你看到的结果是4位数据同时显示,这种显示方法为动态扫描显示.2 .变量j =0时,counter0是个位十进制数,执行P0= seven_segcounter,PO U输出个位显示数据编砾数码管的位选信号只利用了 P2的高4位,执行P2= seg_scan0, P2=0xef,经过非门反相,加在数码管上的位选信号只有个位是高电平,此时只显示个位。3 .数组counter0也可以用1个变量代替,在显示时需做下面处理uint x;P0 = seven_segx/1000;P2 =

32、 seg_scan3;P0 = seven_segx% 1000/100;P2 = seg_scan2;P0 = seven_segx%1000% 100/10;P2 = seg_scanl;P0 = seven_segx% 1000% 100% 10;P2 = seg_scan0;P0输出千位数据编码千位数码管共阳极设置为高电平P0输出百位数据编码千位数码管共阳极设置为高电平P0输出十位数据编码千位数码管共阳极设置为高电平/ P0输出千位数据编码千位数码管共阳极设置为高电平4 .思考题(1)要让数内管在电路加电开始就显示1230,怎样更改有关数据?(2)为什么不用P2口直接驱动数码管?(3)

33、本案例如果200微秒中断1次,也可以实现1定时,显示结果会怎样?3.2.3设计一个6位数码管时间显示程序本案例使用6位数码管显示时间,能显示时/分/秒,显示格式是00.00.00到23.59.59。其中小时和分钟之间的小数点常亮,分钟和秒之间的小数点进行秒闪烁。一、参考电路二、参考程序/*/#include#defincd unsigned char ucharcode uchar seven_seg10=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x901;code uchar seg_scan6=Oxfb,Oxf7,Oxef,Oxdf,Obf

34、,Ox7f;各个数码管小j应的位选数据uchar counter3=0,0,0);时位、分位和秒位uchar tick,cp,ij;/tick:秒信号,cp:中断次数累计 void dispaly(void)uchard;d = d * tick;d = dl Ox7f;/d的值1秒内改变1次,要么0x00,要么Oxff/d的值1秒内改变1次,要么0x7f,要么Oxffswich(i)(case 0: P0= seven_segcounter0%10; break;case 1: P0= seven_segcounter0/10; break;case 2 : P0= d & seven_se

35、gcounter0%10; break;case 3 : PO = seven_segcounter0/10; break;显示秒个位显示秒十位数据高8位1秒改变1次,数点秒闪烁显示分H立实现小case 4: P0= Ox7f & seven_segcounter0%10; break;显示数据高8位为低电平,小数点常亮case 5: P0= seven_segcounter0/10; break;显示时十位)break;P2= seg_scani;i+;if(i =6) i =0;1void timerO_isr(void) interrupt 1(TR0=0;TL0=0xll;TH0= O

36、xee;TR0=0;cp+;if(cp =100)cp =0;tick =-tick;/ timerO中断服务函数停止计数TL0重新预置TH0重新预置开始计数 timed)中断1次,变量cp加1中断100次,时间刚好为0.5秒秒脉冲信号刚好1秒if(i =2)j = o;counter0+;个位数,1秒加1)if(counler0=60)counter|0=0; counterl+;if(counter1=60)counler1=0; counter2+:)if(counter2=24) counter2=0;displayO;)void timer0_initialize(void)/ ti

37、merO 中断初始化函数(EA =0;TMOD =0x01;TR0=0;TL0=0xll;TH0= Oxee;PT0=1;ET0=1;EA=1;TR0=1;)void main (void) timerO初始化,为中断做好准备(timerO_initialize()while (1);/*/三、程序说明1 .利用counter、counterl和counter变量分别表示时、分和秒位的数值大小,也可以利用结构体定义这些变量,如:typcdef structIucar hour;ucar min;ucar sec;time;time now;/now是数据类型为time的变量/*/然后就可以用

38、now.hour, now.min和 now.sec分别代替counter2、counter和counter0.变量2 .执行limerO中断服务函数时调用了 dispaly()函数,直接把dispaly。的函数体程序写在中断函数体内也行,但中断服务函数会显得臃肿。timed)每5毫秒中断1次,调用dispalyO 函数执行1次,在执行dispalyQ过程中,当i =0时,只显示秒个位,当i = l时,只显示秒十位,依次类推。为了让小时的个位小数点常亮,让小时个位显示时,把显示编码数据的高8位设置为0;为了分个位小数点秒闪烁,把分个位小数点位设置一个周期变化的量即可。3 .程序与复杂,使用的变

39、量就愈多,在程序分析和设计时,需要注意使用的变量最好使用有一定含义的字符表示。3.3键盘程序设计按键是一种开关,通过外界作用力,导电金属或导电非金属接触与分离实现电路通断的控制是按健的基本机械原理,如计算机健盘、手机、MP3以及电子表按键。按键是计算机系统输入设备,也是人机信息交换的主要途径。按键按下会产生抖动现象,不能安全有效的对系统控制,本节根据按键产生的抖动机理,提出以中断、延时等措施消除键盘输入过程中的不稳定因素,实现单片机系统键盘的稳定输入。3.3.1 键盘抖动现象按键按下都会发出一声响,谁然仃的按键声音很轻微,但这都是导体碰撞产生的震动。这种现象称为键盘抖动。如果不对键盘的抖动进行

40、处理,按键会对系统电路或程序产生意外的干扰。为了观察按键的抖动现象,我们先做一个小实验,分析一下一个微触按键产生抖动对系统的影响。图3-3-1加数计数小系统图3-3-2加数计数小系统在图3-3-1所示的一个加数计数小系统中,设计数器的脉冲输入端CP为上升沿有效,加计数器初始显示为0。按键不按时,CP =0,计数器不加1计数。一般认为:按键按下, CP端由低电平变为高电平,含有电平上升沿,计数器加1计数,并且按下1次,计数器加 k实际实验时会发现,按键按下1次,计数器不是加1,而是跳跃一次性增加3或4。原因是按键按下在导体接触的瞬间产生了震动。图3-3-2是按键按下过程中CP端实际电平改变情况。T1为不按按键时刻,T2为按键按下瞬间的抖动,T3为按键按下稳定时刻,T4为按键放开时刻瞬间,T5为按键放开时刻。从图中可以了解到,按键按下的瞬间由于震动会是按键内部的导体稳定接触,而是在导通和不导通之间来回弹跳,虽然时间一瞬间,但使CP 端获得了多个电平的上升沿。按键抖动时间的长短由按键的机械特性决定,一般为5ms-10ms。因此不能直在数字电路卜单片机的I/O 上3.3.2利用外金本案列利用外务程序,在中断典一、参考电路在最小系统或VCvc(:接把按键作为1个脉冲的输入。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁