×

51单片机学习纪实:1.4.1-使用for循环实现LED流水灯(管脚使用宏定义)_【基础实验4】

一哥 一哥 发表于2021-11-28 16:05:21 浏览2675 评论0

抢沙发发表评论

实验思路:

  1. D1-D8共8颗灯使用了P0.0-P0.7,因此可用define宏定义P0端口

  2. 定义一个延时函数delay_10us,用于流水灯延时

  3. 重定义数据类型unsigned char为"U8",unsigned int为"U16"


完整代码:

/*****************************程序信息*********************************
实验名称:控制LED实现单向流水灯效果(for循环+宏定义)
文件名称:main.c
版    本:V1.00
日    期:2021-11-28
编    著:gefon

*******************************声明区*********************************/
#include "reg52.h"

#define LED_PORT  P0  //使用宏定义将P0端口重定义

typedef unsigned char U8; //对系统数据类型重定义
typedef unsigned int U16;

/*******************************子程序*********************************
* 函 数 名   :delay_10us
* 函数功能   :延时函数,当传入变量ten_us=1时,约延时10us
* 输    入   :ten_us
* 输    出   :无
***********************************************************************/
void delay_10us(U16 ten_us)
{
    while(ten_us--);
}

/*******************************主程序*********************************
* 函 数 名   :main
* 函数功能   :主函数
* 输    入   :无
* 输    出   :无
***********************************************************************/
void main()
{
    U8 i;
    while(1)
    {
         for(i=0;i<8;i++)
         {
            LED_PORT=~(0x01<<i); 
            /*将1左移i位,然后取反赋值给LED_PORT。   i=0时,D1点亮;
              i=1时,D2点亮;          以此类推,至i=7时,D8点亮*/
            delay_10us(50000); //延时约480ms(11.0592MHz)
         }
    }
}


实验分析:

此方案对P0端口使用define宏定义,不需要对每一个管脚定义。程序中使用位移即可完成D1-D8灯的流水点亮。程序相对简单,代码量小,编写效率高。

群贤毕至

访客