×

51单片机笔记 51单片机学习纪实

51单片机学习纪实:1.4.2-使用移位库函数实现单向流水灯_【基础实验5】

一哥 一哥 发表于2021-12-01 19:37:31 浏览1293 评论0

抢沙发发表评论

实验思路:

  1. 声明intrins.h头文件

  2. D1-D8灯连接P0.0-P0.7管脚,使用define宏定义P0端口

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

  4. 在流水循环开始前,给LED_PORT(P0端口)赋个初始值


完整代码:

/*****************************程序信息*********************************
* 实验名称:控制LED模块实现单向流水灯(使用移位库函数)
* 文件名称:main.c
* 版    本:V1.00
* 日    期:2021-12-01
* 编    著:gefon
* 说    明:使用普中A7开发版,控制LED灯实现D1-D8单向流水

*******************************声明区*********************************/
#include "reg52.h"
#include "intrins.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;
    LED_PORT=0xFE; //定义LED_PORT初始值为0xFE
    delay_10us(50000); //延时约480ms(11.0592MHz)
    while(1)
    {
        for(i=0;i<7;i++)
        {
           LED_PORT=_crol_(LED_PORT,1); //将LED左移1位
           delay_10us(50000); //延时约480ms(11.0592MHz)
        }
/*下面代码为使LED右移,如要实现双向流水,但需启用以下代码即可*/
//        for(i=0;i<7;i++)
//        {
//           LED_PORT=_cror_(LED_PORT,1); //将LED右移1位
//           delay_10us(50000);
//        }
    }
}


实验分析:

  1. 使用位移方式为移位后自动补零,如果当前位向前移一位,后面会自动补"0",而最前面一位会被移除掉

  2. 而使用移位库函数时,当前位置向前移一位时,最前一位移到最后面,即像循环排队一样的移动方式。使用移位库函数在进入循环前,先需要给LED_PORT赋一个初始值。

少长咸集

群贤毕至

访客