标题:
51单片机学习总结之流水灯(新手必进)
[打印本页]
作者:
MCU狂热追求者
时间:
2018-7-31 20:24
标题:
51单片机学习总结之流水灯(新手必进)
说明:本人现在已经学完51单片机了,定期会发一些学习总结,本次是关于流水灯的,希望大家多多支持 程序代码都调试过,都带有注释。
51学习总结
2018年3月28日16:41:47
-------------------------------------------------------------------------------------------
一.流水灯总结
a.点亮LED有两种方式:1.sbit定义IO口;2.0x16进制总线式
b.LED电压 (voltage) 常识:
单个小功率LED灯,颜色不同,其要求的电压也不同。红/黄:一般为1.8~2.1伏,白/绿/蓝:一般为3.0~3.6伏。
1W大功率灯要求的电压与以上相同。
c.LED电流 (current) 常识:
I.小功率的LED灯(包括插件式或者贴片式),每个芯片上允许通过的电流一般不要高于20毫安;
每个双芯片灯上允许通过的电流一般不高于40毫安;同理每个三芯片灯不要高于60毫安。
II.大功率LED常采用的是1W,其允许通过的最大电流为150毫安
d.流水灯基本程序
*******************************************************************************************
#include<reg52.h> //头文件
#define uint unsigned int //宏定义 可以看成用uint代替unsigned int
#define uchar unsigned char//同上
void delay(uint x) //毫秒级延时函数,延时时间为形参 x ms
{
uint i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
void main() //主函数
{
P1=0Xfe; //给LED赋初值,先点亮第一个LED,这里的P1是指和LED相连的I/O口
while(1) //死循环语句
{
delay(500); //延时500ms;就是调用延时函数延时
P1=(P1<<1)|(P1>>7);//左移一位与右移七位 |表示与运算
}
} //这个是流水灯的基本程序
*******************************************************************************************
复制代码
#include <reg52.h> //51头文件
#include <intrins.h>//包含循环右移函数_cror,右移函数_crol_头文件
#define uint unsigned int //宏定义
void delay(uint z)//毫秒级延时函数
{
uint x,y;
for(x = z; x > 0; x--)
for(y = 120; y > 0 ; y--);
}
void main()//主函数
{
P2 = 0x7f; //赋值给P2,点亮LED8
while(1)//死循环
{
P2= _cror_(P2,1);//循环右移,LED从左至右点亮
delay(1000);
}
}
复制代码
*******************************************************************************************
#include <reg52.h>
unsigned char LED_STATE; //LED状态值
void LED_show();
void LED_show()
{
if (LED_STATE>=7) //如果点亮的是LED7
LED_STATE=0; //回到LED0
else
LED_STATE++; //否则点亮下一个LED
P2=~(1<<LED_STATE);//LED状态值变换为给P2口赋的值
}
void main()
{
unsigned int i; //延时变量
LED_STATE=0; //赋初值
while(1)
{ LED_show(); //LED状态切换
for(i=0;i<10000;i++); //延时
}
}
复制代码
*******************************************************************************************
e.花样流水灯
*******************************************************************************************
#include<reg52.h> //头文件
#include<intrins.h> //包含循环右移函数_cror,右移函数_crol_头文件
#define uint unsigned int //宏定义
void delay(uint n) //延时函数
{
while(n--);
}
void main() //主函数
{
a: P2=0xfe; //点亮第一个LED
delay(15000);//延时
while(1) //死循环
{
P2=P2<<1; //依次点亮所有LED
delay(15000); //延时
if(P2==0x00) //判断LED全亮
{ P2=0x01; //熄灭一个
delay(15000);//延时
goto b;} //跳去b结构
}
b: while(1) //死循环
{
P2=_crol_(P2,1)+1; //依次熄灭LED,直至熄灭所有LED
delay(15000); //延时
if(P2==0xff) //判断是否熄灭所有LED
{delay(15000); //延时
goto a;} //跳去a模块,反复循环点亮、熄灭
}
}
复制代码
---------------------------------------------
备注:goto语句也称为无条件转移语句,其一般格式如下:
goto 语句标号; 其中语句标号是按标识符规定书写的符号, 放在某一语句行的前面,标号后加冒号(:)。
语句标号起标识语句的作用,与goto 语句配合使用。
C语言不限制程序中使用标号的次数,但各标号不得重名。
goto语句的语义是改变程序流向, 转去执行语句标号所标识的语句。
goto语句通常与条件语句配合使用。可用来实现条件转移, 构成循环,跳出循环体等功能。
在结构化程序设计中一般不主张使用goto语句, 以免造成程序流程的混乱,使理解和调试程序都产生困难。
*******************************************************************************************
#include <reg52.h>
unsigned char code seg[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff,0xff,0x00,0,0x55,0x55,0xaa,0xaa};
//定义一个数组 储存LED状态量
void delay(unsigned int cnt) //延时
{
while(--cnt);
}
void main() //主函数
{
unsigned char i; //循环变量
while(1)
{
P2=0xFE; //第一个LED亮
for(i=0;i<8;i++)
{
delay(10000);
P2 <<=1; /*P2<<=1;是C的一种简写,当一个变量要得到和另外一个数和它本身发送计算时就用这种形式。
比如:x=x+1可以写为 x+=1;x=x*1;可以写为x*=1;同样P2<<=1;即为P2 = P2<<1;
就是取出P2并行8个端口的数据之后向左移动一位,高位被移除,地位被0取代,再放入P2口的8个端口输出。*/
} //每循环一次,点亮一个LED,之前点亮的LED不熄灭,LED从左向右逐个点亮
P2=0x7F; //第八个LED亮,LED7
for(i=0;i<8;i++)
{
delay(10000);
P2 >>=1; //同上,是C的一种简写,为P2 = P2>>1;
} //每循环一次,点亮一个LED,之前点亮的LED不熄灭,LED从右向左逐个点亮
P2=0xFE; //第一个LED亮
for(i=0;i<8;i++)
{
delay(10000);
P2 <<=1; //同上,是C的一种简写,为P2 = P2<<1;
P2 |=0x01; //熄灭第一个LED,其余全亮,通过上一条语句,以此从左向右熄灭
}
P2=0x7F; //第八个LED亮,LED7
for(i=0;i<8;i++)
{
delay(10000);
P2 >>=1; //同上,是C的一种简写,为P2 = P2>>1;
P2 |=0x80; //熄灭第八个LED,其余全亮,通过上一条语句,以此从右向左熄灭
}
for(i=0;i<16;i++)//循环16次
{
delay(20000);//延时
P2=seg[i]; //读取数组中的数值
}
}
}
复制代码
*******************************************************************************************
f.指针型流水灯
*******************************************************************************************
#include <reg52.h> //头文件
#define uchar unsigned char //宏定义
#define uint unsigned int //宏定义
uchar code table[]={0x01,0x02,0x04,0x08,
0x10,0x20,0x40,0x80,
0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f};//储存数据
uchar *p; //定义一个数组
uchar j; //判断变量
uint i; //延时变量
void main(void)
{
p = table;// 将数组的首个元素赋值给指针变量p
j = 0;//初始化
while(1) //死循环
{
if(j==15) //如果j等于15
j=0;//则j=0
else //否则j加1
j++;
P2 = *(p+j);//+j表示依次对数组内元素取值
for(i=0;i<10000;i++); //延时
}
}
复制代码
*******************************************************************************************
g.霖峰--流水灯
*******************************************************************************************
#include <reg52.h> //头文件
#define uchar unsigned char
void delay(uint x) //毫秒级延时函数,延时时间为形参 x ms
{
uint i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
void main()//主函数
{
uchar k,i;
while(1)
{
k=0xfe;//11111110 //点亮第一个LED
for(i=0;i<8;i++)
{
P2=k;
delay(1000);
k=k<<1; //11111100
k=k|0x01;//00000001 流水灯
//11111101
//11111010
//00000001
//11111011
}
}
}
复制代码
*******************************************************************************************
h.8*8LED点阵驱动
一.pdf
2018-7-31 20:24 上传
点击文件名下载附件
下载积分: 黑币 -5
109.45 KB, 下载次数: 7, 下载积分: 黑币 -5
流水灯总结
作者:
MCU狂热追求者
时间:
2018-7-31 20:26
不错不错不错
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1