初步认识51单片机

发布者:GoldenSerenity最新更新时间:2016-03-29 来源: eefocus关键字:初步认识  51单片机 手机看文章 扫描二维码
随时随地手机看文章
前面我们学会了如何操作一个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单片机 引用地址:初步认识51单片机

上一篇:初步认识51单片机-2.2单片机控制LCD1602液晶显示模块
下一篇:单片机环境的搭建-1.4点亮一个LED

推荐阅读最新更新时间:2024-03-16 14:48

使用51单片机编写计时器(分钟,秒钟分离版)
针对网络上大部分例程序只有倒计时秒 , 无法一眼看出还剩多少时间,因此做考试计时器不具备实用性。 因此,编写一个 分钟,秒钟分离的版本,方便考生的时间控制。 /*================================================================== 编写时间: 2022.04.21 设计目标: 四位共阴极数码管, 前两位为分钟后两位为秒钟。 设定时间为90分钟,开机后开始倒计时。 硬件电路设计: 数码管使用4个NPN三极管驱动,基极通过1K电阻连接STC89C51的 P1.0-P1.4 口。发射极共地,集电极接数码管阴极。 数码管数据位分别通过电阻限流后同S
[单片机]
mcs51单片机有什么组成 分别有什么功能作用
  MCS51是指由美国INTEL公司生产的一系列单片机的总称,这一系列单片机包括了好些品种,如8031,8051,8751,8032,8052,8752等,其中8051是最早最典型的产品,该系列其它单片机都是在8051的基础上进行功能的增、减、改变而来的,所以人们习惯于用8051来称呼MCS51系列单片机,而8031是前些年在我国最流行的单片机,所以很多场合会看到8031的名称。   mcs51单片机组成   运算器   运算器以完成二进制的算术/逻辑运算部件ALU为核心,再加上暂存器TMP、累加器ACC、寄存器B、程序状态标志寄存器PSW及布尔处理器。累加器ACC是一个八位寄存器,它是CPU中工作最频繁的寄存器。在进行算术、逻
[单片机]
mcs<font color='red'>51单片机</font>有什么组成 分别有什么功能作用
基于51单片机控制可上下楼的电梯proteus仿真及程序
基于51单片机控制的可上下楼的电梯 仿真原理图如下: 单片机源程序如下: #include reg51.h #include intrins.h #define uint unsigned int #define uchar unsigned char uchar code table ={0x3f,0x06,0x5b,0x4f}; uchar num,temp,busy,flag,uf,df,ref,now,next,setf,floor; uint tn; sbit start=P1^0; sbit F1=P1^1; sbit F2=P1^2; sbit F3=P1^3; sbit UPI=P1^4; sbit DN
[单片机]
基于<font color='red'>51单片机</font>控制可上下楼的电梯proteus仿真及程序
51单片机 定时器0中断实现LED流水灯
使用51单片机定时器0 方式1实现LED流水灯 代码: #include reg52.h typedef unsigned int u16; void timer0init() { TMOD=0x01; ET0=1; EA=1; TR0=1; TH0=64736/256; TL0=64736%256; } void main() { timer0init(); while(1); } void timer0() interrupt 1 { u16 i; TH0=64736/256; TL0=64736%256; i++; switc
[单片机]
MCS-51单片机实用子程序库(四)
(二) MCS-51 浮点运算子程序库及其使用说明 本浮点子程序库有三个不同层次的版本,以便适应不同的应用场合: 1.小型库(FQ51A.ASM):只包含浮点加、减、乘、除子程序。 2.中型库(FQ51B.ASM):在小型库的基础上再增加绝对值、倒数、比较、平方、开平方、 数制转换等子程序。 3.大型库(FQ51.ASM):包含本说明书中的全部子程序。 为便于读者使用本程序库,先将有关约定说明如下: 1.双字节定点操作数:用 或 来表示存放在由R0或R1指示的连续单元中的数 据,地址小的单元存放高字节。如果 =1234H,若(R0)=30H,则(30H)=12H,(31H)=34H。 2.二进制浮点操作数:用三个字节表示,第一个字节
[单片机]
51单片机使用定时器进行数码管动态扫描程序
数码管是51单片机学习中比较基础的一个模块,为简化电路连接,提高系统可靠性,降低制造成本,多位数码管广泛采用动态扫描的方式进行显示。如果程序编写不当,数码管动态扫描容易出现亮度不均匀、亮度过低、重影等现象。很多初学者会在主函数中使用while(1)循环,结合delay函数不断扫描,但这样得不断调用display扫描,如果单片机还要执行别的程序时,就会由于扫描不及时,导致各种问题。此外,在控制段选位选的先后顺序上,如果程序不当,则会造成显示重影等问题。在此给出一个稳定可靠的程序方案。 电路连接:P1口通过两个74HC573分别连接到八位数码管的段选和片选,段选、位选由P3.4和P3.5控制,低电平锁存 #include re
[单片机]
51单片机模拟SPI总线通信程序及proteus仿真
分享一个51单片机模拟SPI总线来进行通信的程序及仿真 仿真原理图如下 单片机源程序如下: #include reg51.h //包含单片机寄存器的头文件 #include intrins.h //包含_nop_()函数定义的头文件 //x5045引脚定义 sbit SCK=P3^4; //将SCK位定义为P3.4引脚 sbit SI=P3^5; //将SI位定义为P3.5引脚 sbit SO=P3^6; //将SO位定义为P3.6引脚 sbit CS=P3^7; //将SCK位定义为P3.7引脚 //功能变量定义 #define WREN 0x06 //写使能锁存器允许 #define WRD
[单片机]
<font color='red'>51单片机</font>模拟SPI总线通信程序及proteus仿真
51单片机演奏音乐“祝你生日快乐”
;祝你生日快乐 ORG 0000H LJMP START ORG 000BH INC 20H ;中断服务,中断计数器加1 MOV TH0,#0bbH ;d8 MOV TL0,#0EFH ;12M晶振,形成10毫秒中断 RETI START: INITIAL:MOV SP,#50H MOV TH0,#0D8H MOV TL0,#0EFH M
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved