51单片机流水灯控制(5种方法)

实现流程:

     1. 新建一个工程(新项目)
     2. 查看原理图确定需求(流水灯)对应LED引脚在单片机上的哪个引脚
     3. 编写程序(通过查看原理图可以看到我们需要控制整个P2口以控制8个LED灯)
     4. 编译程序,下载程序至开发板
     5. 查看效果(调试)

进制转换表(因为单片机首先处理的是十六进制的数据,所以我们需要将二进制控制需求转换成十六进制去写代码):

控制代码:

 #include <REGX52.H>   //头文件
 #include "Delay.h"
 #include "intrins.h"
 ​
 /* -------------------------------------------------------
     项目名称:流水灯   
     I/O引脚:P2口(8个引脚)
             
 ----------------------------------------------------------*/
 ​
 unsigned int yanchi = 100;      //延时函数参数
 ​
 unsigned char code Stream_light_array[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};   //流水灯数组(方法二)
 ​
 ​
 void Way_1();   //流水灯控制方法一
 void Way_2();   //流水灯控制方法二
 void Way_3();   //流水灯控制方法三
 void Way_4();   //流水灯控制方法四
 void Way_5();   //流水灯控制方法五
 ​
 int main()            
 {
 ​
     Delay_ms(500);
    while(1)          
    {
         Way_1();
         Way_2();
         Way_3();
         Way_4();
         Way_5();
    }
 }
 ​
 ​
 /*--------------------------------------------------------
     名称:流水灯控制方法五
     功能:通过移位指令(且或上0x01)将LED实现流水灯效果
 ​
 ----------------------------------------------------------*/
 void Way_5()
 {
     int i;
     P2 = 0xFE;
     Delay_ms(500);
     for(i=0;i<7;i++)
     {
         P2=P2 << 1;
        P2 = P2 | 0x01;            
         Delay_ms(500);
     }
 }
 ​
 /*--------------------------------------------------------
     名称:流水灯控制方法四
     功能:LED灯依次左移一位(依次点亮)
 ​
 ----------------------------------------------------------*/
 void Way_4()
 {
     int i;
     P2 = 0xFE;
     Delay_ms(500);
     for(i=0;i<7;i++)
     {
        P2 = P2 << 1;              
         Delay_ms(500);
     }
     P2 = 0xFF;
     Delay_ms(500);
 }
 ​
 /*--------------------------------------------------------
     名称:流水灯控制方法三
     功能:C52 提供了  _crol_(字符循环左移);_cror_ (字符循环右移)
             等库函数,包含在头文件intrins.h中 ; 
 ​
 ----------------------------------------------------------*/
 void Way_3()
 {
     int i;
     P2 = 0xFE;
     Delay_ms(500);
     for(i=0;i<7;i++)
     {
        P2=_crol_ (P2,1);              
         Delay_ms(500);
     }
 }
 ​
 /*--------------------------------------------------------
     名称:流水灯控制方法二
     功能:用数组循环方式控制流水灯
 ​
 ----------------------------------------------------------*/
 void Way_2()
 {
 ​
     int i = 0;
     for(i = 0;i < 8; i++)
     {
         P2 = Stream_light_array[i];
         Delay_ms(500);
     }
 }
 ​
 /*--------------------------------------------------------
     名称:流水灯控制方法一
     功能:用十六进制赋值方式控制流水灯
 ​
 ----------------------------------------------------------*/
 void Way_1()
 {
     
         P2 = 0xFE;       //D1
         Delay_ms(yanchi);
         P2 = 0xFF;      
         
         P2 = 0xFD;       //D2
         Delay_ms(yanchi);
         P2 = 0xFF;
         
         P2 = 0xFB;       //D3
         Delay_ms(yanchi);
         P2 = 0xFF;
         
         P2 = 0xF7;       //D4
         Delay_ms(yanchi);
         P2 = 0xFF;
         
         P2 = 0xEF;       //D5
         Delay_ms(yanchi);
         P2 = 0xFF;
         
         P2 = 0xDF;       //D6
         Delay_ms(yanchi);
         P2 = 0xFF;
         
         P2 = 0xBF;       //D7
         Delay_ms(yanchi);
         P2 = 0xFF;
         
         P2 = 0x7F;       //D8
         Delay_ms(yanchi);
         P2 = 0xFF;
 }
 ​

延时代码C文件

#include "Delay.h"
 ​
 /*--------------------------------------------
     名称:延时函数
    功能:Ms延时
 ----------------------------------------------*/
 void Delay_ms(unsigned int xms)
 {
     unsigned int j,k;
     for(j = xms; j > 0; j--)
         for(k = 113; k > 0;k--);
 }
 ​

延时代码H文件

#ifndef __Delay_H_
 #define __Delay_H_
 ​
 void Delay_ms(unsigned int xms);    //延时函数
 ​
 #endif
 ​

注意事项:

  1. 这里要注意勾选HEX这个选项,否则不会生成hex文件(因为我们下载程序使用的是Hex文件)

  1. 在使用代码中的方法二时一定要记得添加头文件 #include “intrins.h”

  2. 这里开始使用了模块化编程(模块化中的延时代码已放在代码下面,使用记得要添加 .h 文件)

实现效果:

项目总结:

 

猜你喜欢

转载自blog.csdn.net/x97666/article/details/123160892