51单片机IO特点

51单片机IO特点
51单片机IO特点

51单片机I/O 特点

在上一单元中小灯闪烁的实例中,I/O 控制小灯闪烁51 ,只需在软件中对IO 置高和置低就可以了,使用起来非常方便。但是在实际应用中如果不了解IO 的特点,设计的电路存在缺陷,IO 使用起来未必会得心应手,初学者不必深究IO 控制原理,但至少得弄明白几个基本的概念,这对后期学习高档单片机也很有帮助。

1、弱上拉输出、推挽输出、开漏输出

51单片机(AT89和STC89系列)IO 作为输出,既有开漏输出,也有弱上拉输出。其中P0口是开漏输出,P1、P2和P3是弱上拉输出。

P1、P2和P3结构基本差不多,IO 输出端是一个接上拉电阻的MOS 管,漏极输出,当程序写“1”,锁存器输出反相信号“0”,则MOS 管截止,输出端对外呈现高电平;反之MOS 饱和导通,输出低电平。因内部上拉电阻阻值较大,所以称之为弱上拉输出。

P0口比较特殊,既可以作为地址/数据总线,又可以作为输入输出口。地址/数据总线的 作 用我们不用去理会了(基本不会在51单片机上加载存储器),但地址/数据总线的输出形式 确 值得一提,从图上可以看出,MUX 开关打向上边,IO 作为地址/数据用,OS

上拉电阻,阻值很大

上拉电阻大, 输出电流小 程序写“1”,锁存器输出“0”,则MOS 管截止,输出对外呈现高电平。反之,程序写“0”,MOS 管导通,输出对外呈现低电平。

作为地址/数据线用,T1和T2轮流导通,推挽输出。

作为普通IO 用,T1截止,只有T2起作用,相当于漏极开路。

管T1和T2轮流导通,这种形式成为推挽输出。尽管我们不用地址数据总线,但这种双管轮流导通的形式是AVR/PIC 等单片机IO 输出的主要形式,输出和输入具有同样大的电流。

P0口用作普通IO 时,MUX 开关打向锁存器端,锁存器输出只与MOS 管T2连接,MOS 管T1不起作用,MOS 管T2漏极开路,称之为开漏输出。所以P0口作为普通IO 使用,需在外部接上拉电阻。

2、拉电流与灌电流

拉电流和灌电流是衡量数字电路输出驱动能力的参数,由于数字电路的输出只有高、低(0,1)两种电平值,高电平输出时,一般是输出端对负载提供电流,其提供电流的数值叫“拉电流”;低电平输出时,一般是输出端要吸收负载的电流,其吸收电流的数值叫“灌电流”。如图所示。

灌电流越大,输出端MOS 管的饱和压降就会越大,

则输出低电平则会变高,数字电路的

低电平是有一定限制的,它有一个最大值

UOLMAX 。电路工作时,不允许超过这个数值,TTL 逻辑门的规范规定UOLMAX ≤0.4~0.5V 。所以,灌电流有一个上限。

拉电流越大,输出端的高电平就越低。这是因为输出级三极管是有内阻的,内阻上的电压降会使输出电压下降。拉电流越大,输出端的高电平越低。数字电路的高电平有一个最小值UOHMIN 。工作时,不允许超过这个数值,TTL 逻辑门的规范规定UOHMIN ≥2.4V 。所以,拉电流也有一个上限。

AT89S52单片机IO 驱动能力,手册里是这样描述的:

P1、P2、P3拉电流最大值不能超过60uA,拉电流再大,则输出电平低于2.4V 。51单片机的拉电流很弱,原因在于输出端上拉电阻阻值很大(几十K )。

每个IO 口所允许的最大灌电流为10MA ,整个芯片最大灌电流71mA,P0口最大灌电流

PB0置“0”,低电平,电流从电源VCC 经负载流入PB0,称之为“灌电流”。

PB1置“1”,高电平,电流从芯片引脚PB1流出,称之为“拉电流”

26mA,P1、P2和P3口最大灌电流为15mA。

3、双向口与伪双向口

双向口是指单片机输入和输出机构分离的,使用前需先设定是输入还是输出,大部分单片机的IO是双向口。

51单片机的IO是伪双向口,指的是输入和输出并未彻底分离。从IO读数据时,需要先对IO写“1”,然后才能读取外部电平。为什么要先写“1”呢?写“1”的作用是让MOS 管T截止,如果MOS管不截止(写“0”MOS管导通),则IO口被拉到低电平,无论外部电平是高还是低,读进来的信号全是低电平,如图所示。

有人可能会问,实际写程序读取外部电平时,都是直接来读的,没有写“1”的操作。这是因为51单片机上电复位后IO是高电平,既在程序运行前进行了写“1”操作,所以实际应用中省略了这一步。

作为输入时,必须让

MOS管截止(即写“1”),

否则读取值全为“0”。

(4)P0外接上拉电阻阻值如何选取

P0开漏输出,需外接上拉电阻,才能正常使用。既然上拉电阻可以自己设定,为了增加输出电流能力,有人把上拉电阻取值较小,这样做确实提高P0口高电平输出电流的能力,但当P0置低,上拉电阻上的电流全部流入内部的MOS管,增加了无用的灌电流。所以上拉电阻取值不能太小,一般在1K-10K之间。不建议通过上拉电阻提高来增大对外输出电流,如果需要大电流,电路中需使用功率元件。

IO 驱动之流水灯

LED 发光二极管是电子产品中常用的元器件:在电子产品中我们经常使用一个红色或者绿色的发光二极管用来指示系统的工作状态;闪烁的发光二极管用来作为系统的报警信号;发光二极管是数码管和点阵屏的基本单位。在本节中,我们通过一个流水灯的实例,了解发光二极管的特点和51单片机IO 口驱动流水灯的程序实现方法。

LED 发光二极管

从名字上看,LED 发光二极管应属于二极管的范畴。普通硅二极管的导通压降在0.7V 左右,发光二极管的导通压降在2V 左右(不同颜色的稍微有差别),这是由于发光二极管使用磷砷化镓等材料制作而成导致的。发光二极管是电流控制的元件,亮度由流过自身的电流来决定,一般5mm 的LED 电流达到1mA 就开始起辉,到25mA 左右可能烧毁,15-25mA 亮度变化已不明显。一般设定电流为2-10mA 就可以了。

驱动单个LED 发光二极管

51单片机单个IO 口的灌电流为10mA ,所以驱动单个发光二极管可以与单片机IO 口直接相连,采用低电平点亮的方式。电路如图所示。

在电路中,电阻R 起到限流的作用,调节R 的阻值可以控制发光二极管的亮度。导通

电流与电阻之间的关系由下面的的公式确定。

式中,V LED 为LED 的导通电压,若要保证流过LED 的电流在10mA 左右,则电阻R

取值330欧。

驱动多个发光二极管

51单片机IO 口中每一位灌电流是10mA,但整个芯片不超过71mA,每一组不超过15mA(P0口灌电流为26mA)。所以如果同时驱动8个发光二极管,如果亮度较低,电流控制在2mA 以下,可以用单片机直接驱动,但如果每一个发光二极管通过的电流在10mA 左右,总电流达到80mA ,则需要借助功率器件,常用的功率器件有三极管、MOS 管和数字IC 等。三极管在驱动继电器中讲解,在本节中我们使用数字IC 作为功率器件驱动发光二极管。

R

V V I LED -=

5

数字IC 输入电流小,可以直接和单片机相接,而输出电流又相对大一些,所以在单片机电路中,经常见到用74HC04、74HC573(74HC373)、74HC245(74HC244)等数字IC 作为功率驱动,来提高单片机的带负载能力。

74HC245是总线收发器,典型的CMOS 三态度缓冲门。

从74HC245的功能图中,我们可以得到芯片的使用方法。19引脚OE 引脚为使能引脚,当OE 为高电平,An 和Bn 都呈现高阻态,OE 为低电平,芯片处于工作状态。1引脚DIR 为方向控制端,DIR 高电平,Bn 为输入端,数据从Bn 到An ,DIR 为低电平,则An 为输入端,数据从An 到Bn 。

从datasheet 上我们还可以到芯片的驱动电压、拉电流、灌电流、总电流和功耗能参数, 74HC245单个IO 的拉电流和灌电流最大值为35mA ,总电流为70mA 。

利用移位实现流水灯的程序

C 语言中的位运算在单片机C 程序中显得格外重要,程序中到处可见位运算,我们先了解一下C 的位运算的特点。

C51提供了几种位操作符,如下表所示:

运算符含义运算符含义

& 按位与~ 取反

| 按位或<< 左移

^ 按位异或>> 右移

1、“按位与”运算符(&)

参加运算的两个数据,按二进位进行“与”运算。原则是全1为1,有0为0,即:0&0=0;0&1=0;1&0=0;1&1=1。如下例:a=5&3,即a=(0b 0101) & (0b 0011) =0b 0001 在实际的应用中被用于实现特定的功能:

2、“按位或”运算符(|)

