任务238位流水灯_第1页
任务238位流水灯_第2页
任务238位流水灯_第3页
任务238位流水灯_第4页
任务238位流水灯_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

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

文档简介

1、2.3 8位流水灯任务三 8位流水灯2.3.1 任务内容 流水灯在我们的日照生活中有着非常多的应用,如广告牌的设计和节日彩灯的设计都用到它的原理。本节的任务是把开发板上的8个发光二极管依次点亮。另外一IO口接外部电平,高电平时流水灯从左向右依次点亮,低电平时流水灯从右向左依次点亮。2.3.2 知识准备1、单片机IO的构造在上一单元中发光二极管闪烁的实例中,I/O控制小灯闪烁,只需在Keil中对I/O写0、和写1就可以了,使用起来非常简单。但是在实际应用中如果不了解I/O的特点,设计的电路存在缺陷,I/O应用起来未必会得心应手。初学者不必深究I/O控制原理,但至少得弄明白几个基本的概念,这对后期

2、学习高档单片机也很有帮助。在I/O构造电路中,有三极管(实际上是MOS管)、锁存器等,我们先来学习一下这两个基本器件的特点。(1) 三极管在I/O构造电路中,有一个器件是MOS管,I/O能对外输出高低电平全依赖MOS管的导通与否。MOS管和三极管在外特性很相像,由于我们更熟悉三极管,所以这里讲解三极管。三极管是模拟电路和数字电路的基石。在模拟电路中,三极管主要用于放大弱信号。在数字电路中,三极管更多作为开关管来使用。三极管的基本结构是两个反向联结的的PN接面,如图所示,有NPN和PNP两种组合。三个接出来的端点依次被称为发射极(E)、基极(B)和集电极(C)。图中也显示了NPN和PNP三极管的

3、电路符号,射极被特别标出,箭头由外指向内的是NPN,由内指向外的是PNP。 PNP三极管 NPN三极管图2.3.1 PNP三极管和NPN三极管NPN三极管电流由基极和集电极流入,发射极流出;而PNP三极管则相反,从发射极流进,从基极和集电极流出。不管是NPN三极管还是PNP三极管,都满足这样几个特性:三个极之间的电流的关系为:流进的=流出的,即IB+IC=IE。:Ic大小跟Ib有关:Ib为0,则Ic也为0;Ib从0开始增大,Ic也跟着增大,而且在这一过程中,Ic=Ib,其中 为放大倍数,不同三极管 不一样,从几十到几百倍;当Ic的值到了极限时,Ib再增大,Ic也不再跟着增大了。:基极和发射极之

4、间可以等效成一个二极管,要获得基极电流,基极电压要高于发射极电压0.60.7V,而且一旦导通之后,这个电压基本保持不变。三极管本质上是一个以弱控强的器件,大家可以想象一下用一个阀门控制大坝匝门的情形。当阀门关闭时,大坝匝门也关闭,水流就不能从上游流到下游去,对应三极管,即没有IB,则也没有IC,这一区域称为“截止区”;转动阀门,大坝的匝门也跟着开启,阀门拧的圈数越多,匝门的开合度也越大,从上游到下游的水流也越大,对应三极管,则为Ic= Ib,这一状态称为“放大区”;当大坝匝门完全开启,再拧阀门,匝门的开合度已经到了最大值,水流不能再增大了,对应三极管,即当Ic的值到了极限时,Ib再增大,Ic也

5、不再跟着增大了,这一区域称之为“饱和区”。下面结合图2.3.2的电路通过实验对三极管的三个区做一下测试。 (a)实验原理图 (b)在面包板上实验测数据 图2.3.2 三极管特性实现电路讲究理论与实践的统一,说白了就是在学完理论后,只要有条件,一定要动手做实验,来验证理论的正确性,这样才会真正理解电路的特性。对于一些简单的实验,推荐使用如图2.3.2所示的面包板板来验证。图中三极管型号为较为常用的直插中小功率NPN三极管8050,VCC=5V。基极限流电阻Rb,阻值10K,集电极电阻RC阻值510。三极管的基极电压由3296电位器提供,通过旋转电位器,不断调整A点电位,让A点电位以0.2V的步进

