实验思路:
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灯的流水点亮。程序相对简单,代码量小,编写效率高。