参与或操作的两个位,只要有一个为1,则结果为1。有1为1,全0为0。即:0|0=0; 0|1=1; 1|0=1; 1|1=1;例如:a=0x30|0x0f; //a=(0b00110000)|(0b00001111)=(0b00111111)=0x3f。

“按位或”运算最普遍的应用就是对一个变量的某些位置‘1’。如下例:a=0x00; //a=0b 00000000;a=a|0x7f; //将a的低7位置为1,a=0x7f。

3、“异或”运算符(^)

异或运算符^又被称为XOR运算符。当参与运算的两个位相同(‘1’与‘1’或‘0’与‘0’)时结果为‘0’。不同时为‘1’。即相同为0,不同为1。0^0=0;0^1=1;1^0=1;1^1=0。例如:a=0x55^0x3f; //a=(0b01010101)^(0b00111111)=(0b01101010)=0x6a

4、“取反”运算符(~)

与其它运算符不同,“取反”运算符为单目运算符,即它的操作数只有一个。它的功能就是对操作数按位取反。也就是是‘1’得‘0’,是‘0’得‘1’。如下例:a=0xff; //a=0b11111111 a=~a; //a=0b00000000。

5、左移运算符(<<)

左移运算符用来将一个数的各位全部向左移若干位。如:a=a<<2,表示将a的各位左移2位,右边补0。如a=34(0b00100010),左移2位得0b10001000。

6、右移运算符(>>)

右移与左移相类似,只是位移的方向不同。如:a=a>>2,表示将a的各位向右移动2位,左边补0。如a=34(0b00100010),左移2位得0b10001000。

程序:

移位方式实现流水灯程序

#include

#define uchar unsigned char

#define uint unsigned int

void delay_ms(uint xms) //ms级延时函数

