正文

【004】流水灯实验 [51]2006-04-06 22:06:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/wentao/12029.html

分享到:

实验目的:点亮二极管。
实验参考:笨笨工作室 实验二、基本I/O口试验二:跑马灯。(查看原文
实验板: FB51A(查看


正如学一门编程语言时第一个程序"Hello World!"一样, "流水灯"(也叫跑马灯)算是学习单片机的第一个程序吧!

电路如下:

汇编:

       org   0000h
       mov   a,#0feh
loop:  mov   p0,a
       lcall delay
       rl    a
       ajmp  loop

delay: mov   r6,#2h    ; djnz为二周期指令,机器周期为振荡周期的12倍.所以延时时间为:
temp:  mov   r5,#0ffh  ; 2×255×2×12×(1/12) =1ms,人眼分辨不出
       djnz  r5,$
       djnz  r6,temp
       ret
end

下载到实验板上并未看到预想的结果,八个LED都呈半亮状态。这是由于延时为1ms,人眼分辨不出闪烁的间隔,将延时时间增长如下:

       org    0000h
       mov   a,#0feh
loop:  mov   p0,a
       lcall delay
       rl    a
       ajmp  loop

delay: mov   r7,#100       ;djnz为二周期指令,机器周期为振荡周期的12倍.所以延时时间为:
temp1: mov   r6,#02h       ;100×2×255×2×12×(1/12) =100ms,
temp2: mov   r5,#0ffh
       djnz  r5,$
       djnz  r6,temp2
       djnz  r7,temp1
       ret
end

下载到实验板,这次可以看到最终结果,即LED从右(D0)到左(D7)循环点亮。



C51实现: 参考了AS综合系统的例程,才开始研究C51,还未从0写起,学习ing……

#include <reg51.h>
#include <intrins.h>

void delayms(unsigned char ms)         // 延时子程序
{                       
    unsigned char i;   
    while(ms--)
    {
        for(i = 0; i < 120; i++);
    }
}

main()
{
    unsigned char LED;
    LED = 0xfe;
    P0 = LED;
   
    while(1)
    {
        delayms(250);           
        LED = _crol_(LED,1);        //循环右移1位,点亮下一个LED
        P0 = LED;
    }
}


用Proteus仿真见: 【008】Proteus 第一次亲密接触 
 



阅读(5935) | 评论(9)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册