6、升高,从0V到5V,然后用万用表测试A点、B点和C点电压,Ib=(Ua-Ub)/Rb,Ic=(VCC-Uc)/Rc,=Ic/Ib。 表2.3.1 三极管实现数据表Ua(V)Ub(V)URb(V)Ib(uA)Uc(V)URc(V)Ic(uA)0.2030.2030050000.4010.4010050000.5980.5560.0420.5674.9840.01631.37255.30.8120.620.1922.5944.7220.2785452101.0030.6380.3654.9324.4060.59411652361.2010.6480.5537.4734.0910.909178223

7、81.3990.6550.74410.0543.7851.21523822391.6020.6620.9412.7023.4551.54530292382.0010.6711.3312.7922.8022.19843092392.4030.6781.72523.3112.1712.82955472362.7990.6862.11328.5541.5663.43467332363.2060.6922.51433.9720.9614.03980782383.6020.6982.90439.2430.4124.58889962294.0030.7023.30144.6080.1714.8299468

8、2124.2010.7023.49947.2830.1434.85795232014.3920.7033.68949.8510.1354.86595391914.5970.7033.89452.6210.1324.86895451814.7970.7034.09455.3240.1294.87195501734.9850.7034.28257.8640.1244.8769560165当A点电压<0.598V时(A点电压为0.203V和0.401V),B点电压和A点电压相同,C点电压与电源VCC相同,这说明在这段区间内,基极电流为0(电阻Rb上没有压降),集电极电流也为0(电阻Rc上没有压

9、降)。这段区域我们称之为截止区。当A点电位超过0.6V后,基极和集电极都有电流,而且在一段区间内,随着输入电压的提高,集电极电流和基极电流都跟着升高,但其比值是不变的(=238)。三极管的输出端满足VCC=Ic*Rc+UCE,URc升高,UCE下降,这段区域我们称之为放大区,Ic=Ib。由关系式VCC=Ic*Rc+UCE可以看出,随着Ic的增大,UCE减低,当UCE接近0V时,Ic到达最高值,再往后,集电极电流不再跟随基极电流变化。从实验数据可以看出,A点电压超过4V后,C点电位下降至0.1V后,集电极电流和基极电流不再成比例关系。这段区域我们称之为饱和区。基极电流再升高,UCE间始终存在0.

10、1V左右的电压,我们称之为饱和压降。 在单片机应用电路中,三极管作为开关管来使用,三极管工作于截止区和饱和区。在截止区时,三极管的CE之间如同一个开关断开时,CE之间没有电流通过;而在饱和区时,三极管的CE之间如果一个开关导通一样,CE之间以最大电流通过,所以我们把三极管工作于这两个区的状态称之为开关。(2)D触发器在实际的数字系统中往往包含大量的存储单元,而且经常要求他们在同一时刻同步动作,为达到这个目的,在每个存储单元电路上引入一个时钟脉冲(CLK)作为控制信号,只有当CLK到来时电路才被“触发”而动作,并根据输入信号改变输出状态。把这种在时钟信号触发时才能动作的存储单元电路称为触发器。D

11、触发器是触发器的一种。图2.3.2是D触发器的内部构造图。 图2.3.2 D触发器内部构造D触发器的方程为Q=D,即输出Q的值等于输入D的值,但这种情况只发生在时钟的上升沿。在时钟上升沿到来之前,即使输入发生改变,输出也不会立即改变。(3)P1口、P2口和P3口的内部构造51单片机的P1口、P2口和P3口的构造大同小异,在这里暂且把他们当成是同一类型。图2.3.3中是这些I/O口的内部构造图。在图2.3.3中,P1、P2、P3口输出端是一个接上拉电阻的MOS管,漏极输出,考虑到初学者对MOS管不太熟悉,而MOS管和三极管的外特性相似,我们暂且把MOS管当成是NPN型的三极管来讲解,即图中三极管