{

uint i,j;

for(i=0;i

for(j=0;j<123;j++);

}

void main()

{

uchar i,temp;

while(1)

{

temp=0x01; //左移

for(i=0;i<8;i++)

{

P2=~temp;

delay_ms(1000);

temp=temp<<1;

}

temp=0x80;

for(i=0;i<8;i++) //右移

{

P2=~temp;

delay_ms(1000);

temp=temp>>1;

}

}

}

程序解释:

程序通过移位的方式实现了8位流水灯的左移和右移,读者结合前面讲到的移位,自己来分析程序。另外把延时语句调小,直到1ms的延时,看一下会有什么现象,并分析原因。

取表方式实现流水灯程序

#include

#define uchar unsigned char

#define uint unsigned int

//数组里存放LED8个状态所对应的码值

uchar code table[ ]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

//ms延时函数

void delay_ms(uint xms)

{

uint i,j;

for(i=0;i

for(j=0;j<123;j++);

}

void main()

{

uchar i;

while(1)

{

//左移

for(i=0;i<8;i++)

{

P2=table[i];

delay_ms(1000);

}

//右移

for(i=0;i<8;i++)

{

P2=table[7-i];

delay_ms(1000);

}

}

}

程序解释:

(1)取表方式实际上就是建立一个包含了各种状态的数组。相对于移位方式,取表方式要简单、灵活,在后面介绍的数码管、点阵LED中,也会用到取表方式。

(2)数组定义时(uchar code table[ 8]),相比标准C中数组的定义,多了一个关键字“code”,不加关键字“code”,表示把数组中的变量存放到MCU的RAM中,加上关键字“code”,表示把数组中的变量存放到MCU的FLASH中。单片机的FLASH空间远远大于RAM的空间,所以经常把像数组这样一旦烧录就不会再修改的变量放到FLASH中,来节省有限的RAM空间。

IO 驱动之单个数码管

LED 数码管能显示各种数字或符号,由于它具有显示清晰、亮度高、寿命长、价格低廉的特点,因此在电子产品中经常使用。图1.1是几个数码管的图片,图a 为单位数码管,图b 为双位数码管,图c 为四位数码管。

a 单位数码管 b

双位数码管 c 四位数码管

那么数码管是如何的工作呢?还记得我们小时候玩过的

“火柴棒游戏”吗,几根火柴组

合起来,可以拼成各种各样的图形,数码管实际上就是利用这个原理做成的。

图1.2 数码管引脚标号,共阴和共阳的内部连接图

单个数码管的控制

单个数码管由8个发光二极管组成,其中7个长条形的发光管排列成一个“日”字形,我们称之为“段”,另一个圆点形的发光管在数码管的右下角作为小数点用。图1.2中的a 图是数码管的段标号以及外接引脚排列图。由图可以看出,单个数码管共有10个引脚,其中8个发光二极管的一端分别与数码管的8八个引脚相接,8个发光二极管的另外一端汇集在一起,称之为公共端,与数码管上下排引脚当中的那个引脚相连,称之为“公共端”。公共端既可以接地,也可以接高电平。公共端接地的数码管,是将发光二极管的阴极连接在一起接地,点亮数码管,各段需加高电平,称之为“共阴极数码管”; 公共端接高电平的数码管,是将发光二极管的阳极连接在一起接高电平,点亮数码管,各段需加低电平,称之为“共阴极数码管”;图1.2中的b 图和c 图分别是共阴极数码管和共阳极数码管内部原理图。

我们以共阴极的数码管为例,先介绍如何控制一个8段数码管显示“0”-“F”16个数字或数字。

硬件电路设计

很明显,用51的I/O口控制共阴极数码管的8个段位,分别置“1”或“0”,让某些段的LED发光,其它的熄灭,就可以显示不同的字符和图符号。图中74HC245是为了提高单片机的驱动

软件设计

为了获得不同的字型符号,数码管各段所加的电平不同,因此I/O口输出的编码也不同。因此首先要建立一个字型与字段7段码的编码表,见表。

表1.1 LED数码管字型字段编码表

字型P07 P06 P05 P04 P03 P02 P01 P00 共阴极共阳极

0 0 0 1 1 1 1 1 1 3FH C0H

1 0 0 0 0 0 1 1 0 06H F9H

2 0 1 0 1 1 0 1 1 5BH A4H

3 0 1 0 0 1 1 1 1 4FH B0H

4 0 1 1 0 0 1 1 0 66H 99H

5 0 1 1 0 1 1 0 1 6DH 92H

6 0 1 1 1 1 1 0 1 7DH 82H

7 0 0 0 0 0 1 1 1 07H F8H

8 0 1 1 1 1 1 1 1 7FH 80H

9 0 1 1 0 1 1 1 1 6FH 90H

A 0 1 1 0 1 1 1 1

b 0 1 1 1 0 1 0 0

C 0 0 1 1 1 0 0 1

d 0 1 0 1 1 1 1 0

E 0 1 1 1 1 0 0 1

F 0 1 1 1 0 0 0 1

有了字型段码对照表,就可以用软件的方式进行8段码的译码。如要显示字型“1”,P0口输出值为0x06;显示字型“2”,P0口输出值为0x5B。

程序代码:

#include

#define uchar unsigned char

#define uint unsigned int

//0-F的字码放在数组中,数组名前面的code表示把数组的元素放在Flash中,而不

是RAM,这样可以节省RAM的空间。

uchar code seg_7[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

void delayms(uint xms)//1ms的延时函数

{

uint i,j;

for(i=0;i<112;i++)

for(j=0;j

}

void main(void)

{ uchar i=0;

while(1)

{

for(i=0;i<16;i++)

{

P0=seg_7[i];

delayms(1000);

}

}

}

程序解释:

数组seg_7[]有16个元素,为共阴数码管显示字型0-F的段码,关键字code是把他们定义到Flash中,节约RAM空间。主程序中,每隔1S,显示一个字符。

IO驱动之8*8点阵LED

点阵LED在我们生活的城市中到处可见,如商家门前的广告牌、电梯运行指示、广场上的大LED屏等。点阵LED的优点是既可以显示数字,又可以显示汉字、图形,同时显示亮度高。

8*8点阵LED原理

8×8的LED点阵是由8行×8列共64个发光二极管按矩阵形式排列而成,每一行上的发光管有一个公共的阳极(或阴极),每一列上的发光管有一个公共的阴极(或阳极),如图所示.

在流水灯一节中,提高过这样一个问题,如果延时函数设置为1ms,会有什么效果呢?8个发光二极管看起来都亮,但我们在程序中是逐个点亮的。

人的眼睛的一个重要特性是视觉惰性,即光象一旦在视网膜上形成,视觉将会对这个光象的感觉维持一个有限的时间,这种生理现象叫做视觉暂留性。对于中等亮度的光刺激,视觉暂留时间约为0.05至0.2秒。延时函数设置为1ms,8个发光二极管看起来都亮原因就在于人的眼睛的视觉暂留性。

分析8×8点阵的结构图,当对应的某一列置高电平,某一行置低电平,则相应的二极管就亮。我们可以让点阵在某一时间段只亮一列(一行),逐行(逐列)点亮,当扫描时间小于0.05秒,因为人眼睛的视觉暂留性,看起来点阵是在全屏显示。下面设计一个实现简单的、用于电梯中指示向上运行的箭头“↑”。

8*8点阵LED电路

P1口通过74HC245接点阵的行,送高电平,中间加限流电阻,P0口接点阵的列,送低电平。

软件设计:

1 (P07)

2

(P06)

3

(P05)

4

(P04)

5

(P03)

6

(P02)

7

(P01)

8

(P00)

P0

输出值

1(P10)●0xEF 2(P11)●●●0xC7 3(P12)●●●●●0x83 4(P13)●●●●●●●0x01 5(P14)●●●0xC7 6(P15)●●●0xC7 7(P16)●●●0xC7 8(P17)●●●0xC7

程序如下:

#include

uchar code col_8[]={0xEF,0xC7,0x83,0x01,0xC7,0xC7,0xC7,0xC7}; uchar code row[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; void delay_ms(uint xms)//1ms的延时函数

{

uint i,j;

for(i=0;i<112;i++)

for(j=0;j

}

void main(void)

{

uchar i;

foi(i=0;i<8;i++)

{

P0=col_8[i]; //送列值

P1=row[i]; //送行值

delay_ms(2);

P1=0x00; //消隐

}

}

IO驱动-电磁继电器

继电器可以用低电压、弱电流控制高电压、强电流电路,在自动化设备中起着重要的作用,继电器种类繁多,本节内容以电磁继电器为主,讲述单片机如何控制继电器动作。1、电磁继电器构造和工作原理

电磁继电器的构造如图所示,A是电磁铁,B是衔铁,C是弹簧,D是动触点,E是静触点。

电磁继电器工作电路可分为低压控制电路和高压工作电路组成。控制电路是由电磁铁A、衔铁B、低压电源E1和开关S组成。开关S闭合,衔铁被电磁铁吸下来,动触点同时与两个静触点接触,使D、E间连通,工作电路中的灯泡点亮。开关S断开,电磁铁失去磁性,对衔铁无吸引力。衔铁在弹簧的拉力作用下回到原来的位置,动触点与静触点分开,工作电路被切断,小灯泡L不发光。

2、电磁继电器参数和选型

电磁继电器参数

(1)额定工作电压

是指继电器正常工作时线圈所需要的额定电压。以松乐继电器为例,有DC5V/12V/24V,线圈所加的工作电压,一般不要超过额定工作电压的1.5倍,否则会产生较大的电流而把线圈烧毁。

(2)线圈电阻

是指继电器中线圈的直流电阻,可以通过万能表测量。松乐继电器线圈电阻:70-80欧(5V);0.4K-0.45K欧(12V);1.45K-1.55K(24V).

3、吸合电流和释放电流

吸合电流是指继电器能够产生吸合动作的最小电流。在正常使用时,给定的电流必须略大于吸合电流,这样继电器才能稳定地工作。释放电流是指继电器产生释放动作的电流。当继电器吸合状态的电流减小到一定程度时,继电器就会恢复到未通电的释放状态。这时的电流远远小于吸合电流。

松乐继电器:5V(吸合电流:43-46mA;释放电流:15-18mA);12V(吸合电流:16-18mA;释放电流5-7mA);24V(吸合电流:8-9mA;释放电流:2.4mA-2.8mA)。

4、触点切换电压和电流

是指继电器允许加载的电压和电流。它决定了继电器能控制电压和电流的大小,使用时不能超过此值,否则很容易损坏继电器的触点。松乐继电器:10A 250VAC/10A 30VDC,使用时,要分清控制电压是交流还是直流,不能超过额定电压值和电流值(实际中最好取一半)。

5、继电器引脚

线圈引脚,常开触点和常闭触电,使用时可以参考继电器厂家资料或者用万用表量一下。

选型举例

一恒温箱的加热源采用500W电炉,电炉的工作电压为220V,电流为2.3A。选用松乐T73-5V继电器,开关负载能力10A 250VAC,继电器线圈额定电压5V,线圈阻抗为80欧,线圈额定电流为5V/80欧=62mA,吸合电流为40毫安左右,要使线圈稳定吸合,驱动电流应以额定电流为准。

3、单片机驱动继电器电路

51单片机IO驱动能力有限,无法直接驱动继电器线圈,需使用功率驱动元件,单片机电路驱动继电器电路中常用的功率元件有三极管和集成功率芯片(ULN2003)。

三极管驱动

在51单片机系统中,三极管作为功率元件驱动继电器,大部分教科书会给出一个电路,很多初学者在自己设计电路时,照猫画虎,死板硬套,效果不好。深刻了解51I/O的特性、三极管的原理和继电器的原理,才能设计出稳定工作的继电器电路。

电路讲解:

(1)51单片机驱动继电器,功率器件应采用PNP三极管还是NPN三极管?

如果51单片机I/O直接驱动三极管,应使用PNP三极管。I/O口低电平,PNP三极管基极电流流入I/O,51单片机灌电流比较大,足以使三极管饱和,继电器线圈得电动作。而如果三极管为NPN ,I/O口高电平三极管才能通道,但由于51单片机I/O提供的拉电流不足以提供基极饱和电流(假设三极管h fe=100,集电极电流=60mA ,则基极电流应为0.6mA,而51I/O的拉电流为几十个uA),三极管根本无法饱和,继电器不动作,所以51单片机I/O口驱动不了NPN三极管。

有人建议在驱动NPN三极管时,51单片机I/O口加上拉电阻来提高拉电流的能力,拉电流是够用的了,但仍然避免不了另外一个问题,51单片机上电复位I/O是高电平,复位后程序还没有运行(假设按键控制继电器吸合,按键还没有被按下),线圈就得电,这在工业里不允许的。如果在51单片机的I/O口接反相器再驱动NPN三极管,则可以得到很好的解决。如图所示,反相器是74HC04(反相器也可以是PNP三极管),单片机系统上电后,高电平经过反相器后变成低电平,确保了NPN三极管截止;同时74HC04拉电流较大(手册标示25mA),解决了单片机拉电流不足。

注意:以上的情况分析,仅适于51单片机,像A VR/PIC单片机则不存在以上问题,原因在于51单片机I/O比较特殊,是伪双向口,输出不具有第三态(高阻),且拉电流小。

而如果控制器是A VR/PIC等,则可以直接使用NPN三极管。

(2)继电器线圈应该接在三极管的发射极还是集电极?

不少教程在三极管驱动继电器电路中,把继电器线圈放到三极管的发射极,如如所示。从图中我们可以看到,线圈电压不是电源电压5V,而是电源电压减去三极管UBE(0.6V),再减去限流电阻R上的电压,很明显,继电器线圈得不到额定电压5V,有人可能会说,线圈电压不是5v ,继电器也能动作啊。在继电器的参数中,我们可以看出吸合电流是小于额定电流的,尽管线圈的电流达不到额定电流但却超过了吸合电流,继电器仍然可以动作,但这里必须指出,为了保证继电器工作的可靠性,不要把继电器线圈接在发射极上,NPN三极管同样如此。

继电器线圈接在三极管的发

射极,继电器线圈的电压是电

源电压减去三极管U BE上的

电压,再减去限流电阻R上

的电压,所以继电器线圈得不

5V的额定电压。

(3)图中两个电阻R1和R2起什么作用,如何取值;二极管起什么作用?

电阻R1是基极限流电阻,限制流入I/O的电流,保护I/O口。假设8050三极管h fe=100,集电极电流=60mA ,则基极电流应为0.6mA,则电阻R=(5V-0.7V)/0.6mA=7.2K欧,为了保证三极管深度饱和,这里R1=1K。

电阻R2为基极上拉电路,上电后基极被限位于高电平,防止继电器动作。取值太大,则上拉不可靠,取值太小,则功耗太大,所以电阻R2取值介于几十K欧到几百K欧之间,途中R2=22K欧。

继电器吸合线圈在三极管截止时会产生一个很高的反峰电压,因此在线圈两端并接一个二极管D,其用途是释放反峰电压,防止三极管和I/O口不会被反峰电压击穿,提高系统的可靠性。

(4)如果继电器是12V(24)额定电压,图1还能成立吗?

控制器是A VR/PIC等,I/O口推挽输出拉电流较大,且上电后高阻,用NPN三极管驱动继电器,是一个好的选择,继电器额定电压换成是12V(24V),电路仍然可以用。

在前面的论述中,我们已经提到51单片机使用PNP三极管较好,那么当继电器额定电压换成12V或者24V,图1的电路还能用么?

很显然不能用,当I/O口为高电平5V,由于继电器线圈电压时12V(24V),PNP三极管仍然导通。I/O口接入光耦后,再接继电器线圈,可以解决这一问题,如图所示。

IO的扩展

在实际设计当中,规划系统方案时,经常会出现IO口不够用的现象,有两种解决的办法:一种是换引脚更多的单片机,另外在不换单片机的情况下,对于一些简单的并行输出、输出引脚可以通过一些数字芯片减少与单片机相连的引脚数。

AT89C51单片机的基本结构和工作原理

AT89C51单片机的主要工作特性: ·内含4KB的FLASH存储器,擦写次数1000次; ·内含28字节的RAM; ·具有32根可编程I/O线; ·具有2个16位可编程定时器; ·具有6个中断源、5个中断矢量、2级优先权的中断结构; ·具有1个全双工的可编程串行通信接口; ·具有一个数据指针DPTR; ·两种低功耗工作模式,即空闲模式和掉电模式; ·具有可编程的3级程序锁定定位; AT89C51的工作电源电压为5(1±0.2)V且典型值为5V,最高工作频率为24MHz. AT89C51各部分的组成及功能: 1.单片机的中央处理器(CPU)是单片机的核心,完成运算和操作控制,主要包括运算器和控制器两部分。

(1)运算器 运算器主要用来实现算术、逻辑运算和位操作。其中包括算术和逻辑运算单元ALU、累加器ACC、B寄存器、程序状态字PSW和两个暂存器等。 ALU是运算电路的核心,实质上是一个全加器,完成基本的算术和逻辑运算。算术运算包括加、减、乘、除、增量、减量、BCD码运算;逻辑运算包括“与”、“或”、“异或”、左移位、右移位和半字节交换,以及位操作中的位置位、位复位等。 暂存器1和暂存器2是ALU的两个输入,用于暂存参与运算的数据。ALU的输出也是两个:一个是累加器,数据经运算后,其结果又通过内部总线返回到累加器;另一个是程序状态字PSW,用于存储运算和操作结果的状态。 累加器是CPU使用最频繁的一个寄存器。ACC既是ALU处理数据的来源,又是ALU运算结果的存放单元。单片机与片外RAM或I/O扩展口进行数据交换必须通过ACC来进行。 B寄存器在乘法和除法指令中作为ALU的输入之一,另一个输入来自ACC。运算结果存于AB寄存器中。 (2)控制器 控制器是识别指令并根据指令性质协调计算机内各组成单元进行工作的部件,主要包括程序计数器PC、PC增量器、指令寄存器、指令译码器、定时及控制逻辑电路等,其功能是控制指令的读入、译码和执行,并对指令执行过程进行定时和逻辑控制。AT89C51单片机中,PC是一个16位的计数器,可对64KB程序存储器进行寻址。复位时PC的内容是0000H. (3)存储器 单片机内部的存储器分为程序存储器和数据存储器。AT89C51单片机的程序存储器采用4KB的快速擦写存储器Flash Memory,编程和擦除完全是电器实现。 (4)外围接口电路 AT89C51单片机的外围接口电路主要包括:4个可编程并行I/O口,1个可编程串行口,2个16位的可编程定时器以及中断系统等。 AT89C51的工作原理: 1.引脚排列及功能 AT89C51的封装形式有PDIP,TQFP,PLCC等,现以PDIP为例。 (1)I/O口线 ·P0口 8位、漏极开路的双向I/O口。 当使用片外存储器及外扩I/O口时,P0口作为低字节地址/数据复用线。在编程时,P0口可用于接收指令代码字节;程序校验时,可输出指令字节。P0口也可做通用I/O口使用,但需加上拉电阻。作为普通输入时,应输出锁存器配置1。P0口可驱动8个TTL负载。 ·P1口 8位、准双向I/O口,具有内部上拉电阻。 P1口是为用户准备的I/O双向口。在编程和校验时,可用作输入低8位地址。用作输入时,应先将输出锁存器置1。P1口可驱动4个TTL负载。 ·P2 8位、准双向I/O口,具有内部上拉电阻。 当使用外存储器或外扩I/O口时,P2口输出高8位地址。在编程和校验时,P2口接收高字节地址和某些控制信号。 ·P3 8位、准双向I/O口,具有内部上拉电阻。 P3口可作为普通I/O口。用作输入时,应先将输出锁存器置1。在编程/校验时,P3口接收某些控制信号。它可驱动4个TTL负载。 (2)控制信号线

51单片机IO口使用经验绝对经典

绝对经典 按常规,在51端口(P1、P2、P3)某位用作输入时,必须先向对应的锁存器写入1,使FET截止。一般情况是这样,也有例外。所谓IO口内部与电源相连的上拉电阻而非一常规线性电阻,实质上,该电阻是由两个场效应管并联在一起:一个FET为负载管,其阻值固定;另一个FET 可工作在导通或截止两种状态(姑且叫可变FET)。使其总电阻值变化近似为0或阻值较大(20千欧--40千欧)两种情况。当和端口锁存器相连的FET由导通至截止时,该阻值近似为0,可将引脚快速上拉至高电平;当和锁存器相连的FET由截止至导通时,该电阻呈现较大阻值,限制了和端口锁存器相连的FET的导通电流。 51I/O口作为输入端和外部信号相连有时必须考虑上述特性,本人在设计LTP1245热敏打印头驱动板时,资料上推介热敏头“抬头”和“纸尽”信号由头中内嵌检测电路提供,MCU IO口采集该信号时需加缓冲(如74HC04)。当时本人认为51IO口上拉电阻为一较大阻值的固定电阻,对输入信号无影响,故未加缓冲电路(为降低成本能省则省)。可到调试PCBA时发现,“抬头”、“纸尽”状态变化时,采集信号只在3.90V--5.10V之间变化,应为低电平时无低电平输出。究其原因,打印头的“抬头”、“缺纸”信号输出为一光敏三极管的集电极输出,集电极和电源间原有一个负载电阻,饱和导通设计工作电流仅为450--1100微安,当该集电极直接和MCU IO口某位相连时,IO口上拉电阻和光敏三极管负载电阻并联,当IO口上拉时,上拉电阻极小致使光敏三极管直流负载线斜率陡然增大,工作状态进入放大区而非希望的饱和区。当时在不改硬件的条件下,我几乎无计可施,甚至想到了准备烧断IO口上拉电阻(前两天我曾发帖求救怎么烧断IO 口上拉电阻的方法)后来听网友建议该方法风险较大,所以总想用软件方法解决。 后来我的解决方法是:采样信号前不是先向对应锁存器写1,而是先写入0,再写入1,延时约10毫秒以上,然后再采样(当然此法只适应于采样频率很低的情况)。这样作的目的是:先写入0迫使IO口上拉电阻先为一较大值,此时如果外部光敏三极管本来处于截止状态,当完成上述一系列锁存器的写入过程后光敏管仍为截止态,IO口正确采样到高电平;此时如果外部

51单片机各引脚及端口详解

51单片机各引脚及端口详解 51单片机引脚功能: MCS-51是标准的40引脚双列直插式集成电路芯片,引脚分布请参照----单片机引脚图: l P0.0~P0.7 P0口8位双向口线(在引脚的39~32号端子)。 l P1.0~P1.7 P1口8位双向口线(在引脚的1~8号端子)。 l P2.0~P2.7 P2口8位双向口线(在引脚的21~28号端子)。 l P3.0~P3.7 P2口8位双向口线(在引脚的10~17号端子)。 这4个I/O口具有不完全相同的功能,大家可得学好了,其它书本里虽然有,但写的太深,对于初学者来说很难理解的,我这里都是按我自已的表达方式来写的,相信你也能够理解的。 P0口有三个功能: 1、外部扩展存储器时,当做数据总线(如图1中的D0~D7为数据总线接口) 2、外部扩展存储器时,当作地址总线(如图1中的A0~A7为地址总线接口)

3、不扩展时,可做一般的I/O使用,但部无上拉电阻,作为输入或输出时应在外部接上拉电阻。 P1口只做I/O口使用:其部有上拉电阻。 P2口有两个功能: 1、扩展外部存储器时,当作地址总线使用 2、做一般I/O口使用,其部有上拉电阻; P3口有两个功能: 除了作为I/O使用外(其部有上拉电阻),还有一些特殊功能,由特殊寄存器来设置,具体功能请参考我们后面的引脚说明。 有部EPROM的单片机芯片(例如8751),为写入程序需提供专门的编程脉冲和编程电源,这些信号也是由信号引脚的形式提供的, 即:编程脉冲:30脚(ALE/PROG) 编程电压(25V):31脚(EA/Vpp) 接触过工业设备的兄弟可能会看到有些印刷线路板上会有一个电池,这个电池是干什么用的呢?这就是单片机的备用电源,当外接电源下降到下限值时,备用电源就会经第二功能的方 式由第9脚(即RST/VPD)引入,以保护部RAM中的信息不会丢失。 在介绍这四个I/O口时提到了一个“上拉电阻”那么上拉电阻又是一个什么东东呢?他起什么作用呢?都说了是电阻那当然就是一个电阻啦,当作为输入时,上拉电阻将其电位拉高,若输 入为低电平则可提供电流源;所以如果P0口如果作为输入时,处在高阻抗状态,只有外接一个上拉电阻才能有效。 ALE 地址锁存控制信号:在系统扩展时,ALE用于控制把P0口的输出低8位地址送锁存器锁存起来,以实现低位地址和数据的隔离。参见图2(8051扩展2KB EEPROM电路,在图中ALE与4LS373锁存器的G相连接,当CPU对外部进行存取时,用以锁住地址的低位地址, 即P0口输出。 由于ALE是以晶振六分之一的固定频率输出的正脉冲,当系统中未使用外部存储器时,ALE 脚也会有六分之一的固定频率输出,因此可作为外部时钟或外部定时脉冲使用。

单片机io口理解

【转】单片机IO口设置推挽和开漏的区别(转自网易博客冷水泡茶的日志)2010-09-28 13:43 单片机IO口设置推挽和开漏的区别 一般情况下我们在电路设计编程过程中设置单片机,大多是按照固有的模式去做的,做了几年这一行了,也没碰到过什么问题。昨天就遇到了这样一个问题,电路结构如图一,在这种情况下STC单片机与410单片机通讯是没问题的 但是与PC就无法通讯了,STC收不到PC的命令,以前410的位置是用的STC的片子一直没问题,我想也许是驱动能力不够,在410TX端加了上拉,不过没起作用。 用示波器监视串口得到面的波形 这说明sp3232下拉得不够,于是加了下拉,还是没起作用。又把410端口内部的上拉去掉,结果还是一样。 最后请教老师,在410程序里将TX的工作方式由推挽式改为开漏式,一切ok~!

从网上查了推挽和开漏的区别,放在这里免得以后再到处找了,给自己保存了 我们先来说说集电极开路输出的结构。集电极开路输出的结构如图1所示,右边的那个三极管集电极什么都不接,所以叫做集电极开路(左边的三极管为反相之用,使输入为“0”时,输出也为“0”)。对于图1,当左端的输入为“0”时,前面的三极管截止(即集电极C跟发射极E之间相当于断开),所以5V电源通过1K电阻加到右边的三极管上,右边的三极管导通(即相当于一个开关闭合);当左端的输入为“1”时,前面的三极管导通,而后面的三极管截止(相当于开关断开)。 我们将图1简化成图2的样子。图2中的开关受软件控制,“1”时断开,“0”时闭合。很明显可以看出,当开关闭合时,输出直接接地,所以输出电平为0。而当开关断开时,则输出端悬空了,即高阻态。这时电平状态未知,如果后面一个电阻负载(即使很轻的负载)到地,那么输出端的电平就被这个负载拉到低电平了,所以这个电路是不能输出高电平的。 再看图三。图三中那个1K的电阻即是上拉电阻。如果开关闭合,则有电流从1K电阻及开关上流过,但由于开关闭其它三个口带内部上拉),当我们要使用输入功能时,只要将输出口设置为1即可,这样就相当于那个开关断开,而对于P0口来说,就是高阻态了。 对于漏极开路(OD)输出,跟集电极开路输出是十分类似的。将上面的三极管换成场效应管即可。这样集电极就变成了漏极,OC就变成了OD,原理分析是一样的。 另一种输出结构是推挽输出。推挽输出的结构就是把上面的上拉电阻也换成一个开关,当要输出高电平时,上面的开关通,下面的开关断;而要输出低电平时,则刚好相反。比起OC或者OD来说,这样的推挽结构高、低电平驱动能力都很强。如果两个输出不同电平的输出口接在一起的话,就会产生很大的电流,有可能将输出口烧坏。而上面说的OC或OD输出则不会有这样的情况,因为上拉电

51单片机基础知识及期末复习

51单片机简答题部分(经典) 1、什么叫堆栈? 答:堆栈是在片内RAM中专门开辟出来的一个区域,数据的存取是以"后进先出"的结构方式处理的。实质上,堆栈就是一个按照"后进先出"原则组织的一段内存区域。 2、进位和溢出? 答:两数运算的结果若没有超出字长的表示范围,则由此产生的进位是自然进位;若两数的运算结果超出了字长的表示范围(即结果不合理),则称为溢出。 3、在单片机中,片内ROM的配置有几种形式?各有什么特点? 答:单片机片内程序存储器的配置形式主要有以下几种形式:(1)掩膜(Msak)ROM型单片机:内部具有工厂掩膜编程的ROM,ROM中的程序只能由单片机制造厂家用掩膜工艺固 化,用户不能修改ROM中的程序。掩膜ROM单片机适合于 大批量生产的产品。用户可委托芯片生产厂家采用掩膜方法 将程序制作在芯片的ROM。 (2)EPROM型单片机:内部具有紫外线可擦除电可编程的只读存储器,用户可以自行将程序写入到芯片内部的EPROM 中,也可以将EPROM中的信息全部擦除。擦去信息的芯片 还可以再次写入新的程序,允许反复改写。 (3)无ROM型单片机:内部没有程序存储器,它必须连接程序存储器才能组成完整的应用系统。 无ROM型单片机价格低廉,用户可根据程序的大小来选择外接 程序存储器的容量。这种单片机扩展灵活,但系统结构较复 杂。 (4)E2ROM型单片机:内部具有电可擦除叫可编程的程序存储器,使用更为方便。该类型目前比较常用 (5)OTP(One Time Programmable)ROM单片机:内部具有一次可编程的程序存储器,用户可以在编程器上将程序写入片内程 序存储器中,程序写入后不能再改写。这种芯片的价格也较 低。 4、什么是单片机的机器周期、状态周期、振荡周期和指令周期?它们之间是什么关系? 答:某条指令的执行周期由若干个机器周期(简称M周期)构成,一个机器周期包含6个状态周期(又称时钟周期,简称S周期),而一个状态周期又包含两个振荡周期(P1和P2,简称P周期)。也就是说,指令执行周期有长有短,但一个机器周期恒等于6个状态周期或12个振荡周

51系列单片机P0端口具体讲解

有关单片机P0口具体讲解 图1 (一)在我们讲解P0端口之前我们首先梳理一下各个端口有什 么不同之处: P0口有三个功能: 1、外部扩展存储器时,当做数据(Data)总线(如图1中的D0~D7为数据总线接口) 2、外部扩展存储器时,当作地址(Address)总线(如图1中的A0~A7为地址总线接口) 3、不扩展时,可做一般的I/O使用,但内部无上拉电阻,作为输入或输出时应在外部接上拉电阻(后面将详细介绍)。 P1口只做I/O口使用:其内部有上拉电阻。 P2口有两个功能: 1、扩展外部存储器时,当作地址总线使用(如图1中的A8~A15为地址总线接口) 2、做一般I/O口使用,其内部有上拉电阻; P3口有两个功能: 除了作为I/O使用外(其内部有上拉电阻),还有一些特殊功能,由特殊寄存器来设置,具体功能请参考我们后面的引脚说明。

图2(注:该图只是P0口的一位,也就是说P0口有8个相同的这样的结构) 图3

(二)由图2可以看出每个P0口都有这些元件: 一个锁存器,两个三态输入缓冲器和一个输出驱动电路组成 在访问外部存储器时,P0是一个真正的双向口,当P0输出地址/数据信息时,CPU内部法控制电平“1”来打开上面的与门,又使模拟开关MUX把地址/数据信息经过反相器和T1接通(我们称上面的场效应晶体管FET为T1,下面的场效应管FET为T2); 输出的地址/数据信息既通过与门去驱动T1,又通过反相器去驱动T2,是两个FET构成推拉输出电路; 1.当P0口作为外部扩展存储器的数据地址总线时: ●若地址数据信息为“0”,那么这个信号就使得T1截止,使T2导通(经过反反相器作 用使得T2接收到的信号为“1”,根据场效应晶体管的特性,T2导通),若T2导通,那么T2的上下两个N极就导通,而发射极(下面的N极)接地信号则为“0”,这样P0口就相当于接收到了“0”信号; ●若地址数据信息输入“1”,则该信号使T2截止,使T1导通,在T1导通情况下,T1 的上下N极导通,使得VCC与P0相同,从而输出高电平,即“1”信号; ●若从P0口输入信号,信号从引脚通过输入缓冲器进入内部总线; 2.当P0口作为一般I/O口使用时: ●CPU内部发布控制信号“0”,封锁与门,使得T1截止,同时使模拟开关MUX把锁存 器的非Q端与T2端的栅极接通; ●在P0口作为输出时,由于非Q端和T2的倒相作用,那么内部总线上的信息与到达P0 口上的信息是同相的,只要写脉冲加到锁存器的CL端,内部总线上的信息就会P0的引脚上; ●但是由于此时T2为漏极开路输出,所以要外接上拉电阻。 当P0作为输入时,由于该信号既加到T2又加到下面的三态缓冲器。现在我们假设我们刚刚输出的信号为“0”,也就是输入锁存器的数据为“0”,经过非Q达到T2使T2导通,这样P0引脚上的信号就被T2钳在“0”电平上,这样就使输入的“1”无法读入。那么我们就必须在输入信号前,应该先向锁存器Q端写“1”,非Q就为“0”,使T2截止,这就是所谓的“准双向口”的解释。但是在访问片外存储器时,CPU会自动向锁存器Q写入“1”,所以对用户而言P0口作为数据/地址总线时,是一个真正的双向口。

51单片机IO口使用DE 经验

DANPAINJI 51单片机I/O口使用经验 字体大小: 小中大作者:来源:日期:2006-08-18 点击:364 按常规,在51端口(P1、P2、P3)某位用作输入时,必须先向对应的锁存器写入1,使FET 截止。一般情况是这样,也有例外。所谓IO口内部与电源相连的上拉电阻而非一常规线性电阻,实质上,该电阻是由两个场效应管并联在一起:一个FET为负载管,其阻值固定;另一个FET可工作在导通或截止两种状态(姑且叫可变FET)。使其总电阻值变化近似为0或阻值较大(20千欧--40千欧)两种情况。当和端口锁存器相连的FET由导通至截止时,该阻值近似为0,可将引脚快速上拉至高电平;当和锁存器相连的FET由截止至导通时,该电阻呈现较大阻值,限制了和端口锁存器相连的FET的导通电流。 51I/O口作为输入端和外部信号相连有时必须考虑上述特性,本人在设计LTP1245热敏打印头驱动板时,资料上推介热敏头“抬头”和“纸尽”信号由头中内嵌检测电路提供,MCU IO口采集该信号时需加缓冲(如74HC04)。当时本人认为51IO口上拉电阻为一较大阻值的固定电阻,对输入信号无影响,故未加缓冲电路(为降低成本能省则省)。可到调试PCBA时发现,“抬头”、“纸尽”状态变化时,采集信号只在3.90V--5.10V之间变化,应为低电平时无低电平输出。究其原因,打印头的“抬头”、“缺纸”信号输出为一光敏三极管的集电极输出,集电极和电源间原有一个负载电阻,饱和导通设计工作电流仅为450--1100微安,当该集电极直接和MCU IO口某位相连时,IO口上拉电阻和光敏三极管负载电阻并联,当IO口上拉时,上拉电阻极小致使光敏三极管直流负载线斜率陡然增大,工作状态进入放大区而非希望的饱和区。当时在不改硬件的条件下,我几乎无计可施,甚至想到了准备烧断IO口上拉电阻(前两天我曾发帖求救怎么烧断IO口上拉电阻的方法)后来听网友建议该方法风险较大,所以总想用软件方法解决。 后来我的解决方法是:采样信号前不是先向对应锁存器写1,而是先写入0,再写入1,延时约10毫秒以上,然后再采样(当然此法只适应于采样频率很低的情况)。这样作的目的是:先写入0迫使IO口上拉电阻先为一较大值,此时如果外部光敏三极管本来处于截止状态,当完成上述一系列锁存器的写入过程后光敏管仍为截止态,IO口正确采样到高电平;此时如果外部光敏三极管基极电流足够大有容许三极管饱和导通的条件(即基极吸收到充分光强),虽然采样一开始集电极被人为钳位在低电平,但当下一时隙和IO口相连的锁存器被写入1时,在IO口上拉电阻中的可变FET导通之前,光敏三极管已先进入饱和态而又把引脚钳位在实际输出的低电平,此时MCU IO口的上拉电阻仍为较大阻值,同时和原光敏三极管集电极负载电阻并联(考虑并联后阻值变化,原光敏三极管集电极负载电阻需增大到适当阻值)充当饱和导通后光敏三极管的负载电阻,事实上,IO口上拉电阻中的可变FET未来得及导通又被截止了,由此又保证了信号低电平的正确采样。经过波形测试问题得

51单片机的基本端口操作

第一章51单片机的基本端口操作 主要对单片机最简系统在实际应用中的使用方法,从简单到复杂地实现单片机最简系统的基本功能。 “点亮最简单的单片机系统”从单片机原理上介绍单片机的基本组成和最简单系统的典型电路,以及有关单片机C51编程方法和例程。 “更加明亮的小灯”从功能上介绍如何使LED发光稳定,从原理上介绍单片机I/O口的电气特性和使用方法。 “定时亮灭的小灯”介绍如何使LED灯定时亮、灭,从单片机原理上介绍定时器的使用和编程方法。 “小灯亮灭的人工控制”从功能上介绍如何通过按键控制LED灯的亮灭,从单片机原理上介绍单片机中断的使用和编程方法。 先复习下Keil 51的操作。 1.1点亮最简单的单片机系统 常用MCS-51系列单片机引脚功能说明 引脚定义引脚功能功能说明 Vcc +5V电源电源电压 Vss 地电路接地端 P0.0-P0.7 通道0 8位漏极开路的双向I/O通道 P1.0-P1.7 通道1 8位拟双向I/O通道

P2.0-P2.7 通道2 8位拟双向I/O通道 P3.0 RXD 串行输入口 P3.1 TXD 串行输出口 P3.2 INT0 外部中断0输入口 P3.3 INT1 外部中断1输入口 P3.4 T0 定时器/计数器0外部时间脉冲 输入端 P3.5 T1 定时器/计数器1外部时间脉冲 输入端 P3.6 WR 外部数据存储器写脉冲 P3.7 RD 外部数据存储器读脉冲 RST/VPD 复位输入信号该引脚上有2个机器周期的高电 平可以实现复位操作,在掉电情 况下将只给片内RAM供电 ALE/PROG 地址锁存有效 信号主要作用是提供一个适当的定时信号 PSEN 程序选通有效 信号低电平时,指令寄存器的内容读到数据总线上 EA/Vpp 片选使能当保持TTL高电平时,8051执行 内部ROM的指令;当使TTL为低 电平时,从外部程序存储器取出 所有指令

最新51单片机的基本端口操作

51单片机的基本端口 操作

第一章51单片机的基本端口操作 主要对单片机最简系统在实际应用中的使用方法,从简单到复杂地实现单片机最简系统的基本功能。 “点亮最简单的单片机系统”从单片机原理上介绍单片机的基本组成和最简单系统的典型电路,以及有关单片机 C51编程方法和例程。 “更加明亮的小灯”从功能上介绍如何使LED发光稳定,从原理上介绍单片机I/O口的电气特性和使用方法。 “定时亮灭的小灯”介绍如何使LED灯定时亮、灭,从单片机原理上介绍定时器的使用和编程方法。 “小灯亮灭的人工控制”从功能上介绍如何通过按键控制LED灯的亮灭,从单片机原理上介绍单片机中断的使用和编程方法。 先复习下Keil 51的操作。 1.1点亮最简单的单片机系统 常用MCS-51系列单片机引脚功能说明

提问:什么是单片机系统、 提问:单片机中晶振有什么作用? 回答:单片机访问一次存储器的时间,称之为一个及其周期, 是一个时间基准。一个机器周期包括12 个时钟周期。如果一个单片机选择了12MHz 晶振,它的时钟周期是 1/12us ,它的一个机器周期是 12X (1/12us ),也就是 1us 。 若是12MHz 的晶振,当单片机中定时 /计数器的数值加 1时,实际经过的时间就是 1us 。 提示:晶振电路,复位电路

基本电路图: 发光二极管导通压降通常为1.7V-1.9V; 为什么要接电阻? 电路原理及器件选择? 89C51:单片机,控制发光二极管亮灭 OSC:晶振,在本例中选择12MHz的立式晶振C3,C2:晶振电路的起振电容,容值为22pF

L1:发光二极管 R1:限流电阻,阻值为1k欧 地址分配和连接? P1.0:与发光二极管电路相连,控制LED发光二极管阴极的电平高低 RESET:复位引脚 X1,X2:单片机的晶振引脚 程序设计: 延时程序:我们先不使用单片机的定时器,而是直接采用软件的延时程序定时控制发光二极管的亮灭。在12M晶振时,一个指令周期为1us,那么1M次就是1s。 程序代码: #include sbit gate=P1^0; //位定义 void main(void) { unsigned int i,j; while(1) { for(i=1000;i>0;i--) //双重循环,延时约1s

单片机IO口结构与工作原理

一、P0端口的结构及工作原理 P0端口8位中的一位结构图见下图: 由上图可见,P0端口由锁存器、输入缓冲器、切换开关、一个与非门、一个与门及场效应管驱动电路构成。 下面,先分析组成P0口的各个部分: 先看输入缓冲器:在P0口中,有两个三态的缓冲器,在其的输出端可以是高电平、低电平,同时还有一种就是高阻状态(或称为禁止状态),上面一个是读锁存器的缓冲器,下面一个是读引脚的缓冲器,读取P0.X引脚上的数据,要使这个三态缓冲器有效,引脚上的数据才会传输到部数据总线上。 D锁存器:在51单片机的32根I/O口线中都是用一个D触发器来构成锁存器的。D端是数据输入端,CP是控制端(也就是时序控制信号输入端),Q是输出端,Q非是反向输出端。 多路开关:在51单片机中,不需要外扩展存储器时,P0口可以作为通用的输入输出端口(即I/O)使用,对于8031(部没有ROM)的单片机或者编写的程序超过了单片机部的存储器容量,需要外扩存储器时,P0口就作为‘地址/数据’总线使用。这个多路选择开关就是用于选择是做为普通I/O口使用还是作为‘数据/地址’总线使用的选择开关了。当多路开关与下面接通时,P0口是作为普通的I/O口使用的,当多路开关是与上面接通时,P0口是作为‘地址/数据’总线使用的。 输出驱动部份:P0口的输出是由两个MOS管组成的推拉式结构,也就是说,这两个MOS管一次只能导通一个,当V1导通时,V2就截止,当V2导通时,V1截止。

P0口作为I/O端口使用时,多路开关的控制信号为0(低电平),V1管截止,多路开关是与锁存器的Q非端相接的(即P0口作为I/O口线使用)。作为地址/数据线使用时,多路开关的控制信号为1,V1管由地址/数据线决定,多路开关与地址/数据线连接。 输出过程: 1、I/O输出工作过程:当写锁存器信号CP有效,数据总线的信号→锁存器的输入端D→锁存器的反向输出Q非端→多路开关→V2管的栅极→V2的漏极到输出端P0.X。这时多路开关的控制信号为低电平0,V1管是截止的,所以作为输出口时,P0是漏极开路输出,类似于OC门,当驱动上接电流负载时,需要外接上拉电阻。 下图就是由部数据总线向P0口输出数据的流程图(红色箭头)。 2、地址输出过程 控制信号为1,地址信号为“0”时,与门输出低电平,V1管截止;反相器输出高电平,V2管导通,输出引脚的地址信号为低电平。

51单片机IO端口的四种输入输出模式

51单片机IO端口的四种输入输出模式(by wuleisly) 单片机I O口的使用对所有单片机玩家来说都是“家常便饭”,但是你真的了解I O 口吗?你真的能按你的需要配置I O口吗? 一、准双向口输出 准双向口输出类型可用作输出和输入功能而不需重新配置 口线输出状态。这是因为当口线 输出为1时驱动能力很弱,允许外部装置将其拉低。当引脚输出为低时,它的驱动能力很强, 可吸收相当大的电流。(准双向口有3个上拉晶体管适应不同的需要) 准双向口读外部状态前,要先锁存为…1?,才可读到外部正确的状态. 二、强推挽输出 推挽输出配置的下拉结构与开漏输出以及准双向口的下拉 结构相同,但当锁存器为1时提供持续的强上拉。推挽模式一般用于需要更大驱动电流的情况。 三、仅为输入(高阻) 输入口带有一个施密特触发输入以及一个干扰抑制电路。 四、开漏输出配置(若外加上拉电阻,也可读) 当口线锁存器为0时,开漏输出关闭所有上拉晶体管。当作为一个逻辑输出时,这种配置方式必须有外部上拉,一般通过电阻外接到V c c。如果外部有上拉电阻,开漏的I/O口还可读外部状态,即此时被配置为开漏模式的I/O口还可作为输入I/O口。这种方式的下拉与准双向口相同。 开漏端口带有一个施密特触发输入以及一个干扰抑制电路。 关于I/O口应用注意事项: 1.有些是I/O口由低变高读外部状态时,读不对,实际没有损坏,软件处理一下即可。 因为1T的8051单片机速度太快了,软件执行由低变高指令后立即读外部状态,此时由于实际输出还没有变高,就有可能读不

对,正确的方法是在软件设置由低变高后加1到2个空操作指令延时,再读就对了. 有些实际没有损坏,加上拉电阻就OK了 有些是外围接的是NP N三极管,没有加上拉电阻,其实基极串多 大电阻,I/O口就应该上拉多大的电阻,或者将该I/O口设置为强 推挽输出. 2.驱动L E D发光二极管没有加限流电阻,建议加1K以上的限流电阻,至少也要加470欧姆以上 做行列矩阵按键扫描电路时,实际工作时没有加限流电阻,实际工作时可能出现2个I/O口均输出为低,并且在按键按下时,短接在一起,我们知道一个C MOS电路的2个输出脚不应该直接短接在一起,按键扫描电路中,此时一个口为了读另外一个口的状态,必须先置高才能读另外一个口的状态,而8051单?片机的弱上 拉口在由0变为1时,会有2时 钟的强推挽高输出电流输出到另外一个输出为低的I/O口,就有 可能造成I/O口损坏.建议在其中的一侧加1K限流电阻,或者在 软件处理上,不要出现按键两端的I/O口同时为低. 一种典型三极管控制电路: 如果用弱上拉控制,建议加上拉电阻R1(3.3K~10K),如果不加上拉电阻R1(3. 3K~10K), 建议R2的值在15K以上,或用强推挽输出。 典型发光二极管控制电路:

51单片机原理期末考试题

广西工学201 2011学年 2学期课程考核试 考核课单片机技卷)考核班通08082 考核类闭学生人 8 打印份 8 一、填空题(每小分,2分 1.若累加器A中的数据为67H,则PSW中的P=_1__。 2. 一个机器周期= _6_个状态周期=12个振荡周期。 3.89C51的堆栈是按照先进后出的原则进行存取的RAM区。 4. 用一条指令实现以下功能: 若A中数据不等于200,则程序转至PROM_ CJNZ A,#200H,PROM__。 5. 为了使10H—17H作工作寄存器使用RS1, RS0的取值为__1,0。 6. 89C51中21个特殊功能寄存器,其地址凡是能被8整除的都有位寻址功能。 7. 89C51单片机有片内ROM容量_4KB , RAM容量128。 8. 某串行通信中有1个起始位,8个数据位和1个停止位,应选择的异步串行通信方式为方式1。 9. 在89C51单片机初始化时,SP存放的是07H。 10. 当89C51引脚ALE信号有效时,表示从P0口稳定地送出了_数据和地信息。 四、判断题(每小题2分,共20分) 1.如果发生除法溢出错误,则PSW标志位P置1。(∨) 5.对于89C51单片机,当CPU对内部程序存储器寻址超过4K时,系统会自动在外部程序存储器中寻址(∨)。 6.外加晶振频率越高,系统运算速度也就越快,系统性能也就越好(∨)。 7. 位TF0是定时器T1的溢出中断标志位。(∨) 8.在定时器T0和外部中断1都设为高优先级时,外部中断1优先级高于定时器T0。(×) 9.子程序的返回指令是RETI ,中断程序的返回指令是RET。(×) 10.波特率是数据传输的速率,指每秒传送的字节数。(∨) 3、51有 5个中断源,有2个中断优先级,优先级由软件填写特殊功能寄存器 IP 加以选择 4、中断请求信号有电平触发和脉冲触发两种触发方式。 6、74LS273通常用来作简单输出接口扩展;而74LS244则常用来作简单输入接口扩展。 7、A/D转换器的三个重要指标是转换速度、分辨率和转换精度。 二、选择题(从备选答案中选择一个正确答案,并将代号写在括号内。每题2分,共10分) 1、MCS-51单片机外扩存储器芯片时,4个I/O口中用作数据总线的是( B )。 (A)P0和P2口(B)P0口(C)P2和P3口(D)P2口 2、访问外部数据存储器时,不起作用的信号是( C )。 WRPSENRD(D)(CA))(B)ALE (3、使用定时器T1时,有几种工作模式( C )。 (A)1种(B)2种(C)3种(D)4种 4、MCS-51响应中断时,下面哪一个条件不是必须的( C )。 A、当前指令执行完毕 B、中断是开放的 C、没有同级或高级中断服务 D、必须有RETI指令 5、当MCS-51进行多机通讯时,串行接口的工作方式应选为( C )。 (A)方式0 (B)方式1 (C)方式2 (D)方式0或方式2 三、简答题(每题15分,共30分) 1、MCS-51单片机内部有几个定时/计数器?它们由哪些寄存器组成? 答:MCS-51单片机内部有两个16位可编程的定时/计数器,简称定时器0(T0)和定时器1(T1)。它们分别由方式寄存器TMOD、控制寄存组成。TL1、TH1,TL0、TH0和数据寄存器TCON器. 一、填空题(每空1分,共20分) 1、计算机的系统总线有地址总线、控制总线和数据总线。 2、通常、单片机上电复位时PC= 0000H ,SP= 07H ;而工作寄存器则缺省采用第 00 组,这组寄存器的地址范围是从000H~007H 。 3、JZ e 的操作码地址为1000H,e=20H,它转移的目标地址为 1022H 。 4、汇编语言中可以使用伪指令,它们不是真正的指令,只是用来对汇编过程进行 某种控制进行某种控制。

实验二单片机IO口的使用

姓名:学号:日期: 实验二单片机I/O口的使用 一、实验名称:单片机I/O口的使用 二、实验目的 1.掌握在Keil环境下建立项目、添加、保存源文件文件、编译源程序的方法; 2.掌握运行、步进、步越、运行到光标处等几种调试程序的方法; 3.掌握在Proteus环境下建立文件原理图的方法; 4.实现Proteus与Keil联调软件仿真。 三、使用仪器设备编号、部件及备件 1.实验室电脑; 2.单片机实验箱。 四、实验过程及数据、现象记录 1.在Proteus环境下建立如下仿真原理图,并保存为文件; 原理图中常用库元件的名称: 无极性电容:CAP 极性电容:CAP-ELEC 单片机:AT89C51 晶体振荡器:CRYSTAL 电阻:RES 按键:BUTTON 发光二极管:红色LED-RED 绿色LED-GREEN 蓝色LED-BLUE 黄色LED-YELLOW 2.在Keil环境下建立源程序并保存为.ASM文件,生成.HEX文件; 参考程序如下: ORG 0000H LJMP MAIN ORG 0100H MAIN: MOV A,# H LOOP: MOV P2,A CALL DELAY SJMP LOOP DELAY: MOV R1,# H DL1: MOV R2,# H DL2: MOV R3,# H DJNZ R3,$

DJNZ R2,DL2 DJNZ R1,DL1 RET END 将以上程序补充完整,流水时间间隔为50ms。 3.将.HEX文件导入仿真图,运行并观察结果; 4.利用Keil软件将程序下载至实验箱,进行硬件仿真,观察实验结果。 五、实验数据分析、误差分析、现象分析 现象:进行软硬件仿真时,观察到8支LED发光二极管流水发光。 六、回答思考题 1.如何让改变流水方向? 2.若将R3至R10上拉电阻省略,8支LED还能正常发光吗? 3.如果将LED接到P0口与接到P2口硬件设计时应注意什么问题? Keil软件建立项目的方法: 1.新建项目 2.新建文件 3.添加文件 4.设置选项 5.重建所有目标文件 6.调试仿真

51单片机管脚说明

51单片机管脚说明(2007-06-26 15:46) 分类:单片机资料几学习心得 51单片机管脚说明 发表日期:2007-06-16 00:12:46 点击数:10 当我们拿到一块单片机芯片时,看到这么多的“大腿”,他们都有干什么用的?了解了51家族的渊源,现在我们就去了解一下它们的“腿”吧.大家可得学好了,这可是至关重要的哟.如果连手跟腿都分不清,要学好单片机那就有如凭空造屋了. 这一章节相当管用,希望大家能用心学好,如果这一章节学不好,以后学习会有很大的阻力.(我们的教材都是以51系列的单片机来进行讲解的). 引脚功能: MCS-51是标准的40引脚双列直插式集成电路芯片,引脚分布请参照----单片机引脚图: l P0.0~P0.7 P0口8位双向口线(在引脚的39~32号端子). l P1.0~P1.7 P1口8位双向口线(在引脚的1~8号端子). l P2.0~P2.7 P2口8位双向口线(在引脚的21~28号端子). l P3.0~P3.7 P2口8位双向口线(在引脚的10~17号端子). 这4个I/O口具有不完全相同的功能,大家可得学好了,其它书本里虽然有,但写的太深,对于初学者来说很难理解的,我这里都是按我自已的表达方式来写的,相信你也能够理解的. P0口有三个功能: 1、外部扩展存储器时,当做数据总线(如图1中的D0~D7为数据总线接口) 2、外部扩展存储器时,当作地址总线(如图1中的A0~A7为地址总线接口) 3、不扩展时,可做一般的I/O使用,但内部无上拉电阻,作为输入或输出时应在外部接上拉电阻. P1口只做I/O口使用:其内部有上拉电阻. P2口有两个功能:

51单片机的电子钟以及lcd1602显示器的工作原理

51单片机的电子钟以及lcd1602显示器的工作原理 基于51单片机的电子钟C语言程序 #include #include #define uchar unsigned char #define uint unsigned int /*七段共阴管显示定义*/ uchar code dispcode[ ]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F, 0xBF,0x86,0xCB,0xCF,0xEF,0xED,0xFD,0x87,0xFF, 0xDF}; /*定义并初始化变量*/ uchar seconde=0; uchar minite=0; uchar hour=12; uchar mstcnt=0; sbit P1_0=P1^0; // second 调整定义 sbit P1_1=P1^1; //minite调整定义 sbit P1_2=P1^2; //hour调整定义 /*函数声明*/ void delay(uchar k ); //延时子程序 void time_pro( ); //时间处理子程序 void display( ); //显示子程序 void keyscan( ); //键盘扫描子程序 /*****************************/ /*延时子程序*/ /****************************/ void delay (uchar k) { uchar j; while((k--)!=0) { for(j=0;j<125;j++) {;} } } /**************************/ /*时间处理子程序*/ /**************************/ void time_pro( void) {

51单片机考试常见简答题

简答题部分 1、51 单片机内部集成的功能部件? MCS-51单片机在片内集成了中央处理器( CPU)、程序存储器(ROM )、数据存储器(RAM )、定时器/计数器、并行I/O 接口、串行I/O 接口和中断系统等几大单元。CPU 是整个单片机的核心部件,由运算器和控制器组成。运算器可以完成算术运算和逻辑运算,其操作顺序在控制器控制下进行。 控制器是由程序计数器PC (Program Counter)、指令寄存器IR (Instruction Register)、指令译码器ID (Instruction Decoder )、定时控制逻辑和振荡器OSC等电路组成。CPU根据PC中的地址将欲执行指令的指令码从存储器中取出,存放在IR中,ID对IR中的指令码进行译码,定时控制逻辑在OSC配合下对ID译码后的信号进行分时,以产生执行本条指令所需的全部信号。程序存储器(ROM ) 用于存储程序、常数、表格等。数据存储器( RAM )用于存储数据。8051 内部有两个16位可编程序的定时器/计数器TO和T1,均为二进制加1计数器。可用于定时和对外部输入脉冲的计数。8051的中断系统主要由中断允许控制器IE和中断优先级控制器IP等电路组成。可实现对5个中断源的 管理。8051的中断系统主要由中断允许控制器IE和中断优先级控制器IP等电路组成。其中,IE用 于控制 5 个中断源中哪些中断请求被允许向CPU 提出,哪些中断源的中断请求被禁止;IP 用于控制 5 个中断源的中断请求的优先权级别。I/O 接口是MCS-51 单片机对外部实现控制和信息交换的必经之路,用于信息传送过程中的速度匹配和增加它的负载能力。可分为串行和并行I/O 接口。 2、51 的程序存储器、外部存储器、内部存储器各自的容量与地址范围? 小抄补充) 1、片内外统一编址的64K的程序存储器地址空间(MOVC ) 2、256B 的片内数据存储器的地址空间( MOV) 3、以及64K 片外数据存储器的地址空间( MOVX ) 在访问三个不同的逻辑空间时,应采用不同形式的指令以产生不同的存储器空间的选通信号程序ROM 寻址范围:0000H ~ FFFFH 容量64KB EA = 1 ,寻址内部ROM;EA = 0, 寻址外部ROM 地址长度:16 位 作用:存放程序及程序运行时所需的常数 数据存储器片内数据存储器为8位地址,所以最大可寻址的范围为256个单元地址,对片外数据存储器采用间接寻址方式,R0、R1 和DPTR 都可以做为间接寻址寄存器,R0、R1 是8位的寄存器,即R0、R1 的寻址范围最大为256 个单元,而DPTR 是16位地址指针,寻址范围就可达到64KB。 也就是说在寻址片外数据存储器时,寻址范围超过了256B,就不能用RO、R1做为间接寻址寄存器, 而必须用DPTR 寄存器做为间接寻址寄存器。

LCD1602工作原理及与51单片机的接口电路

1602LCD 分为带背光和不带背光两种,基控制器大部分为HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别 1602LCD 主要技术参数: 显示容量:16×2 个字符 芯片工作电压:4.5—5.5V 工作电流:2.0mA(5.0V) 模块最佳工作电压:5.0V 字符尺寸:2.95×4.35(W×H)mm 引脚功能说明 1602LCD 采用标准的 14脚(无背光)或 16脚(带背光)接口,各引脚接口说明如表 10-13所示: 编号符号引脚说明编号符号引脚说明 1 VSS 电源地 9 D 2 数据 2 VDD 电源正极 10 D 3 数据 3 VL 液晶显示偏压 11 D 4 数据 4 RS 数据/命令选择 12 D 5 数据 5 R/W 读/写选择 13 D 6 数据 6 E 使能信号 14 D 7 数据 7 D0 数据 15 BLA 背光源正极 8 D1 数据 16 BLK 背光源负极 表 10-13:引脚接口说明表 第 1 脚:VSS 为地电源。 第 2 脚:VDD接 5V正电源。 第 3 脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个 10K 的电位器调整对比度。 第 4 脚:RS 为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。 第 5 脚:R/W 为读写信号线,高电平时进行读操作,低电平时进行写操作。当 RS和 R/W 共同为低电平时可以写入指令或者显示地址,当 RS 为低电平 R/W 为高电平时可以读忙信号,当 RS 为高电平 R/W为低电平时可以写入数据。 第 6 脚:E端为使能端,当 E 端由高电平跳变成低电平时,液晶模块执行命令。 第 7~14脚:D0~D7为 8 位双向数据线。 第 15脚:背光源正极。 第 16脚:背光源负极。 LCD寄存器的选择

相关文档
最新文档