zoukankan      html  css  js  c++  java
  • 毕业回馈-89C51之GPIO使用(流水灯)

    今天分享一个89c51制作的8位流水灯案例。使用Proteus仿真。

    同上一遍文章不同。上一篇文章中对于GPIO操作主要是位操作,即sbit led1=P0^0;其中P0^0代表p0.0这个引脚,然后在这样位定义以后就可以对led1这个变量进行赋值操作,控制led灯的亮灭闪烁。今天要分享的是一次性对P1.0-P1.7进行操作。

    89c51单片机是以51为内核的8位处理器,可以很方便的实现8位数据的操作。

    所使用的电路原理图如下:

    image

    使用200Ohm的电阻进行限流,LED灯采用阴极接法,即LED灯的阴极接到单片机的IO口;

    本次案例流水灯共有以下几种模式:

    1):D1-D2-D3-D4-D5-D6-D7-D6-D5-D4-D3-D2-D1;顺向,逆向间隔流水;

    2):从D1-D7按照二进制的形式流水

    3):顺向移位流水:D1-D1,D2-D1,D2,D3-D1,D2,D3,D4-D1,D2,D3,D4,D5-D1,D2,D3,D4,D5,D6-D1,D2,D3,D4,D5,D6,D7;

    4):逆向移位流水:D7-D7,D6-D7,D6,D5-D7,D6,D5,D4-D7,D6,D5,D4,D3-D7,D6,D5,D4,D3,D2-D7,D6,D5,D4,D3,D2,D1;

    源代码如下:

    其中

    led_Mod:流水模式选择参数可以设置为1-5;

    uDelay_ms:每一次切换之间的间隔时间;

    void LED_Display(uint16 led_Mod,uint32 uDelay_ms)
    {
         int i=0;
         uint32 cnt=0;
         static int Mod;
         Mod=led_Mod;
         switch(Mod)
         {
            
             case 1://第一种模式:正向流水
             {
                 for(;i<=7;i++)
                 {
                     if(i>=8)
                     {
                         i=0;
                         break;
                     }
                     Led=~led_Moud[i];
                     delay(uDelay_ms);
                 }
                 break;
                
             }
             case 2://第二种模式:逆向流水
             {
                 for(;i<=7;i++)
                 {
                     if(i>=8)
                     {
                         i=0;
                         break;
                     }
                     Led=~led_Moud[7-i];
                     delay(uDelay_ms);
                 }
                 break;
             }
             case 3://第三种模式:二进制移位
             {
                 for(i=0xff;i>=0x00;i--)
                 {
                     if(i==0)
                     {
                         i=0;
                         break;
                     }
                     Led=i;
                     delay(uDelay_ms);
                 }
                 break;
             }
             case 4://第四种模式:移位模式(不寻数组)顺向
             {
                 for(;i<=7;i++)
                 {
                     if(i>=8)
                     {
                         i=0;
                         break;
                     }
                     Led = (0xfe<< i);       //Led 等于 0xfe 左移 i 位,控制 8 个 LED   
                     delay(uDelay_ms);   
                 }
                 Led=0xff;
                 break;
             }
             case 5://第五种模式:移位模式(不寻数组)逆向
             {
                 for(;i<=7;i++)
                     {
                         if(i>=8)
                         {
                             i=0;
                             break;
                         }
                         Led = (0x7f>>i);       //Led 等于 0xfe 左移 i 位,控制 8 个 LED   
                         delay(uDelay_ms);   
                     }
                     Led=0xff;
                     break;
             }
             default:break;
         }

    }

    顺向流水的数组定义如下:

    const uchar code led_Moud[]=
    {
         0X01, 0X02, 0X04, 0X08, 0X10, 0X20, 0X40, 0X80//Module1
    };

    delay函数的定义:

    请查看第一遍博客;http://www.cnblogs.com/Mr-Wangblogs/p/8890788.html

    主函数的设计如下:

    image

    对于显示函数的声明如下:

    image

    51_Include.h内如下:

    image

    具体编码方式图解:(本编码方式是基于阳极接法,阴极的读者可以自行编写,遇到问题可以咨询)

    image

    接下来简单介绍一下C51数组定义的时候里面涉及到的几个关键字

    首先C51数组定义如下:

    const uchar code led_Moud[]=
    {
    0X01, 0X02, 0X04, 0X08, 0X10, 0X20, 0X40, 0X80//Module1
    };

    const:

    作用主要有以下几点:
    (1)可以定义const常量,具有不可变性。

    (2)便于进行类型检查,使编译器对处理内容有更多了解,消除了一些隐患。

    (3)可以避免意义模糊的数字出现,同样可以很方便地进行参数的调整和修改。

    (4)可以保护被修饰的东西,防止意外的修改,增强程序的健壮性。

    (5) 可以节省空间,避免不必要的内存分配
    (6)提高了效率

    以上内容来自网络

    我们在C51中使用这个关键字一般都是在定义数组是使用。在制作字库,编码时使用,主要目的时为了减少51资源的浪费以及不允许修改他所修饰的数组内容。

    code:

    C51的关键字,不是C语言的关键字。Code的意思是代码区,也就是说我们这样定义的时候就将这个数组放到了单片机的代码区,可以减少检索时间。

    对于以上内容有疑问请及时联系我,我会尽快回复,欢迎一起交流和学习。

  • 相关阅读:
    Just oj 2018 C语言程序设计竞赛(高级组)D: 四边形面积
    Just Oj 2017C语言程序设计竞赛高级组A: 求近似值(矩阵快速幂)
    HDU 1166 敌兵布阵(线段树/树状数组模板题)
    HDU 1541 STAR(树状数组)
    Just Oj 2017C语言程序设计竞赛高级组E: DATE ALIVE(二分匹配)
    Just Oj 2017C语言程序设计竞赛高级组D: 字符串最大表示(next数组)
    蓝桥杯 历届试题 小计算器
    蓝桥杯练习 十六进制转二进制
    51 nod 1212 无向图最小生成树(Kruckal算法/Prime算法图解)
    51 Nod 1240 莫比乌斯函数
  • 原文地址:https://www.cnblogs.com/Mr-Wangblogs/p/8932418.html
Copyright © 2011-2022 走看看