目录
开发工具
Keil uVision4
下载软件
PZ-ISP
第一步创建工程
首先先创建一个文件夹
这个文件夹用来存放项目工程的文件
新建一个文件夹
创建项目并打开
第二步编写程序
LED区域原理图
方法一(代码非常的繁琐但是通俗易懂)
思路
灯的点亮,从原理图中我们可以看到LED灯的一端为高电平,我们这个时候只需要给一个低电平就可以实现灯的点亮。可以用sbit来控制相应的IO口的电位。来给与相应的端口低电平实现灯的点亮。
sbit LED1=P2^0;
sbit LED2=P2^1;
sbit LED3=P2^2;
sbit LED4=P2^3;
sbit LED5=P2^4;
sbit LED6=P2^5;
sbit LED7=P2^6;
sbit LED8=P2^7;
要想实现流水灯,那必须要实现八个灯每隔一段时间都只有一个灯亮,其余灯熄灭,这时候我们就很容易想到要定义一个函数进行时间的延时代码如下
void delay_10us(int ten_us) //当ten_us=1时,大概延时10us
{
while(ten_us--);
}
编辑完成时间延时函数后,我们还控制每个灯在的点亮与熄灭。这时候我们就可以通过sbit来控制相应的IO口的电位。将一个端口的电平设置为低电平,其余设置为高电平就可以实现一个灯的点亮,其余灯的熄灭,再通过时间函数的延时就可以实现流水灯的循环显示了
一下是代码的实现:
#include "reg52.h"
sbit LED1=P2^0; //定义IO口
sbit LED2=P2^1;
sbit LED3=P2^2;
sbit LED4=P2^3;
sbit LED5=P2^4;
sbit LED6=P2^5;
sbit LED7=P2^6;
sbit LED8=P2^7;
void delay_10us(int ten_us) //当ten_us=1时,大概延时10us
{
while(ten_us--);
}
void main()
{
while(1)
{
LED1=0; //给这个接口一个低电平 只有LED1灯点亮,其余熄灭
LED2=1;
LED3=1;
LED4=1;
LED5=1;
LED6=1;
LED7=1;
LED8=1;
delay_10us(50000);
LED1=1;
LED2=0; //给这个接口一个低电平 只有LED2灯点亮,其余熄灭
LED3=1;
LED4=1;
LED5=1;
LED6=1;
LED7=1;
LED8=1;
delay_10us(50000);
LED1=1;
LED2=1;
LED3=0; //给这个接口一个低电平 只有LED3灯点亮,其余熄灭
LED4=1;
LED5=1;
LED6=1;
LED7=1;
LED8=1;
delay_10us(50000);
LED1=1;
LED2=1;
LED3=1;
LED4=0; //给这个接口一个低电平 只有LED4灯点亮,其余熄灭
LED5=1;
LED6=1;
LED7=1;
LED8=1;
delay_10us(50000);
LED1=1;
LED2=1;
LED3=1;
LED4=1;
LED5=0; //给这个接口一个低电平 只有LED5灯点亮,其余熄灭
LED6=1;
LED7=1;
LED8=1;
delay_10us(50000);
LED1=1;
LED2=1;
LED3=1;
LED4=1;
LED5=1;
LED6=0; //给这个接口一个低电平 只有LED6灯点亮,其余熄灭
LED7=1;
LED8=1;
delay_10us(50000);
LED1=1;
LED2=1;
LED3=1;
LED4=1;
LED5=1;
LED6=1;
LED7=0; //给这个接口一个低电平 只有LED7灯点亮,其余熄灭
LED8=1;
delay_10us(50000);
LED1=1;
LED2=1;
LED3=1;
LED4=1;
LED5=1;
LED6=1;
LED7=1;
LED8=0; //给这个接口一个低电平 只有LED8灯点亮,其余熄灭
delay_10us(50000);
}
}
方法二(代码简短,比较推荐)
实现思路如下
主要是通过位移函数来实现的,首先我们得知道位移函数_crol_的用法,我们先定义了端口P2=~0x01,即P2^0~P27这七个端口的电位为11111110此时只有LED1是点亮的,其余都是熄灭状态。
通过_crol_(P,1)可以实现P2^0~P27这七个端口的电位变为11111101,此时只有LED2是点亮的,其余都是熄灭状态。,如果通过一个for循环的话,下一次P2^0~P27这七个端口的电位变为11111011此时只有LED3是点亮的,其余都是熄灭状态。以此类推将for循环操作,使得灯可以从左往右边依次循环点亮,就达到了流水灯的效果
P2=_crol_(P2,1);
将代码完整后如下
#include "reg52.h"
#include "intrins.h" //位移函数的使用需要调用函数库
void delay_10us(int ten_us) //定义时间延时函数
{
while(ten_us--);
}
void main()
{
int i=0; //定义初值
P2=~0x01; // 通过直接给P2口赋值实现灯的的点亮 ~符号表示取反,1变0,0变1
delay_10us(50000); //进行延时
while(1)
{
for(i=0;i<7;i++) //将led左移一位
{
P2=_crol_(P2,1); // 实现灯从左往右灯的点亮
delay_10us(50000);
}
}
}
方法三(代码简短,比较推荐)
方法思路
我们要实现流水灯还可以用for循环的方法,先将每一个LED单独现实的电位表示出来,并用数组将这些储存起来
LED[8]= {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f} ;
其中LED1单独显示的编码为 11111110用十六进制表示为0xfe,LED2单独显示的编码为 11111101用十六进制表示为0xfd后面剩余的LED显示以此类推
后面的代码完善如下
#include "reg52.h"
LED[8]= {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f} ; //将LED1~LED8单独显示时的电位显示存贮在数组里
void delay_10us(int ten_us) //当ten_us=1时,大概延时10us
{
while(ten_us--);
}
void main()
{
int i ;
while(1)
{
for(i=0;i<8;i++)
{
delay_10us(50000); //延时一段时间
P2 = LED[i] ;
}
}
}