C51单片机的最小系统是C51单片机运行的基本条件,由包括电源电路、时钟电路和复位电路三部分组成。其中,电源电路负责提供+5V直流电;时钟电路由电容和石英晶振构成,负责提供基准时钟信号;而复位电路则用于将单片机重置到初始状态。
如图所示,18、19引脚上连接了由电容和石英晶振构成的时钟电路;9引脚外为复位电路,当此引脚上获得高电平时,单片机会中断当前执行的程序,并在重新恢复低电平后重新运行;20引脚连接+5V DC,以提供电源。
当最小系统上电后,若不进行任何操作时,各组输出总线的各个接口均处于高电平状态;如果让单片机执行某些特定的程序,则能改变各组总线的接口的电平,进而控制某些外周电路的工作。
对于较常见的DIP40封装的ATMEL公司生产的89C51系列单片机而言,通常会提供四组输出总线,使用适当的程序和外周电路,可以轻松实现一些较复杂的控制。
最小系统对LED的控制基本思路
1.外周电路的连接
对于LED而言,在有适当的电流流过时,就会发光,而利用最小系统可以控制各组输出总线上的电平,若将LED接在输出总线上,改变总线上的电平,就能实现对LED的控制。
当LED的PN结的P端处于高电平、N端处于低电平时,且两端的电势差高于导通电压时,就会有电流流过。因此易知有两种方法可以将LED接在单片机的输出总线上。
(1)共地接法
采用这种接法时,当输出总线处于高电平时,LED工作。因此,在不执行程序时,单片机上电后,采用此种接法的LED会直接工作。
(2)共源接法
采用这种接法时,当输出总线处于低电平时,LED工作。因此,在不执行程序时,单片机上电后,采用此种接法的LED不会工作。
2.算法对输出总线的控制
把LED接在个输出总线上,用算法控制各输出总线的电平,就能实现利用算法控制LED的工作。按照算法对输出总线的控制方式,可以分成两类控制方式。
(1)位操作
定义一个变量,并用“ sbit ”函数声明其为位变量,并且为其定义输出总线上的端口,则在给这个变量赋值时,就能实现对具体的某一总线上的某一个端口的电平的控制。
其中,声明总线用Pα表示(α为总线编号),若需要声明α总线上的β端口,则为Pα^β。当端口被赋值为0时,为低电平,当端口被赋值为时,为1电平。
(2)总线操作
以Pα(α为总线编号)形式声明一条总线,并以“ |= ”形式为其赋予一个16进制的值,则能对整个总线上的端口进行操作。
使用这种操作方式时,端口的电平按十六进制换算为二进制后、各端口的编号从低到高的顺序依次排位的方式进行控制。当端口被赋值为0时,为低电平,当端口被赋值为时,为1电平。(例如,Pα|=0x00时,Pα总线上各个端口均为低电平;Pα|=0xFF时,Pα总线上的各个端口均为高电平; Pα|=0x1F时,Pα总线上的0~4端口为高电平,5~7端口为低电平。)
值得注意的是,总线操作得以实现,是因为51单片机的16位地址总线和低八位地址锁存,低八位又复用做数据总线。由于51的沿革,尽管越来越多的51内部集成了若干外设,但硬内核没变,所以一直通用这种操作方法。
3.单片机控制LED部分应用方式算法
由于算法实际控制的是C51单片机上各总线上的各个端口的电平,通过改变端口的电平进而实现对LED的控制,加上C51单片机种类繁多,不同厂商生产的C51单片机和不同的外围电路设计,所需采用的算法不尽相同。因此,以下讨论限定于对ATMEL公司生产的AT89C52单片机、LED采用共源接法进行讨论。
以下算法基于此图中的外周电路设计:
1.点亮特定的LED灯ww.dgzj.com
(1)位操作点亮D2和D4
#include
sbit L2= P0^2;
sbit L4= P0^4;
void main()
{
L2=0;
L4=0;
}
(2)总线操作点亮D2和D4
#include
void main()
{
P0|=0xF5;
}
2.点亮所有的LED灯
(1)位操作
#include
sbit L1= P0^0;
sbit L2= P0^1;
sbit L3= P0^2;
sbit L4= P0^3;
sbit L5= P0^4;
sbit L6= P0^5;
sbit L7= P0^6;
sbit L8= P0^7;
void main()
{
L1=0;
L2=0;
L3=0;
L4=0;
L5=0;
L6=0;
L7=0;
L8=0;
}
(2)总线操作
#include
void main()
{
P0|=0x00;
}
3.令LED灯循环闪烁
(1)令D3循环闪烁
#include
sbit L3= P0^2;
unsigned int i;
void main()
{
while (1)
{
L3=0;
for(i=0;i
L3=1;
for(i=0;i
}
}
(2)令D5和D6循环交替闪烁
#include
sbit L5= P0^4;
sbit L6=P0^5;
unsigned int i;
void main()
{
L5=0,L6=1;
for(i=0;i
L5=1,L6=0;
for(i=0;i
}
4.令LED灯依次亮起
#include
#define LED P0
void main()
{
while (1)
{
int a=0xFF,b,c=1,d;
for(b=1;b
{
c*=2;
a-=c;
for(d=0;d
LED|=a;
};
};
}
5.流水灯
#include
main ()
{
int a=0xfe,b,c,d;
for (b=0;b
{
for (d=0;d
P0 |=a;
if (b==0)
c=0;
else c=b*2;
a-=c;
if (a==0x7f)
break;
};
}