2.1单片机IO口操作与延时
既然我们学会了如何控制P1.0,那么同样的方式我们就能控制P1.1,P1.2, ... P1.7了。很奇怪,为什么单片机的引脚从P1.0开始到P1.7,为什么不是从P1.1到P1.8?基本上你所见到的控制芯片都是以0为起始的。我们把P1.0到P1.7叫做P1端口。那么这样的端口有多少个呢,在STC89C52中,一共有4组这样的端口,分别是P0,P1,P2,P3. 每个端口都有8个管脚,这样很快,我们应该知道操作这4组共32个管脚了。我相信写到这里,每个人都已经知道了如何使用这32个任意一个管脚来控制LED。
既然我们学会了如何控制一个LED,那么如何控制两个LED?很容易的能猜到代码如下:
#include
sbit LED1 = P1^0;
sbit LED2 = P1^1;
sbit LED3 = P2^1;
void main(void)
{
while(1)
{
LED1=0;
LED2=0;
LED3=0;
}
}
通过以上方式我们能用任意的IO端口来点亮LED。这里就不再赘述了。
既然我们学会了如何点亮一个LED,相信熄灭一个LED也会了,并且你能很快的写出代码:
#include
sbit LED = P1^0;
void main(void)
{
while(1)
{
LED = 0;
LED = 1;
}
}
这样对不对?是对的。LED=0,灯亮了,LED=1灯灭了。程序确实是没有问题,LED也是这样操作的。问题是人的肉眼分辨不出来,为什么呢?这里就涉及到了单片机的运行速度以及人眼的分辨间隔。下面我们来分析从LED=0(亮)到LED=1(灭),中间的间隔是多长时间?这个涉及到单片机的执行速度与时钟周期,机器周期,指令周期相关,我们暂且不讨论。现在我们通过keil软件调试的方法找到从LED=0到LED=1这个过程花了多长时间。
(1) 打开keil软件,新建一个工程,并将以上代码拷入led.c文件
(2) 点击Project->options for Target Target1...
(3) 在弹出的对话框中选择target, Xtal选择11.0592,然后点击OK
(4) 点击debug图标,红色方框所示
(5) 弹出来的界面比较糟糕,可以自己调节,如何调节?这里举一个例子,比如我想移动Register这个窗口,用鼠标左键点击Register窗口的标题栏(窗口的蓝色部分),按住鼠标不松开并拖动。
此时界面如上图所示,四个红色方框内的方框表示四个方向。此时将鼠标不松开继续拖动到右边红色方框中(注意是要把鼠标放到方框内),结果如下:
此时右边区域会变为蓝色,该区域表示Register即将存放的区域,然后松开鼠标,拖动结束。
点击Register窗口中Auto hide图标,如下图红色方框所示,将Register窗口自动隐藏。
其他窗口的调整方法类似。
(6) 插入断点。如下图所示,在红色方框位置双击鼠标,则自动插入断点,并且出现红色断点标志。
这里我们插入两个断点如图所示
点击红色方框(1)中的RST,然后点击红色方框(2)中的run,此时黄色箭头会跳到红色方框(3)处,记录红色方框(4)中的时间t1=0.00042209s
点击方框(2)中的run,此时黄色箭头会跳到红色方框(5)处,记录红色方框(4)中的时间t2=0.00042426s,那么t2-t1=0.00000217s=2.17us,
表示LED从点亮到熄灭只用了2.17微秒,而人眼的最小分辨时间间隔大约为0.27s(270000微秒),因此感知不到灯的亮灭过程。你可以将这个程序下载到单片机中做做实验,你会发现LED很暗。事实上以上程序将导致LED循环亮灭,由于变化时间太快,几个微秒,我们无法感知,因此给人的感觉就是灯很暗。现在我们如何设置延时,让我们能更清楚的观察灯的亮灭过程?思路很简单,让单片机点亮LED后,去干点别的事情,然后再熄灭LED。这个就好比你坐火车时,提前到了一个小时,你可以看看书,玩玩手机。目的是坐火车,看书,玩手机只起到消磨时间的作用。那么同样,在本例中,我们让单片机干什么事情呢?可以选择休眠(我们后面讲到),或者让它去数数。比如从1数到10000等等。这种方式就叫做软件延时。
#include
sbit LED = P1^0;
void main(void)
{
unsigned int i;
while(1)
{
LED = 0;
for(i=0;i<40000;i++);
LED = 1;
for(i=0;i<40000;i++);
}
}
将以上代码复制到led.c文件中并保存。该段代码中,通过去做别的事情来达到延时的作用。我们再次调试看看LED熄灭和点亮时间的间隔,设置断点如下:
以上可以看出,1.60636393s-0.00042318s 大约1.6s,远远大于人的分辨时间。
既然我们能控制一个LED的亮灭了,那么同理可知,我们当然知道如何控制并延时其他LED了,这样我们就学会如何操作单片机的IO端口以及如何通过软件延时了。
下面我们来看看就这两招能干什么事情?
上一篇:初步认识51单片机-2.2单片机控制LCD1602液晶显示模块
下一篇:单片机环境的搭建-1.4点亮一个LED
推荐阅读最新更新时间:2024-03-16 14:48