如何用多种代码实现51单片机流水灯
2017-12-18 12:16
260 查看
用51单片机实现流水灯的方法有多种:普通电灯法,位移法,数组法。其次模拟电路的电流图也与点一盏LED相似。具体如下:
一 首先是最简单的代码:
#include <reg52.h> //头文件
sbit led0=P0^0;
sbit led1=P0^1; // 定义八盏灯,并规定每个灯的io接口
sbit led2=P0^2;
sbit led3=P0^3;
sbit led4=P0^4;
sbit led5=P0^5;
sbit led6=P0^6;
sbit led7=P0^7;
void delay(void) // 声明延迟函数
{
unsigned char a,b; //定义两个变量a,b
for(a=0;a<200;a++)
for(b=0;b<200;b++); //这是两个for循环嵌套。用分号来区分。
} // 每当a循环一次,b都要循环200次。同时200也是灯闪烁的时间。
void main() //主函数
{
led0=0; //点亮第一个灯泡
delay(); // 延时函数
led0=1; //熄灭灯泡
delay(); //延时 通过这一系列过程实现闪烁
led1=0;
delay();
led1=1;
delay();
led2=0;
delay();
led2=1;
delay();
led3=0;
delay();
led3=1;
delay();
led4=0;
delay();
led4=1;
delay();
led5=0;
delay();
led5=1;
delay();
led6=0;
delay();
led6=1;
delay();
led7=0;
delay(); 但是该方法存在弊端:需要一个个的定义变量。如果需要同时让许多灯点亮的话则不大方便。代码过于繁琐。因此可以使用其他两种方法
led7=1;
delay();
led8=0;
delay();
led8=1;
delay();
}
二 使用数组的方法点亮十六盏流水灯
#include <reg52.h>
unsigned char table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff}; //宏函数 定义数组,这里的数组均是可以使其亮的顺序。因为
void delay(void) 要使十六盏灯亮,所以需要在后面加上0xff(11111111)即全灭
{ 如果不是需要十六盏则不需要加上最后一个数组。
unsigned char a,b; //声明函数,声明灯的闪烁情况,与上一个代码相同。
for(a=0;a<200;a++)
for(b=0;b<200;b++); // for 语句循环嵌套
}
void main()
{
unsigned char i;
while(1) // while语句是为了使使循环持续进行
{
for(i=0;i<9;i++) //定义一个i,
{
P0=table[i]; // i取值为数组中的值。依次点亮前八盏灯
delay(); // 延迟
}
{
for(i=0;i<9;i++) // 继续赋值,继续点亮后8盏灯
{
P2=table[i];
delay();
}
}
}
}
三 用位移的方法点亮八盏LED灯
#include "reg52.h" // 此文件中定义了单片机的一些特殊功能寄存器
#include<intrins.h> // 因此要用到左右移函数,所以加入这个头文件
typedef unsigned int u16; // 对数据类型进行声明定义
typedef unsigned char u8;
#define led P2 //将p2口定义为led 后面就可以用led代替p2口
delay延时函数,i=1,大约延时10us.
void main()
{
u8 i;
led=0xfe;
delay(50000); //´óÔ¼ÑÓʱ450ms
while(1)
{
/* for(i=0;i<8;i++)
{
P2=~(0x01<<i); //将1右移一位,然后将结果取反赋值到P2
delay(50000); //
}
*/
for(i=0;i<;i++) //左移一位
{
led=_crol_(led,1);
delay(50000); //
}
for(i=0;i<7;i++) //将led右移一位
{
led=_cror_(led,1);
delay(50000); //大约延时450ms
}
}
}
最后用protues模拟点亮八盏流水灯:
![](https://img-blog.csdn.net/20171218122921408)
可见电路原理与点亮一个LED的情况相似
一 首先是最简单的代码:
#include <reg52.h> //头文件
sbit led0=P0^0;
sbit led1=P0^1; // 定义八盏灯,并规定每个灯的io接口
sbit led2=P0^2;
sbit led3=P0^3;
sbit led4=P0^4;
sbit led5=P0^5;
sbit led6=P0^6;
sbit led7=P0^7;
void delay(void) // 声明延迟函数
{
unsigned char a,b; //定义两个变量a,b
for(a=0;a<200;a++)
for(b=0;b<200;b++); //这是两个for循环嵌套。用分号来区分。
} // 每当a循环一次,b都要循环200次。同时200也是灯闪烁的时间。
void main() //主函数
{
led0=0; //点亮第一个灯泡
delay(); // 延时函数
led0=1; //熄灭灯泡
delay(); //延时 通过这一系列过程实现闪烁
led1=0;
delay();
led1=1;
delay();
led2=0;
delay();
led2=1;
delay();
led3=0;
delay();
led3=1;
delay();
led4=0;
delay();
led4=1;
delay();
led5=0;
delay();
led5=1;
delay();
led6=0;
delay();
led6=1;
delay();
led7=0;
delay(); 但是该方法存在弊端:需要一个个的定义变量。如果需要同时让许多灯点亮的话则不大方便。代码过于繁琐。因此可以使用其他两种方法
led7=1;
delay();
led8=0;
delay();
led8=1;
delay();
}
二 使用数组的方法点亮十六盏流水灯
#include <reg52.h>
unsigned char table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff}; //宏函数 定义数组,这里的数组均是可以使其亮的顺序。因为
void delay(void) 要使十六盏灯亮,所以需要在后面加上0xff(11111111)即全灭
{ 如果不是需要十六盏则不需要加上最后一个数组。
unsigned char a,b; //声明函数,声明灯的闪烁情况,与上一个代码相同。
for(a=0;a<200;a++)
for(b=0;b<200;b++); // for 语句循环嵌套
}
void main()
{
unsigned char i;
while(1) // while语句是为了使使循环持续进行
{
for(i=0;i<9;i++) //定义一个i,
{
P0=table[i]; // i取值为数组中的值。依次点亮前八盏灯
delay(); // 延迟
}
{
for(i=0;i<9;i++) // 继续赋值,继续点亮后8盏灯
{
P2=table[i];
delay();
}
}
}
}
三 用位移的方法点亮八盏LED灯
#include "reg52.h" // 此文件中定义了单片机的一些特殊功能寄存器
#include<intrins.h> // 因此要用到左右移函数,所以加入这个头文件
typedef unsigned int u16; // 对数据类型进行声明定义
typedef unsigned char u8;
#define led P2 //将p2口定义为led 后面就可以用led代替p2口
delay延时函数,i=1,大约延时10us.
void main()
{
u8 i;
led=0xfe;
delay(50000); //´óÔ¼ÑÓʱ450ms
while(1)
{
/* for(i=0;i<8;i++)
{
P2=~(0x01<<i); //将1右移一位,然后将结果取反赋值到P2
delay(50000); //
}
*/
for(i=0;i<;i++) //左移一位
{
led=_crol_(led,1);
delay(50000); //
}
for(i=0;i<7;i++) //将led右移一位
{
led=_cror_(led,1);
delay(50000); //大约延时450ms
}
}
}
最后用protues模拟点亮八盏流水灯:
可见电路原理与点亮一个LED的情况相似
相关文章推荐
- 某表,多字段关联,多种约束,如何做(触发器实现代码)?
- 如何找到public extern bool Equals(String value)的实现代码?[C#, C++, BCL, CLR]
- 市面上所有号称"虚拟机","防火墙"的实时监控杀毒软件无一不是使用的IFSHOOK技术.但是同时也有一些朋友不断写MAIL给我打听如何实现读写的监控.下面给出用VTOOLSD写的代码.也就是所有实时杀毒软件的奥秘.同时,很多拦截文件操作的软件,例如对目录加
- 如何在net中实现动态执行代码(js的eval)的功能?
- 如何用Javascript代码实现浏览器菜单命令
- 《Asp.Net Forums2.0深入分析》之 Asp.Net Forums是如何实现代码分离和换皮肤
- access如何用代码在“默认值”里实现自动编号?单据流水号生成问题。
- Winform DataGrid设计三步曲之一-----DataGrid如何动态实现多种风格(TableStyle)之间的转换
- 如何用代码实现锁定计算机
- 【导读】本文介绍如何利用带进度条的ASP无组件实现断点续传下载,给出详细代码
- javascript代码如何实现打印框架里面的某个网页
- 如何实现经度纬度到平面坐标的相互转换? 仅仅4句代码就可以解决!
- 比较购物网站中比较代码如何实现
- HTML--如何实现通过鼠标事件拖动页面图像(代码)
- 《Asp.Net Forums2.0深入分析》之 Asp.Net Forums是如何实现代码分离和换皮肤的
- 《Asp.Net Forums2.0深入分析》之 Asp.Net Forums是如何实现代码分离和换
- 《Asp.Net Forums2.0深入分析》之 Asp.Net Forums是如何实现代码分离和换
- 如何找到public extern bool Equals(String value)的实现代码?[C#, C++, BCL, CLR]
- Winform DataGrid设计三步曲之一DataGrid如何动态实现多种风格(Style)之间的转换
- 如何实现自动生成在线播放代码?