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

最新更新时间:2022-09-29来源: csdn关键字:51单片机  流水灯控制 手机看文章 扫描二维码
随时随地手机看文章

实现流程:


     1. 新建一个工程(新项目)

     2. 查看原理图确定需求(流水灯)对应LED引脚在单片机上的哪个引脚

     3. 编写程序(通过查看原理图可以看到我们需要控制整个P2口以控制8个LED灯)

     4. 编译程序,下载程序至开发板

     5. 查看效果(调试)

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

控制代码:


 #include    //头文件

 #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

 

注意事项:


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

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


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


实现效果:

项目总结:

关键字:51单片机  流水灯控制 编辑:什么鱼 引用地址:51单片机流水灯控制(5种方法)

上一篇:手动编译链接生成c51的hex文件
下一篇:51单片机STC12C5A60S2定时器做延时函数,定时器实现精准延时

推荐阅读

51单片机知识重点汇总一,学单片机必须要了解的知识。
主要性能:  与MCS-51单片机产品兼容 、8K字节在系统可编程Flash存储器、 1000次擦写周期、全静态操作:0Hz~33Hz 、三级加密程序存储器 、 32个可编程I/O口线、三个16位定时器/计数器八个中断源、全双工UART串行通道、 低功耗空闲和掉电模式 、掉电后中断可唤醒 、看门狗定时器 、双数据指针、掉电标识符 。一、STC89C51单片机外部引脚简介电源及时钟引脚:Vcc(40脚)、GND(20脚)、XTAL1(19脚)、XTAL2(18脚)。Vcc、GND——单片机电源引脚,不同的型号单片机接入对应电压电源,常压为+5V,低压为+3.3V。XTAL1、XTAL2——外接时钟引脚。XTAL1为片内震荡电路的输入端
发表于 2022-11-17
单片机led灯闪烁实验总结_玩转51单片机(1):点亮led灯
01新建工程与点亮LED小灯,LED小灯即发光二极管,它具有单向导电性,对于发光二极管而言,需要根据它的压降与额定电流来选择合适的限流电阻,打开Keil4软件,选择Project,New uVision Project选定工程的保存路径,并给工程命名,保存类型默认.uvproj,点击保存出现如下对话框,点击下拉按钮,选择STC MCU Database,点击OK选择STC89C52RC,点击OK选择否点击New,生成一个Text1文件点击 File, Save, 出现如下对话框,将文件命名为后缀为.c的文件,默认保存类型,点击保存点击Target 1前面的加号,在Source Group 1上右击,选择Add Files to Gr
发表于 2022-11-14
单片机led灯闪烁实验总结_玩转<font color='red'>51单片机</font>(1):点亮led灯
51单片机】1602自定义字符原理及示例(”汉“、爱心及摄氏度示例)
原理设置1602屏幕的对比度的时候我们能够看到5*8的点阵,其实液晶显示的都是字符的字模(下图),而CGROM里面都是已经定义好的,只能读不能写,而RAM是可以读写的所以我们只要将我们自定义的字符字模写入对应的CGRAM中就好,CGRAM一共有8个对应的地址分别为(0x40,0x48,0x50,0x58,0x60,0x68,0x70,0x78),因为每个字模对应8行所以每写完一个字模以后要加8,按照指令写入CGRAM时需要加0x40所以对应地址就如上了,然而其实CGRAM的实际地址是0x00-0x07所以在后面写入数据的时候需要按照实际地址来写入。CGROM中的字模也是同样的原理 字模代码:1602显示模式为5*7点阵型,字模代码
发表于 2022-11-12
【<font color='red'>51单片机</font>】1602自定义字符原理及示例(”汉“、爱心及摄氏度示例)
51单片机】1602 CGRAM、CGROM及DDRAM的作用
CGRAM : 允许用户自建字模区的空间。从CGROM表上可以看到,在表的最左边是一列可以允许用户自定义的CGRAM,从上往下看着是16个,实际只有8个字节可用。它的字符码是00000000-00000111这8个地址,表的下面还有8个字节,但因为这个CGRAM的字符码规定0-2位为地址,3位无效,4-7全为零(表上的高位)。因此CGRAM的字符码只有最后三位能用也就是8个字节了。等效为0000X111,X为无效位,最后三位为000-111共8个。CGROM : 字模存储用空间。你要显示某个ASCII字符时,要显示字符的字模就存在这里。DDRAM : 显示用RAM。直接和屏幕上的点相对应。屏幕上的一个点和DDRAM中的一个位对应。1
发表于 2022-11-12
【<font color='red'>51单片机</font>】1602 CGRAM、CGROM及DDRAM的作用
51单片机】 数据管显示HELLO
软件准备+硬件准备软件:1.Keil软件v6.12(与书中版本保持一致方便学习,如果喜欢别的版本也可以下载别的)2. STC-ISP(将十六进制代码写到单片机上)硬件:TX-1C(书本推荐,并非本人广告)【学习单片机,你起码得有块单片机的板子吧…也不一定是自己的,借别人的也可以】HELLO.程序#include <reg52.h>#define uchar unsigned char#define uint unsigned intsbit dula=P2^6; //申明U1锁存器的锁存端sbit wela=P2^7; //申明U2锁存器的锁存端void delayms(u
发表于 2022-11-12
【<font color='red'>51单片机</font>】 数据管显示HELLO
51单片机】数据管的消影问题
数码管的消影未消影代码#include<reg52.h>sbit wela=P2^7; //位选sbit dula=P2^6; //段选void main(){ while(1) { //一直显示 dula=1; P0=0x06; //显示1 dula=0; wela=1; P0=0xfe; //选择第一个数码管 wela=0; } }运行结果原因第一个数码管的1显示较亮但是同时伴随着另外较弱一点段位的显示,可以看出是下面位选的影响(0xfe),然后几个未选择的数码管亮了,可以看出是前面段选带来的影响(0x06->对应位
发表于 2022-11-12
【<font color='red'>51单片机</font>】数据管的消影问题
小广播
设计资源 培训 开发板 精华推荐

何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2022 EEWORLD.com.cn, Inc. All rights reserved