用Keil C51制作和原理解析简单流水灯

P1.单行最简流水灯示例

首先先看原理图,下面为对应解释

  • 最好使用低电平驱动,所谓低电平驱动就是引脚部分为低电平,就如图中电路所示,VCC处于LED右侧,故LED右侧高电平而其左侧低电平,符合条件
  • 这里使用八个LED,自上而下排列, 注意这里我们使用P0口,因为其电压最大方便观察
  • P0口为P0.0-P0.7,所以注意序号的标注!
  • 请添加图片描述

    代码时间
    这里使用keil C51进行编写,首先看向文件头部

    1. 需要添加头文件<reg51.h>,里面包含了大多数我们需要用到的函数,比如我们接下来要用到的_crol_()函数
    2. 定义两个宏,是为了下文编写数据更加方便
    #include<reg51.h>
    #include<intrins.h>
    
    #define uchar unsigned char
    #define uint unsigned int
    

    编写延迟代码(非常重要!建议牢记!经常使用!)

    1. 特别注意,我们这里t<255是因为uchar类型的最大范围就是0-255,不要溢出了!!!
    2. uint i形参的存在就是为了让我们改变延迟的倍数的
    3. 对应不同的机型,for循环的次数至少要达到20000次,延迟时长才能基本符合人眼观察需要
    void delay_ms(uint i)
    {
    	uchar t;
    	while(i--)
    	{
    		for(t=0;t<255;t++);
    	}
    }
    

    流水灯主体代码

    1. P0=0xfe代表着激活P0口上的地址为0xfe的子口,因为P0下属有8个孔,而0xfe地址对应的就是P0.0口
    2. 之后进入循环,调用我们的延迟函数并传入实参60,大家可以任意调节
    3. crol(P0,1)表示将P0口的地址左移一位(参一为欲处理的口,参二为移动位数),然后将结果赋予会P0口,以此来达到激活下一个LED的目的
    4. 如此循环往复,必定会回到起始地址0xfe,此刻即形成流水灯

    注意区分_crol_()函数和左移符号<<
    左移函数_crol_()表示将其高位取出补到低位的左移!
    而左移符号<<表示删除高位而低位补零,最终将导致地址全部变成零,解决该问题需要二进制操作,所以我们这里不使用此方法!
    (注:与此同时还有_cror_()表示右移,这和下一个流水灯案例有关)

    void main()
    {
    	P0=0xfe;
    	while(1){
    		delay_ms(60);
    		P0=_crol_(P0,1);
    	}
    }
    

    这是完整的代码

    #include<reg51.h>
    #include<intrins.h>
    
    #define uchar unsigned char
    #define uint unsigned int
    
    void delay_ms(uint i)
    {
    	uchar t;
    	while(i--)
    	{
    		for(t=0;t<255;t++);
    	}
    }
    
    void main()
    {
    	P0=0xfe;
    	while(1){
    		delay_ms(60);
    		P0=_crol_(P0,1);
    	}
    }
    

    之后返回proteus,双击单片机,弹出窗口的program file选择我们刚刚编译好的hex文件即可,确认以后点击proteus左下角播放即可看到结果


    物联沃分享整理
    物联沃-IOTWORD物联网 » 用Keil C51制作和原理解析简单流水灯

    发表评论