12、发射极接地,集电极输出电平。我们要把I/O口置成高电平,需要在程序中对I/O口写“1”,D锁存器的输入端为高电平“1”,则D触发器的反相输出端输出低电平,则NPN三极管截止,输出端对外呈现高电平;反之,当我们在程序中写“0”,D触发器的反相端输出高电平,三极管饱和导通,输出低电平。因内部上拉电阻R的阻值较大,所以称之为弱上拉输出。图2.3.3 P1、P2和P3口的内部构造(4)P0内部构造图2.3.4是P0口的内部构造图。与P1、P2和P3口相比,P0口构造比较特殊。P0口既可以作为普通I/O口使用,也可以作为扩展存储器的地址/数据线使用。P0口怎样作为地址/数据总线来使用,我们暂且不要理会,

13、但地址/数据总线的输出形式值得一提,从图上可以看出,MUX开关打向上边,IO作为地址/数据用,MOS管T1和T2轮流导通,这种形式成为推挽输出。这种双管轮流导通的方式是AVR/PIC等单片机I/O口输出的主要形式,输出和输入都具有大电流。P0口用作普通I/O时,MUX开关打向D锁存器的输出端,D锁存器只能控制MOS管T2,对MOS管T1不起作用,MOS管T1截止。P0口用作普通I/O时,和P1、P2和P3口类似,不同之处在于,由于MOS管T1截止,MOS管T2没有电源和上拉电阻,即T2漏极开路,。所以P0口作为普通IO使用,还需在P0口的外部接上拉电阻。我们的开发板上外接了5.1K的排阻。 图

14、2.3.4 P0口内部构造 图2.3.4 P0口内部构造 2、拉电流与灌电流 拉电流和灌电流是衡量数字电路输出驱动能力的参数。数字电路的输出只有高、低(即“0”和“1”)两种电平值,高电平输出时,一般是输出端对负载提供电流,其提供电流的叫“拉电流”;低电平输出时,一般是输出端要吸收负载的电流,其吸收电流的叫“灌电流”。如图2.3.5所示。P2.1置“0”,低电平,电流从电源VCC经负载流入P2.1,称之为“灌电流”。P2.0置“1”,高电平,电流从芯片引脚P2.0流出,称之为“拉电流”。 图2.3.5 拉电流和灌电流灌电流越大,输出端MOS管的饱和压降就会越大,则输出低电平则会变高,数字电路的

15、低电平是有一定限制的,它有一个最大值UOLMAX。电路工作时,不允许超过这个数值,TTL逻辑门的规范规定UOLMAX 0.40.5V。所以,灌电流有一个上限,灌电流太大,不仅会使I/O输出端电压升高,而且还可能使I/O烧坏。拉电流越大,输出端的高电平就越低。这是因为MOS管的输出端有上拉电阻的原因,输出电流越大,上拉电阻上的压降也会越大,则对外输出的电压越低。数字电路的高电平有一个最小值UOHMIN。工作时,不允许超过这个数值,TTL逻辑门的规范规定UOHMIN 2.4V。所以,拉电流也有一个上限。3、STC89C52的拉电流和灌电流大小STC89C52的官方手册并没有给出I/O的拉电流和灌电

16、流的大小,只是说和传统8051单片机一样,是弱上拉。表2.3.2是拉电流的测试数据,测试方法是在P20引脚外接一个电阻,电阻另外一端接地,用万用表测试一下P20引脚的电压,然后换其它阻值的电阻测试。表2.3.3是灌电流的测试数据,测试方法是类似拉电流的测试,不同之处在于电阻的另外一端接电源VCC。 表2.3.2 拉电流测试数据 表2.3.3 灌电流测试数据电阻()I/O电压(mV)输入电流(mA)5K750.9851K3474.6535007228.556电阻()I/O电压(V)输出电流(uA)95K4.5944832K412521K3.5166 从表2.3.2和表2.3.3中可以看出STC8

