实验思路:
D1-D8共8颗灯使用了P0.0-P0.7,因此可用define宏定义P0端口
定义一个延时函数delay_10us,用于流水灯延时
重定义数据类型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灯的流水点亮。程序相对简单,代码量小,编写效率高。