呼吸灯的c51程序
时间:08-24
来源:互联网
点击:
在今年春节的时候,在大街上看到很多的流行灯,非常的漂亮。
而今天在看单片机的书时,看到制作呼吸灯的例子,思索一下,发现者流星灯就是有很多的呼吸灯制作而成的。看了一下书上的源码,感觉很有意思。
#include REG51.h> //51头文件/******************************************************************//《C_无级亮度闪烁》#define DY_PORT P1 //设置LED连接的I/O组#define DY_SPEED 1 //设置每一个明亮级的停留时间(值域:0~65535)#define DY_PWM 50 //设置明亮的总级数(级数过大会出现闪烁)(值域:0~65535)#define DY_MAX 50 //设置最大明亮(值域:小于明亮总级数)/**********************************************************************///《B_无级亮度变化》#define DY_PORT P1 //设置LED连接的I/O组#define DY_SPEED 1 //设置每一个明亮级的停留时间(值域:0~65535)#define DY_PWM 500 //设置明亮的总级数(级数过大会出现闪烁)(值域:0~65535)#define DY_MAX 500 //设置最大明亮(值域:小于明亮总级数)/*********************************************************************//《A_8级亮度变化》#define DY_PORT P1 //设置LED连接的I/O组#define DY_SPEED 100 //设置每一个明亮级的停留时间(值域:0~65535)#define DY_PWM 500 //设置明亮的总级数(级数过大会出现闪烁)(值域:0~65535)#define DY_MAX 8 //设置最大明亮(值域:小于明亮总级数)/**********************************************************************bit [自定义名] ; //定义一个位(位的值只能是0或1)例:bit LED#define [代替名] [原名]
//用代替名代替原名(可以方便修改常改或调试的值)例:#define LED P1sbit [自定义名] = [系统位名] ; //自定义系统位名。例:sbit Add_Key = P3 ^ 1;unsigned char [自定义名] ; //定义一个0~255的整数变量.例:unsigned char a;unsigned int [自定义名] ; //定义一个0~65535的整数变量/*********************************************************/void delay (unsigned int a){ // 0.1ms延时程序(12MHz 10倍于51单片机速度时)unsigned char i;while( --a != 0){for(i = 0; i 12; i++);} }/**********************************************************************/void display (unsigned int a){ //显示程序(50ms的PWM宽度)DY_PORT = 0x00; //LED小灯亮delay (a); //延时a的长度DY_PORT = 0xff; //LED小灯灭delay (DY_PWM-a);//延时总PWM长度减a}/***********************************************************************/void main (void){ //主程序unsigned int t=1;unsigned int i;bit LOOP=0; //LOOP是循环切换标志while (1){if(LOOP == 0){ //变亮循环for(i = 0; i DY_SPEED; i++){display(t);}t++;if(t>(DY_MAX-2)){LOOP = 1;}}if(LOOP == 1){ //变暗循环for(i = 0; i DY_SPEED; i++){display(t);}t--;if(t2){LOOP = 0;}}}}/*************************************************************/
从这里看起来就很有意思了。想渐明渐暗,用到的是PWM(脉冲宽度调制)。简单的讲,对于这个灯,就是调节暗和明的比例。
比如10为一个时间段的话,那么1/10为明,9/10为暗,这样亮度就算是1了。因为机器的时间段非常的短到人们看到的一直是连续的。
另外想到一点,当时序短到一定的程度的时候,那么本来连续的程序,变成为了并行(这话说得不是很严密,要看什么样的程序)。所以,我们能一边上qq,一边看网页。
另外,面向过程符合机器的思维,面向对象符合人的思维。
学嵌入式很有意思的一点就是,你可以理解到程序运行的本质。有一种掌控感,而拥有掌控这项技能的,似乎只有神。。。
我一直想,学计算机应该从底层学起,虽然让让人很提不起兴趣。
言归正传,说道这个程序,有个缺点,就是无法独立控制很多的LED灯。我查了很多的资料。却没有得到很明确的结果。倒是发现了一点国内教材的通病---- 天下文章一大抄。我买的基本教材,竟然大部分一样。更可恨的是,连图也一样。这让我情何以堪。后来我发现图的出处----单片机的使用说明书。感情这说明书就是最好的教材。其实不光我们技术比国外落后,教材也落后。就像大学里那些只会照着ppt读的老师一样恶心。
看了看单片机的说明书,发现上面有现成的PCA模块。可惜我的这个
- 非常短的呼吸灯程序(11-25)
- 在C51程序中嵌入汇编(11-27)
- Keil C51程序调试过程(11-17)
- 单片机驱动蜂鸣器C51程序(12-05)
- 一个简单的流水灯c51程序(11-15)
- 单片机控制交通灯c51程序(11-15)