编程控制8位LED循环点亮
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口也可以执行同样的操作。