找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3651|回复: 1
打印 上一主题 下一主题
收起左侧

51单片机学习总结之流水灯(新手必进)

[复制链接]
跳转到指定楼层
楼主
ID:333662 发表于 2018-7-31 20:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
说明:本人现在已经学完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.流水灯基本程序
  1. *******************************************************************************************
  2. #include<reg52.h>   //头文件
  3. #define uint unsigned int  //宏定义 可以看成用uint代替unsigned int
  4. #define uchar unsigned char//同上
  5. void delay(uint x)    //毫秒级延时函数,延时时间为形参 x ms
  6. {
  7. uint i,j;
  8. for(i=x;i>0;i--)
  9.   for(j=110;j>0;j--);
  10. }
  11. void main() //主函数
  12. {
  13. P1=0Xfe;  //给LED赋初值,先点亮第一个LED,这里的P1是指和LED相连的I/O口
  14. while(1)  //死循环语句
  15. {
  16.   delay(500);  //延时500ms;就是调用延时函数延时
  17.   P1=(P1<<1)|(P1>>7);//左移一位与右移七位  |表示与运算
  18. }
  19. }        //这个是流水灯的基本程序
  20. *******************************************************************************************
复制代码
  1. #include <reg52.h> //51头文件
  2. #include <intrins.h>//包含循环右移函数_cror,右移函数_crol_头文件
  3. #define uint  unsigned int  //宏定义
  4. void delay(uint z)//毫秒级延时函数
  5. {
  6. uint x,y;
  7. for(x = z; x > 0; x--)
  8. for(y = 120; y > 0 ; y--);
  9. }
  10. void main()//主函数
  11. {
  12.   
  13. P2 = 0x7f;  //赋值给P2,点亮LED8
  14. while(1)//死循环
  15. {
  16.            P2= _cror_(P2,1);//循环右移,LED从左至右点亮
  17.     delay(1000);
  18. }
  19. }
复制代码

*******************************************************************************************
  1. #include <reg52.h>
  2. unsigned char LED_STATE;  //LED状态值
  3. void LED_show();
  4. void LED_show()
  5. {
  6.     if (LED_STATE>=7)     //如果点亮的是LED7
  7.       LED_STATE=0;  //回到LED0
  8.    else
  9.      LED_STATE++;  //否则点亮下一个LED
  10. P2=~(1<<LED_STATE);//LED状态值变换为给P2口赋的值
  11. }
  12. void main()
  13. {
  14.         unsigned int i;   //延时变量
  15. LED_STATE=0;      //赋初值
  16. while(1)
  17. { LED_show();  //LED状态切换
  18.      for(i=0;i<10000;i++);  //延时
  19. }
  20. }  
复制代码

*******************************************************************************************

e.花样流水灯
*******************************************************************************************
  1. #include<reg52.h>           //头文件
  2.   #include<intrins.h>  //包含循环右移函数_cror,右移函数_crol_头文件
  3.   #define uint unsigned int //宏定义
  4.   void delay(uint n)    //延时函数
  5.     {
  6.       while(n--);
  7.     }
  8.   void main()   //主函数
  9.    {
  10.     a: P2=0xfe;  //点亮第一个LED
  11.      delay(15000);//延时
  12.      while(1)    //死循环
  13.       {
  14.        P2=P2<<1; //依次点亮所有LED
  15.        delay(15000); //延时
  16.        if(P2==0x00)  //判断LED全亮
  17.          { P2=0x01;  //熄灭一个
  18.            delay(15000);//延时
  19.            goto b;}  //跳去b结构
  20.       }
  21.       
  22.     b: while(1) //死循环
  23.       {
  24.        P2=_crol_(P2,1)+1;  //依次熄灭LED,直至熄灭所有LED
  25.        delay(15000);    //延时
  26.        if(P2==0xff)     //判断是否熄灭所有LED
  27.          {delay(15000); //延时
  28.              goto a;}   //跳去a模块,反复循环点亮、熄灭
  29.       }
  30.    }
复制代码

