51单片机学习总结系列(一)之驱动流水灯(1)

       51单片机驱动流水灯可以更好的理解IO口,这一节就主要来用查表法和移位法来实现流水灯,首先先看电路图。

        电路比较简单,发光二极管正极接5V电源,负极接470Ω限流电阻,接单片机P0口,限流电阻470Ω怎么计算?来看看,普通发光二极管正向饱和电压为1.6~2.1V,正向饱和电流为5~20mA,但不同颜色的发光二极管参数有所差异。这里没必要精确计算,我们取中间值电压1.8V,电流10mA。由欧姆定律,解得R=(5-1.8)/10=320Ω,图中电阻选用常用的470Ω。

        由电路图可以知道,单片机P0口只需要输出低电平,就可以点亮LED灯。图中采用低电平驱动,主要是P0口低电平驱动能力比较好。

        现在先来看个闪烁灯的程序。

/*********************************************
**程序名称:LED闪烁灯
**程序功能:一个LED闪烁,频率为2HZ
**编写:李松泽
**时间:2014-12-25
**********************************************/
#include <reg52.h>
sbit LED=P0^0;//位定义
#define uchar unsigned char
#define uint unsigned int
/*********************************************
**函数名称:void delay_ms(uint x)
**函数功能:延时xms
**入口参数:uint x
**出口参数:
*********************************************/
void delay_ms(uint x)
{
    uint i,j;
    for(i=x;i>0;i--)
        for(j=110;j>0;j--);
}
/*********************************************
**函数名称:void main()
**函数功能:主函数
**入口参数:
**出口参数:
*********************************************/
void main()
{
    while(1)
    {
        LED=0;//LED亮
        delay_ms(500);
        LED=1;//LED灭
        dealy_ms(500);		
    }
}	 

          这个程序比较简单,但同时也说明了51单片机可以对单个位定义操作,在16位MSP430单片机中就不能单独操作一个位。在程序的编写中就比较方便。       

流水灯程序以下用两种方法,首先先看查表法,部分程序说明在代码中解释。

/*********************************************
**程序名称:驱动流水灯
**程序功能:8个LED依次从左到右,从右到左点亮,频率为500ms
**编写:李松泽
**时间:2014-12-25
**********************************************/
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,
             0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//赋给P0口的数据
/*********************************************
**函数名称:void delay_ms(uint x)
**函数功能:延时xms
**入口参数:uint x
**出口参数:
*********************************************/
void delay_ms(uint x)
{
    uint i,j;
    for(i=x;i>0;i--)
        for(j=110;j>0;j--);
}
/*********************************************
**函数名称:void main()
**函数功能:主函数
**入口参数:
**出口参数:
*********************************************/
//查表法:
void main()
{
     while(1)
    {
         uchar i;
	 for(i=0;i<16;i++)
	 {
             P0=tab[i];
             delay_ms(500);
	 }
    }
}


移位法:

/*********************************************
**程序名称:驱动流水灯
**程序功能:8个LED依次从左到右,从右到左点亮,频率为500ms
**编写:李松泽
**时间:2014-12-25
**********************************************/
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
/*********************************************
**函数名称:void delay_ms(uint x)
**函数功能:延时xms
**入口参数:uint x
**出口参数:
*********************************************/
void delay_ms(uint x)
{
    uint i,j;
    for(i=x;i>0;i--)
        for(j=110;j>0;j--);
}
/*********************************************
**函数名称:void main()
**函数功能:主函数
**入口参数:
**出口参数:
*********************************************/
//移位法:
void main()
{
    uchar i,j;
    while(1)
    {
        P0=0xfe;
        for(i=0;i<8;i++)
        {
            delay_ms(500);//进入循环,先延时500ms
            P0<<=1; //P0口数据左移
            P0|=0x01; //将低位置1
            }
        P0=0x7f;
        for(i=0;i<8;i++)
        {
            delay_ms(500);//进入循环,先延时500ms
            P0>>=1; //P0口数据左移
            P0|=0x80;//将高位置1	
        }
    }
}



  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值