版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一、学习目标1.掌握LED数码管结构。2.掌握数码管字形编码。3.掌握数码管静态显示。4.掌握数码管动态显示。二、学习任务本项目任务分解为具体3个学习任务:任务1独立按键识别检测任务2一位数码显示任务3两位数码显示任务4手动计数器实现三、任务分解任务一独立按键识别检测【任务描述】
单片机系统运行时,通常需要应用输入设备实现人工参与控制。键盘是由若干个按键组成的,是单片机最简单也是最常用的输入设备。操作人员通过键盘输入数据或命令,实现简单的人机对话。本任务要求设计1个独立按键,单按下改键时,对应的LED亮,再一次按下,LED熄灭,如此重复。【任务分析】
当按键被按下时,电平被拉成低电平,此电平作为作为单片机的输入,单片机接收到低电平时,认为产生了按键动作,执行相应的程序。【相关知识】一、按键识别当单片机检测到与按键相连的IO口被拉低就证明此按键被按下,那门我们将此功能上一个层次来说呢,按键就是一个人机接口。那么按键的操作并没有我们想象的“按下松开”那么简单,在实际应用中,手动操作需要消抖。按下并抬起按键的过程可以分为5个阶段:(5)有效释放阶段(4)释放抖动阶段(3)有效闭合阶段(2)闭合抖动阶段(1)等待阶段(4)释放抖动阶段(3)有效闭合阶段(4)释放抖动阶段常用的去抖动的方法--硬件方法和软件方法: (1)硬件去抖动的方法很多,也可以通过硬件防抖动来解决,这样成本会高一些。 (2)软件去抖动法,通常用延时程序去抖动。
延时读键法:在单片机获得端口为低电平的信息后,不是立即认定按键已被按下,而是延时10毫秒或更长的时间后再次检测该端口,如果仍为低,说明此键的确被按下了,这实际上是避开了按键按下时的抖动时间。如左上图所示,当电源很稳定,没有干扰的情况下,这种方法是可靠的。如右上图所示,当电源不稳定,存在很大干扰时,则有可能存在误判。
多次读键法:在单片机获得端口为低电平的信息后,在一段时间内如20毫秒,多次检测按键的状态,只有当每次读到的状态都是低电平时才认为有按键按下,如上图所示。用这种方法,不会存在误判的情况。有一点必须注意,多次检测持续的时间应该比闭合抖动的时间长。
本项目任务中,主要用软件方法去抖,即检测出键闭合后执行一个延时程序,产生10ms的延时,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。当检测到按键释放后,也要给10ms的延时,待后沿抖动消失后才能转入该键的处理程序。【任务实施】在proteus中绘制如图电路:任务2一位数码显示【任务描述】P2口驱动一位共阴数码管,如图所示,显示出一个数字‘5’。【任务分析】需要单片机驱动数码管,那么需要掌握数码管的硬件知识,数码管的驱动方法。【相关知识】一、LED数码管原理简述
单片机应用系统常用的是8段LED,如下图2-8所示,它有其阴极和共阳极两种。共阴极数码管是将所有发光二极管的阴极接在一起作为公共端COM,当公共端接低电平时,某一段阳极上的电平为“1”时,该段点亮,电平为“0”时,该段熄灭。共阴极数码管是将所有发光二极管的阴极接在一起作为公共端COM,当公共端接低电平时,某一段阳极上的电平为“1”时,该段点亮,电平为“0”时,该段熄灭。例:共阴极数码管显示数字“2”:17第七章单片机外部扩展资源及应用abcdefghGND+-共阴极数码管abcdefgh11011010a段码:01011011(5BH)+5Vabcdefgh+-共阳极数码管00100101段码:10100100(A4H)LED数码显示器的显示字符及码表18第七章单片机外部扩展资源及应用
数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出我们要的数字,因此根据数码管的驱动方式的不同,可以分为静态式和动态式两类。本任务介绍静态显示示驱动。静态驱动也称直流驱动。静态驱动是指每个数码管的每一个段码都由一个单片机的I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O端口多,如驱动5个数码管静态显示则需要5×8=40根I/O端口来驱动,要知道一个89C51单片机可用的I/O端口才32个,实际应用时必须增加译码驱动器进行驱动,增加了硬件电路的复杂性。这里给出了单片机实际中驱动数码管的电路,是加了三极管的。由于单片机I/O口驱动能力不够,不能直接将段选端接单片机I/O口,因此在电路中增加三级管用作驱动,以增加IO口的电流驱动能力。LED数码显示器的结构与原理1位LED数码显示器的引脚结构市售的LED数码管尺寸、颜色多样,常见1位LED数码管有10个引脚,排列如下:21第七章单片机外部扩展资源及应用其中3脚、8脚为公共端(位选端),根据内部发光二极管的接线形式可分为共阴极(CommonCathode,CC)和共阳极(CommonAnode,CA)两种类型。LED数码显示器的结构与原理1位共阴LED数码显示器的接口电路22第七章单片机外部扩展资源及应用若直接用单片机I/O口驱动LED,则LED的电流由单片机I/O口提供,由于80C51单片机I/O口(P1、P2和P3口)输出场效应管的内部上拉电阻很大,约有几百K,因此输出电流很小,一般不超过1mA,基本无法驱动LED发光。LED数码显示器的结构与原理1位共阴LED数码显示器的接口电路23第七章单片机外部扩展资源及应用I/O口输出高电平时,LED发光,其电流由VCC提供,R为限流电阻,阻值一般为几百欧;I/O口输出低电平时,LED熄灭,R上通过的电流大于LED发光时的电流,且该电流流入单片机引脚。单片机允许向全部引脚灌入的最大总电流为有限的,一般为几十毫安,一旦单片机的I/O口通过上拉电阻驱动较多的LED(如数码管),当单片机I/O口都输出低电平时,向引脚灌入的总电流可能超过上限值,导致单片机工作不稳定。LED数码显示器的结构与原理1位共阴LED数码显示器的接口电路24第七章单片机外部扩展资源及应用11三极管导通0LED灭LED数码显示器的结构与原理1位共阴LED数码显示器的接口电路25第七章单片机外部扩展资源及应用00三极管截止1LED亮这种接口电路在单片机输出低电平时,利用三极管的截止,防止电流灌入单片机I/O引脚。同时,也增强了对LED的驱动能力。【任务实施】在proteus按下图绘制电路。#include<reg51.h>voiddelay1s();//采用实现1秒延时子函数voidmain() //主函数
{while(1){P2=0x6d;//5的共阴极段码
delay1s();}}voiddelay1s(void){ unsignedcharh,i,j,k;for(h=5;h>0;h--)for(i=4;i>0;i--)for(j=116;j>0;j--)for(k=214;k>0;k--);}【进阶提高】使用AT89C51单片机,驱动一位数码管。如图,P1口驱动共阳数码管,让该数码管轮流显示‘H’、‘E’、‘L’、‘L’、‘O’。#include<reg51.h>voiddelay1s(unsignedintms);//采用定时器1实现1秒延时子函数voiddisp1();//顺序显示字符‘H’、‘E’、‘L’、‘L’、‘O’一次的子函数voidmain() //主函数{while(1){disp1();}}//函数名:disp1//函数功能:顺序显示字符‘H’、‘E’、‘L’、‘L’、‘O’一次//形式参数:无//返回值:无voiddisp1(){unsignedcharled[]={0x89,0x86,0xc7,0xc7,0xc0};//定义数组led存放字符‘H’、‘E’、‘L’、‘L’、‘O’的字型码unsignedchari;for(i=0;i<5;i++){P1=led[i];//字型显示码送段控制口P1delay1s(1000); //延时1秒}}voiddelay1s(unsignedintms)//若ms=1,延时时间就为1ms{unsignedinta,b;for(a=ms;a>0;a--)for(b=123;b>0;b--);}
任务36位数码显示【任务描述】用单片机驱动数码管动态显示方法,在数码管上同时显示出1~6。【任务分析】
动态显示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。动态显示的亮度比静态显示要差一些,所以在选择限流电阻时应略小于静态显示电路中的。
下面借用下,前面数字电路BCD数码管显示原理。4位数码管共用一个译码器。当CP脉冲的频率f=1HZ时,在CP脉冲的控制下,4位数码管将逐个轮流分时显示。但是,当CP脉冲的频率f=100HZ时,则每个数码管依次一次显示1/25S,由于人眼的滞留特性,实际的视觉效果是4个数码管同时显示4个数据。显示原理f=1HZf=100HZ(人眼的滞留特性)显示原理工作原理①4位数码管共用一个7448BCD译码器。②74139为两输入4输出译码器。③74139的输出信号Y0、Y1、Y2、Y3,分别作为4位数码管的位线。工作原理下面通过单片机驱动两位数码管进一步说明:某系统用单片机的I/O口控制两个共阴极接法的LED显示器。试编写应用程序使得在LED显示器上显示“HP”两个字符。#include"reg51.h"#defineucharunsignedchar#defineuintunsignedintvoiddelayms(uintt)//延时程序{uinti,j;for(i=0;i<t;i++)for(j=0;j<120;j++);}main(){while(1) { P0=0x89;//H的段码
P2=0x01;//第一个数码管显示
delayms(10);P2=0X00;//清消隐
P0=0x8c;//P的段码
P2=0x02;//第二个数码管显示
delayms(10);P2=0x00;//清消隐
}}【任务实施】74LS245是什么器件?它是8路同相三态双向总线收发器或驱动器当片选端/CE=0,AB/BA=“1”,信号由A向B传输
程序代码:#include<reg51.h>#defineuintunsignedintvoiddelayms(unsignedintxms){ uinti,j; for(i=xms;i>0;i--) for(j=120;j>0;j--);}voiddisp2(){unsignedcharled[]={0xf9,0Xa4,0xb0,0x99,0x92,0x82};//设置数字“123456”的字unsignedchari,w;w=0x01; //位选码初值为01Hfor(i=0;i<6;i++){P2=~w;//位选码取反后送位控制口P2口
w<<=1; //位选码左移一位,选中下一位LEDP1=led[i];//显示字型码送P1口
delayms(9); //延时10ms P1=0XFF;//必须加这句,清消隐
}}main() //主函数{while(1){disp2();}}【进阶提高】使用移位函数实现6位数码管的动态显示。单片机驱动8位数码管显示电路对应的程序代码如下:#include<reg52.h>#include<intrins.h>#defineucharunsignedchar//宏定义uchar替换unsignedchar型ucharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,//定义0,1,2……9,a,b,c,d,e,f字符编码数组0x82,0xd8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};voiddelay(intz);//延时函数声明
voidmain(){inti;P2=0xfe;//开段选,打开第一位数码管
while(1)//进入大循环,开始动态扫描
{for(i=0;i<8;i++)//依次扫描8位数码管
{P1=table[i+1];//给段选端P0送字型码
delay(5000);P2=_crol_(P2,1);//循环右移
}}}/*定义延时函数*/voiddelay(intz){intx,y;for(x=z;x>0;x--)for(y=50;y>0;y--);}任务四手动计数器实现【任务描述】单片机P3.2引脚接一按键,最开始显示全0,按下一次按键加1,把加的和用8位数码管显示出来。【任务分析】按键按下后,执行加1操作,把该和送数码管显示之前,分离出个位、十位、百位......等。假若这个和是n,可以用下面代码分离出个位、十位、百位。
i=n/100;/*分解出百位*/;
j=n/10%10;/*分解出十位*/;
k=n%10;/*分解出个位*/。【相关知识】状态机是软件编程中的一个重要概念。比这个概念更重要的是对它的灵活应用。在一个思路清晰而且高效的程序中,必然有状态机的身影浮现。比如说一个按键命令解析程序,就可以被看做状态机:本来在A状态下,触发一个按键后切换到了B状态;再触发另一个键后切换到C状态,或者返回到A状态。这就是最简单的按键状态机例子。实际的按键解析程序会比这更复杂些,但这不影响我们对状态机的认识。1.状态机的要素状态机可归纳为4个要素,即现态、条件、动作、次态。这样的归纳,主要是出于对状态机的内在因果关系的考虑。“现态”和“条件”是因,“动作”和“次态”是果。详解如下:(1)现态:是指当前所处的状态。(2)条件:又称为“事件”。当一个条件被满足,将会触发一个动作,或者执行一次状态的迁移。(3)动作:条件满足后执行的动作。动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。动作不是必需的,当条件满足后,也可以不执行任何动作,直接迁移到新状态。(4)次态:条件满足后要迁往的新状态。“次态”是相对于“现态”而言的,“次态”一旦被激活,就转变成新的“现态”了。如果我们进一步归纳,把“现态”和“次态”统一起来,而把“动作”忽略(降格处理),则只剩下两个最关键的要素,即:状态、迁移条件。【任务实施】手动计数器任务对应的程序代码如下:#include<reg52.h>#defineucharunsignedchar#defineuintunsignedintsbitkeyport=P3^2;#definekeystate00 //按键第一次按下状态#definekeystate11 //按键按下确认状态#definekeystate22charkeystate=2; //按键状态初始化为按键无动作状态uintnum1=0,num2=0;ucharweixuan[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//位选代码uchartemp[8]=0; //从高位到低位对应数码管从左到右voiddelayms(uintx) //1ms{ uinty,z; for(y=x;y>0;y--) for(z=111;z>0;z--);}ucharcodetable[]={ //共阳数码管0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};voidsmg(){uchari;for(i=0;i<8;i++){P2=weixuan[i];P1=table[temp[i]];delayms(1);P2=0xff;}}voidproc()//分离出万位、千位、百位、十位以及个位等待显示{ temp[0]=num1%10; temp[1]=num1%100/10; temp[2]=num1%1000/100; temp[3]=num1/1000; temp[4]=num2%10; temp[5]=num2%100/10; temp[6]=num2%1000/100; temp[7]=num2/1000;}charkeyscan(){ switch(keystate) { casekeystate0: //keystate0,第一次检测到按键按下状态,下一状态为keystate1(按键按下确认状态) keystate=keystate1; return0; casekeystate1: //keystate1,按键按下确认状态,下一状态为keystate2(按键无动作状态)if(!keyport)
{ keystate=keystate2; while(!keyport); return1; } else keystate=keystate2; return0; casekeystate2: //keystate2,按键无动作状态,下一状态为keystate0(第一次检测到按键按下状态)if(!keyport) { keystate=keystate0; } else keystate=keystate2; return0; }}voidmain(){while(1) { if(keyscan())
{ num1++; if(num1>=10000) { num1=0; num2++; if(num2>=10000) { num2=0; } } proc(); } smg();
}}【进阶提高】单片机P3.2引脚接一按键,功能为加1按键,点一下加1;单片机P3.3引脚接一按键,功能为减一按键,点一下减1,在前面任务基础上,请用状态机编程的方法实现点加1按键实现加1,点减1按钮实现减1。
状态机实现手动计数器电路对应的程序代码如下:#include<reg52.h>#defineucharunsignedchar#defineuintunsignedint#defineKEYP3#definekeystate00 //按键无动作状态 #definekeystate11 //按键按下状态 #definekeystate22 //按键释放状态charucKeyStatus=0; //按键状态初始化为按键无动作状态unsignedcharkeyvalue;uintnum1=0,num2=0;ucharweixuan[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};uchartemp[8]=0; //从高位到低位对应数码管从左到右voiddelayms(uintx) //1ms{ uinty,z; for(y=x;y>0;y--) for(z=111;z>0;z--);}ucharcodetable[]={ //共阳数码管0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};voidsmg(){uchari;for(i=0;i<8;i++){P2=weixuan[i]; //位选
P1=table[temp[i]]; //送段码
delayms(1);P2=0xff;//消隐
}}voidproc()//待显示数据的分离{ temp[0]=num1%10; temp[1]=num1%100/10; temp[2]=num1%1000/100; temp[3]=num1/1000; temp[4]=num2%10;temp[5]=num2%100/10; temp[6]=num2%1000/100; temp[7]=num2/1000;}ucharkeyscan() //按键扫描程序{switch(ucKeyStatus)//
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024知名大学与科研机构联合培养研究生协议
- 2025年度企业财务内部控制与合规审计合同范本3篇
- 专用购销交易2024版协议格式版A版
- 二零二四商标授权及知识产权跨界合作合同3篇
- 万科物业2024停车场运营管理协议
- 2024年谈蕾离婚后财产与子女抚养协议书3篇
- 个性化小额资金借贷款项协议范本一
- 二零二四卫生院卫生间改造与装修施工合同3篇
- 2025产学研科技成果转化合同:生物科技产业合作框架4篇
- 2024路灯购销安装合同范本
- SQL Server 2000在医院收费审计的运用
- 《FANUC-Oi数控铣床加工中心编程技巧与实例》教学课件(全)
- 微信小程序运营方案课件
- 抖音品牌视觉识别手册
- 陈皮水溶性总生物碱的升血压作用量-效关系及药动学研究
- 安全施工专项方案报审表
- 学习解读2022年新制定的《市场主体登记管理条例实施细则》PPT汇报演示
- 好氧废水系统调试、验收、运行、维护手册
- 中石化ERP系统操作手册
- 五年级上册口算+脱式计算+竖式计算+方程
- 气体管道安全管理规程
评论
0/150
提交评论