|
说明:本人现在已经学完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
109.45 KB, 下载次数: 7, 下载积分: 黑币 -5
流水灯总结
评分
-
查看全部评分
|