实验目的:点亮二极管。
实验参考:笨笨工作室 实验二、基本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 第一次亲密接触
评论