C51单片机的最小系统是C51单片机运行的基本条件,由包括电源电路、时钟电路和复位电路三部分组成。其中,电源电路负责提供+5V直流电;时钟电路由电容和石英晶振构成,负责提供基准时钟信号;而复位电路则用于将单片机重置到初始状态。

单片机控制led灯程序设计

如图所示,18、19引脚上连接了由电容和石英晶振构成的时钟电路;9引脚外为复位电路,当此引脚上获得高电平时,单片机会中断当前执行的程序,并在重新恢复低电平后重新运行;20引脚连接+5V DC,以提供电源。

当最小系统上电后,若不进行任何操作时,各组输出总线的各个接口均处于高电平状态;如果让单片机执行某些特定的程序,则能改变各组总线的接口的电平,进而控制某些外周电路的工作。

对于较常见的DIP40封装的ATMEL公司生产的89C51系列单片机而言,通常会提供四组输出总线,使用适当的程序和外周电路,可以轻松实现一些较复杂的控制。

最小系统对LED的控制基本思路

单片机控制led灯程序设计

1.外周电路的连接

对于LED而言,在有适当的电流流过时,就会发光,而利用最小系统可以控制各组输出总线上的电平,若将LED接在输出总线上,改变总线上的电平,就能实现对LED的控制。

当LED的PN结的P端处于高电平、N端处于低电平时,且两端的电势差高于导通电压时,就会有电流流过。因此易知有两种方法可以将LED接在单片机的输出总线上。

(1)共地接法

单片机控制led灯程序设计

采用这种接法时,当输出总线处于高电平时,LED工作。因此,在不执行程序时,单片机上电后,采用此种接法的LED会直接工作。

(2)共源接法

单片机控制led灯程序设计

采用这种接法时,当输出总线处于低电平时,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采用共源接法进行讨论。

单片机控制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;

};

}

  • UC3846控制芯片工作原理控制图 逆变焊机原理与用途
  • 数字万用表电阻档测试二极管正反向没有阻值(使用万用表测量二极管的正向电阻,为什么各档)
  • 学单片机需要学数电模电吗(学单片机要先学数电模电吗)
  • 电工怎么选择适合自己用的万用表(电工初学者买什么样的万用表好)
  • 单片机需要同时运行多个任务怎么办(单片机怎么同时执行多个任务)
  • 电机保护的方案取决于负载的机械特性
  • 绝缘电阻表正负搭接不复零位是怎么回事
  • 短路怎么用万用表查