现在的位置: 首页 > 综合 > 正文

编程控制8位LED循环点亮

2017年12月14日 ⁄ 综合 ⁄ 共 1332字 ⁄ 字号 评论关闭

   
8个LED正极通过1千欧的限流电阻接到电源正极,负极接单片机控制端P0口。只要P0口管脚输出低电平,对应的LED就会被点亮。原理图如下:

 

    单片机控制外部器件是通过I/O口的操作来实现的,因此对外围器件的操作,实际上是对I/O口的操作。

    编程如下:

1、循环左移

#include<reg51.h>              //51系列单片机头文件包含对单片机内部寄存器等的定义
#include<intrins.h>            //本征函数头文件,包含此头文件可以在程序中直接调用本征函数_crol_(a,n)
#define uchar unsigned char     /*以下三句属宏定义语句,以#define LED P0为例,它表示在以后的程序中LED就表示P0,目的在于提高程序的可读性。*/
#define uint unsigned int
#define LED P0
void delay()      /*延时1秒子程序,单片机的C程序中通常会采用这种软件延时的方式,但这种延时并不准确*/
{
 uint a,b;
 for(a=0;a<=350;a++);
  for(b=0;b<=32000;b++);   /*在板子上实验了很多次,觉得这样延时LED的闪烁速度比较合适。*/
   
   
}
void main()      /*主程序,通常情况下,主程序要尽量简单,功能模块尽可能在子程序中实现。*/
{
 uchar temp;
 LED=0xff;      /*初始化P0口.*/
 temp=0xfe;     /*设置初始值。*/
 while(1)
 {
  LED=temp;     /*让第一个LED点亮。*/
  temp=_crol_(temp,1);    /*循环点亮。循环右移:_cror_*/
  delay();              /*调用1s延时子程序*/
 }
}

2、数组实现LED的循环闪烁

#include<reg51.h>    
#define uchar unsigned char
#define uint unsigned int
void delay(uint i);         /*函数声明,让编译器知道有这个函数,防止调用的时候找不到。就像变量使用前要定义一样。也可以把下边的delay函数体提到main函数上边,就不需要函数声明了。*/
uchar led_data[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};   /*数组包含led_data[0]到led_data[7]*/
void main()       1111 1110                              1101 1111
{
 uint i;
 while(1) 
 {
  for(i=0;i<8;i++)
  {
   P0=led_data[i];
   delay(60000);
   P0=0xff;
   delay(60000);
  }
 }
}
void delay(uint i)    /*delay函数的函数头,形式必须和函数声明的形式一致。*/
{
 while(i--);
}
以上方法只是以P0口为例,对P1口也可以执行同样的操作。

抱歉!评论已关闭.