17、9C52的灌电流和拉电流能力都比较弱,但相比较而言,灌电流要远远大于拉电流,拉电流是uA级别的,而灌电流是mA级别。另外根据表2.3.2中的数据计算,STC89C52单片机I/O中内置上拉电阻的阻值在7-10K左右。通过实验分析,就不难解释为什么我们在驱动发光二极管时,采用低电平驱动而不是高电平驱动了。由于STC89C52的上拉电阻在10K级别,就算不接限流电阻,发光二极管也不会被点亮。 4、C语言中的位运算流水灯的程序实现有两种方法,其中之一是采用移位的方法。C语言中的位运算在单片机程序中格外重要,程序中到处可见位运算,我们先了解一下C51的位运算种类和特点。C51提供了几种位操作符,如下表

18、所示:表2.3.2 C语言中的位运算符号运算符含义运算符含义&按位与取反|按位或<< 左移按位异或>> 右移(1)“按位与”运算符(&)参与与操作的两个位,原则是全1为1,有0才为0,即:0&0=0;0&1=0;1&0=0;1&1=1。如下例:a=0x05&0x03,即a=(0b 0101) & (0b 0011) =0b 0001。(2)“按位或”运算符(|) 参与或操作的两个位,原则是有一个为1,则结果为1,全0为0。即:0|0=0;0|1=1;1|0=1;1|1=1。例如:a=0x30|0x0f;即a

19、= (0b00110000)|(0b00001111) = (0b00111111)=0x3f。(3)“异或”运算符()异或运算符又被称为XOR运算符。当参与运算的两个位相同(1与1或0与0)时结果为0。不同时为1。即相同为0,不同为1。 00=0;01=1;10=1;11=0。例如:a=0x550x3f; 即a=(0b01010101)(0b00111111)=(0b01101010)=0x6a。(4)“取反”运算符()与其它运算符不同,“取反”运算符为单目运算符,即它的操作数只有一个。它的功能就是对操作数按位取反。也就是是1得0,是0得1。如下例:a=0xaa; a=0b10101010,

20、b=a,则b=0b01010101。(5)左移运算符(<<)左移运算符用来将一个数的各位全部向左移若干位。如:a=a<<2,表示将a的各位向左移2位,右边补0。如a=34(0b00100010),左移2位得0b10001000。(6)右移运算符(>>)右移与左移相类似,只是位移的方向不同。如:a=a>>2,表示将a的各位向右移动2位,左边补0。如a=34(0b00100010),左移2位。得0b10001000。5、C运算符位运算属于C众多运算符中的一种,除了位运算,还有算术运算符、关系运算符、逻辑运算符等。(1)算术运算符算术运算符用于各类数值

21、运算,包括加(+)、减(-)、乘(*)、除(/)、求余(%)、自增(+)、自减()。在C语言中,乘法运算符为“*”,不能写成数学中的“×”,除法运算符为“/”, 不能写成“÷”。对于“/”运算符,C语言规定,当它的两个运算分量都为整数时,其结果为整数,如果两个运算分量其中一个为浮点数时,则结果为浮点数。“%”运算符,是用来求两个数相除后的余数,相处的两个数必须为整形数据。“+”和“”是C语言中的自增运算符,如a+,+a。其中a+是表示先使用a的值,再加1,+a表示先加1,再使用a的值。“”的用法和“+”类似,是自减1。下面是算术运算符的举例。5+3:结果为5;5-3:结果为

22、2;5*3:结果为15;5/3: 结果为1;5+:结果为6。 (2)关系运算符C语言提供6种关系运算符,分别是大于(>)、大于等于(>=)、小于(<)、小于等于(<=)、等于(=)、不等于(!=)。需要注意的等于运算符,是双等于号,不是单个等号,单个等号是赋值。关系运算符的结果只有两种,0(假)和1(真)。关系成立为1,不成立则为0。如100>=20,结果1;7=3,结果为0;a<A,结构为0。(3)逻辑运算符逻辑运算符有三种,分别是逻辑与(&&)、逻辑或(|)和逻辑非(!),注意和位运算的区别。逻辑运算的结果只有两种:0(假)和1(真)。具