---------------------------------------------
备注:goto语句也称为无条件转移语句,其一般格式如下:
goto 语句标号; 其中语句标号是按标识符规定书写的符号, 放在某一语句行的前面,标号后加冒号(:)。
语句标号起标识语句的作用,与goto 语句配合使用。
C语言不限制程序中使用标号的次数,但各标号不得重名。
goto语句的语义是改变程序流向, 转去执行语句标号所标识的语句。
goto语句通常与条件语句配合使用。可用来实现条件转移, 构成循环,跳出循环体等功能。
在结构化程序设计中一般不主张使用goto语句, 以免造成程序流程的混乱,使理解和调试程序都产生困难。
*******************************************************************************************
  1. #include <reg52.h>
  2. unsigned char code seg[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff,0xff,0x00,0,0x55,0x55,0xaa,0xaa};
  3.         //定义一个数组 储存LED状态量
  4. void delay(unsigned int cnt)  //延时
  5.     {
  6.      while(--cnt);
  7.     }
  8. void  main()  //主函数
  9. {
  10.      unsigned char i;  //循环变量
  11.      while(1)
  12.           {
  13.        P2=0xFE;                   //第一个LED亮
  14.           for(i=0;i<8;i++)
  15.           {
  16.           delay(10000);
  17.           P2 <<=1;      /*P2<<=1;是C的一种简写,当一个变量要得到和另外一个数和它本身发送计算时就用这种形式。
  18.                    比如:x=x+1可以写为 x+=1;x=x*1;可以写为x*=1;同样P2<<=1;即为P2 = P2<<1;
  19.                    就是取出P2并行8个端口的数据之后向左移动一位,高位被移除,地位被0取代,再放入P2口的8个端口输出。*/
  20.            }     //每循环一次,点亮一个LED,之前点亮的LED不熄灭,LED从左向右逐个点亮
  21.           P2=0x7F;                //第八个LED亮,LED7
  22.           for(i=0;i<8;i++)
  23.           {
  24.           delay(10000);
  25.           P2 >>=1;     //同上,是C的一种简写,为P2 = P2>>1;
  26.        }         //每循环一次,点亮一个LED,之前点亮的LED不熄灭,LED从右向左逐个点亮
  27.        P2=0xFE;                  //第一个LED亮
  28.           for(i=0;i<8;i++)
  29.           {
  30.           delay(10000);
  31.           P2 <<=1;     //同上,是C的一种简写,为P2 = P2<<1;         
  32.           P2 |=0x01;   //熄灭第一个LED,其余全亮,通过上一条语句,以此从左向右熄灭
  33.           }
  34.        P2=0x7F;                  //第八个LED亮,LED7
  35.           for(i=0;i<8;i++)
  36.           {
  37.           delay(10000);
  38.           P2 >>=1;     //同上,是C的一种简写,为P2 = P2>>1;
  39.           P2 |=0x80;   //熄灭第八个LED,其余全亮,通过上一条语句,以此从右向左熄灭
  40.            }
  41.             
  42.          for(i=0;i<16;i++)//循环16次
  43.           {
  44.              delay(20000);//延时
  45.              P2=seg[i];   //读取数组中的数值
  46.            }
  47.     }
  48.     }
复制代码

*******************************************************************************************

f.指针型流水灯
*******************************************************************************************
  1. #include <reg52.h>   //头文件
  2. #define uchar unsigned char //宏定义
  3. #define uint unsigned int   //宏定义
  4. uchar code table[]={0x01,0x02,0x04,0x08,
  5.                      0x10,0x20,0x40,0x80,
  6.                      0xfe,0xfd,0xfb,0xf7,
  7.                      0xef,0xdf,0xbf,0x7f};//储存数据
  8.                  
  9. uchar *p;  //定义一个数组
  10. uchar j;   //判断变量
  11. uint i;    //延时变量
  12. void main(void)
  13. {
  14.      p = table;// 将数组的首个元素赋值给指针变量p
  15.   j = 0;//初始化
  16.   while(1) //死循环
  17.   {
  18.       if(j==15) //如果j等于15
  19.       j=0;//则j=0
  20.    else   //否则j加1
  21.       j++;
  22.    P2 = *(p+j);//+j表示依次对数组内元素取值
  23.    for(i=0;i<10000;i++);  //延时
  24.   }
  25. }
复制代码

*******************************************************************************************

g.霖峰--流水灯
*******************************************************************************************
  1. #include <reg52.h>   //头文件
  2. #define uchar unsigned char
  3. void delay(uint x)    //毫秒级延时函数,延时时间为形参 x ms
  4. {
  5. uint i,j;
  6. for(i=x;i>0;i--)
  7.   for(j=110;j>0;j--);
  8. }
  9. void main()//主函数
  10. {
  11.       uchar k,i;
  12.       while(1)
  13.       {
  14.          k=0xfe;//11111110  //点亮第一个LED
  15.          for(i=0;i<8;i++)   
  16.          {
  17.           P2=k;
  18.           delay(1000);
  19.           k=k<<1;  //11111100
  20.           k=k|0x01;//00000001    流水灯
  21.                    //11111101
  22.                    //11111010
  23.                    //00000001
  24.                    //11111011
  25.           }         
  26.       }
  27. }
复制代码

*******************************************************************************************
h.8*8LED点阵驱动

一.pdf

109.45 KB, 下载次数: 7, 下载积分: 黑币 -5

流水灯总结

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:333662 发表于 2018-7-31 20:26 | 只看该作者
不错不错不错
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表