栏目导航

 学生工作思路 
 学生党建 
 团委工作 
 学生社团 
 学子风采 
 奖贷勤助补医 
  • “双一流”建设

    更多>>
  • 当前位置: 首页>>学生工作>>团委工作>>正文
    “舰船模型队基本知识普及栏目”之走近嵌入式应用(单片机篇)01
      审核人:

    单片机是一种集成在电路芯片,采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的计算机系统。

    简而言之,单片机就是集成在一个芯片中的计算机系统,是一种典型的嵌入式微控制器(Microcontroller Unit),常用英文字母的缩写MCU。麻雀虽小,五脏俱全。下面,我们将从应用普遍而结构简单的AT89C52(见图1)开始讲解单片机的基本控制应用。(AT89C52的特性请参考相关书籍)

    图1

    计算机常被称为“电脑”,当我们将控制指令通过一定“语言”编写程序文件,并将此程序文件烧写到(告诉)单片机的程序存储器(即电脑的记忆)中,重新复位单片机(电脑),单片机就可以根据这些“记忆”作出人们原先设定的步骤和操作去完成相应的实际任务。

    常用来跟单片机打交道的计算机语言有两种:汇编语言和C语言。由于C语言有其高级语言的优势,除了单片机最基本最底层的程序(一般已在编程环境项目模板中编写好)一般使用汇编语言外,其余的程序编写已经广泛的使用了C语言。

    举一个最简单的例子:

    #include <reg52.h>

    void main()

    {

    While(1);

    }

    可以看出,整个主函数main()中只有一个永远执行下去的死循环。在以前学过的C语言中,这样做是不被允许的;而这样的指令在单片机看来,就是让它一直处于“等待”状态,不做任何动作。

    实际上,我们使用单片机肯定是需要它执行一定的“任务”,那么相比于以前学过的C语言提到的第一个程序:Hello world,单片机当然也有它最基本的第一个程序,那就是点灯程序:(电路如图2)

    图2

    #include <reg52.h>

    void delay1ms(uint i); // 定义ims软件延时函数

    sbit LED = P1 ^ 0; //定义位变量LED,指向单片机P1.0口

    void main()

    {

    LED = 1;

    delay1ms(1000); //延时1000ms 即1秒

    LED = 0; //使P1.0口输出低电平,点亮LED灯

    While(1);

    }

    void delay1ms(uint i) //延时函数 通过循环i×125次空操作达到延时目的。

    {

    uint j;

    for(;i>0;i--)

    {

    for(j=0;j<125;j++);

    }

    }

    sbit命令为定义一个位变量,即把IO口P1的第0个管脚的位地址赋给变量LED。而LED的取值为0或1。0代表P1.0口输出低电平,为1则代表该口输出高电平。由电路图可以看出,当P1.0输出低电平,LED灯导通并点亮。

    通过以上例程,相信大家对单片机的最常用接口,通用输入/输出接口(下称IO口)有了一个初步的认识。本章我们将主要讲解IO口的基本应用操作。

    AT89C52单片机共有4组8位IO口,即为P0~P3。因为各组IO口都为准双向口,因此IO口不能同时处于输入和输出功能。另外,IO口作为输入口时需向该IO口写1(默认状态下,IO口初始状态为1)。

    P0不具有内部上拉电阻,所以作为输出时需外接上拉电阻(如图3),当访问外部程序和数据存储器时,P0口也被作为低8位地址/数据复用。

    图3

    P1有个别管脚具有第二功能:

    P1.0 T2(定时器/计数器T2的外部计数输入),时钟输出

    P1.1 T2EX(定时器/计数器T2的捕捉/重载触发信号和方向控制)

    P1.5 MOSI(在系统编程用)

    P1.6 MISO(在系统编程用)

    P1.7 SCK(在系统编程用)

    P2:在访问外部程序存储器或用16位地址读取外部数据存储器(例如执行MOVX @DPTR)时,P2 口送出高八位地址。在这种应用中,P2 口使用很强的内部上拉发送1。在使用8位地址(如MOVX @RI)访问外部数据存储器时,P2口输出P2锁存器的内容。

    P3的各个位都有第二功能:

    P3.0 RXD(串行输入口)

    P3.1 TXD(串行输出口)

    P3.2 INTO(外中断0)

    P3.3 INT1(外中断1)

    P3.4 TO(定时/计数器0)

    P3.5 T1(定时/计数器1)

    P3.6 WR(外部数据存储器写选通)

    P3.7 RD(外部数据存储器读选通)

    IO口用赋值法进行电平输出(相关IO口地址已在reg52.h头文件中定义了),可以通过sbit指令定义相关位变量,通过向该位变量赋0或1值去控制该位进行相应的电平输出,如之前的点灯程序就是用了这种方法;也可以直接对一组IO口赋一个8位二进制的数值直接对一组IO口进行赋值,如P1 = 0xF0。0xF0代表0F0H,即11110000B,这样P1.4~P1.7被赋1值,输出高电平,P1.0~P1.3被赋0值,输出低电平。

    IO口做输入时,用查询法获得各个位的输入电平。类似输出方式,我们可以通过sbit指令定义相关位变量,在该位为高电平的前提下(默认条件下为高电平),可以用if或while语句查询该位输入电平,如

    ……

    sbit button = P1 ^ 0, led = P1 ^ 1;

    ……

    void main(){

    while(button==1); //此处为空语句,只有查询到button(P1.0口)输入为低电平//(即按钮闭合)时候才能跳出循环;

    led = 0; //符合button输入低电平,做下一步操作

    while(1);}

    电路如图4

    图4

    也可以通过对整个8位IO口输入信息的判断来进行查询。如把上例while句改为while(P1==0xFE);0xFE即11111110B,P1口八位管脚均保持默认的高电平,而P1.0口查询到了有低电平输入。

    本章介绍了AT89C52通用输入/输出口的基本用法,希望能帮助没有单片机基础的同学了解到单片机并行IO口的一些基本应用知识。我们编写程序,通过IO口输入功能可以有目的的查询输入数据,进行判断或信息获取,并可以通过IO口的输出功能对外接设备做出相应动作,执行相关任务。下一章将通过对7段数码管和键盘读写来扩展讲解IO口的基本用法。下期见。