23、体功能如表2.3.4所示:表2.3.4 逻辑运算符aba&&ba|b!a真真真真假真假假真假假真假真真假假假假真6、数组流水灯实现的第二种方法是采用取表的方式。我们这里所谓的“取表”实际上就是C语言中的数组。在程序设计中,为了处理方便,把具有相同类型的若干变量按有序的形式组织起来,这些按序排列的同类数据元素的集合称为数组。C语言支持一维数组和多维数组。我们这里先来学习简单的一维数组。(1)一维数组的定义方式在C语言中使用数组必须先进行定义,才能使用。一维数组的定义方式为:类型说明符 数组名 常量表达式;其中,类型说明符是任一种基本数据类型或构造数据类型。数组名是用户定义的数组标

24、识符。方括号中的常量表达式表示数据元素的个数,也称为数组的长度。例如:int a10; /* 整型数组a,有10个元素 */char ch20; /* 字符数组ch,有20个元素 */需要说明几点,类型说明符实际是数组元素的取值类型,数组名的书写规则遵循标示符的规定,方括号中的常量表达式用来表示数组中元素的个数,如a5表示数组中有5个元素,但是其下标从0开始计算,因此5个元素分别是a0、a1、a2、a3、a4。(2)一位数组的初始化数组赋值既可以在定义的时候给数组元素赋初值,也可以在定义后用赋值语句逐个赋值。初始化赋值的一般形式为:类型说明符 数组名常量表达式 = 值, 值值 ; 其中在 中的

25、各数据值即为各元素的初值,各值之间用逗号间隔。例如:int a10= 0,1,2,3,4,5,6,7,8,9 ;相当于a0=0; a1=1 . a9=9;另外数组在初始化的时候,内数组元素的个数可以不写,编译系统会根据内数据的个数计算数组元素的个数。(3)一位数组的引用数组元素引用的一般形式为:数组名下标。其中下标只能为整型常量或者整型表达式,不能为变量。7、选择语句C语言的选择语句中包括if语句和switch语句。我们先来看一学习一下if语句。if构成的选择语句有3种类型。(1)第一种类型是判断是否满足某个条件,满足则执行相应的动作。其功能模型如下:if(条件) 执行动作 (2)if语句的第

26、二种类型是在第一种类型的基础之上,又加入了一个条件。判断是否满足某个条件,满足则执行动作1,不满足,则执行动作2。其功能模型如下:if(条件) 执行动作A else 执行动作B if(条件A) 执行动作A;else if (条件B) 执行动作B;else if (条件C) 执行动作C; else 执行动作D;(3)if语句的第三种类型是有多种条件可供选择,执行某个条件下的相应指令,如果条件A满足,则执行动作A,然后退出,不满足则判断条件B是否满足,依次进行下去。其功能模型如下:另外执行动作语句只有一个,则可以省略。三、任务实施1、移位方式实现流水灯程序#include<reg52.h&g

27、t;#define uchar unsigned char#define uint unsigned intsbit Input=P10; /外接电平输入端 void delay_ms(uint xms) /ms级延时函数 uint i,j;for(i=0;i<xms;i+)for(j=0;j<122;j+);void main() uchar i=0;uchar temp;while(1)if(keyy=1) /流水灯从右向左移动temp=0x01; /temp初值for(i=0;i<8;i+) P2=temp; /temp取反后,赋值给P2口 delay_ms(1000)

28、; /延时1000mstemp=temp<<1; /temp左移一位 else /流水灯从左向右移动temp=0x80;for(i=0;i<8;i+) P2=temp;delay_ms(1000);temp=temp>>1;程序解释:例程中,根据输入IO的电平(P10引脚外接电平),分为流水灯向左移和向右移,外接高电平时,向左移,外接低电平时,向右移。表2.3.5是向左移中temp变量和P2赋值的状态,表2.3.6是向右移中temp变量和P2赋值的状态。 表2.3.5 流水灯左移 表2.3.6 流水灯右移 iTemp(左移)P2=temp00000,00011111,111010000,00101111,110120000,01001111,101130000,10001111,011140001,00001110,111150010,00001101,111160100,00001011,111171000,00000111,1111iTemp(右移)P2=temp01000,00000111,111110100,00001011,111120010,00001101,111130001,00001110,111140000,10001111,011150000,01001111,10116

温馨提示

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

评论

0/150

提交评论