×
单片机 > 单片机程序设计 > 详情

初步认识51单片机

发布时间:2020-08-31 发布时间:
|
前面我们学会了如何操作一个MCU的管脚(P1.0),让它设置为低电平(sbit LED= P1^0; LED=0),那么我们很容易的就能想到如何将MCU的管脚设置成高电平. 这一讲,我们就来讨论如何控制单片机的IO口,也就是输入输出端口(input and output port)

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单片机 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机制作超级流水灯