单片机原理与接口技术(第2版)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.3 单片机的应用

1.3.1 单片机应用领域

单片机的主要应用领域有以下几个方面。

1.智能化产品

单片机与传统的机械产品相结合,使传统的机械产品结构简单化,控制智能化,构成新一代的机电一体化产品。目前,单片机广泛用于工业自动控制(如数控机床、可编程顺序控制、电机控制、工业机器人、离散与连续过程自动控制)、家用电器(如微波炉、电视机、音响设备、游戏机)、办公设备(如传真机、复印机)、电信技术(如调制解调器、数字滤波、智能线路运行控制)等应用领域。在电传、打印机设计中,由于采用了单片机,可以节省近千个机械部件;用单片机控制空调机,使制冷量无级调节的优点得到了充分的发挥,并增加了多种报警与控制功能;用单片机还可以实现通信系统中的临时监控、自适应控制、频率合成、信道搜索等功能,从而构成自动拨号无线电话网、自动呼叫应答设备和程控调度电话分机等。

2.智能化仪表

将单片机植入测量、控制仪表后,能促进仪表向数字化、智能化、多功能化、综合化和柔性化发展,并使监测、处理、控制等功能一体化,使仪表质量大大减小,便于携带和使用,同时降低了成本,提高了性能价格比,长期以来测量仪器中的误差修正、线性化处理等难题也可迎刃而解。单片机智能仪表的这些特点不仅使传统的仪器、仪表发生根本的变革,也促进了传统仪器、仪表行业的技术改革。

3.智能化测控系统

测控系统特点是工作环境恶劣,各种干扰繁杂,而且往往要求测控实时性强、工作稳定可靠、抗干扰能力强。单片机最适合应用于工业测控领域,可以构成各种工业检测与控制系统,如温室气候控制、电镀生产线自动控制系统等。在导航控制方面,如导弹控制、鱼雷制导、智能武器装置、航天导航系统等领域中,单片机也发挥着不可替代的作用。

4.智能化接口

在通用计算机的外部设备中,如键盘、打印机、绘图仪、磁盘驱动器、UPS、图形终端和各种智能终端等,都已实现了单片机控制和管理。在计算机应用系统中,通常都采用单片机对接口设备进行控制和管理,使主机和接口设备能并行工作。这不仅大大提高了系统的运算速度,而且接口设备在单片机的控制下还可以对接口数据进行预处理,如数字滤波、线性化处理、误差修正等,减小了主机和接口界面的通信密度,极大地提高了接口控制的管理水平。例如,在通信接口中采用单片机可以对数据进行编码/解码、分配管理、接收/发送控制等工作。

由上所述,单片机技术无疑将是21世纪最为活跃的电子应用技术之一。随着微控制技术(以软件代替硬件的高性能控制技术)的发展,单片机的应用必将导致传统控制技术发生巨大变革。

1.3.2 单片机应用举例

单片机应用系统是以单片机为核心构成的智能化产品。其智能化体现在以单片机为核心构成的微型计算机系统,保证了产品的智能化处理与智能化控制能力。

下面通过一个利用单片机技术实现水塔水位自动控制的简单应用实例,说明单片机的实际应用,以增强读者学习单片机技术的兴趣。

1.水塔水位的控制原理

图1-3是一个水塔水位控制原理图。图中虚线表示允许水位变化的上下限。在正常情况下,应保持水位在虚线范围之内。为此,在水塔内的不同高度安装3根金属棒,以感知水位的变化情况。其中,A棒处于水位下限以下,B棒处于下限水位,C棒处于上限水位。A棒接+5 V电源,B、C棒各通过一个电阻与+5 V电源的地相连。水塔由电机带动水泵供水,单片机控制电机转动,以达到对水位控制之目的。

图1-3 水塔水位控制原理图

供水时,水位上升,当达到上限时,由于水的导电作用,B、C棒与A棒导电,从而与+5 V电源连通。因此,b、c两端均呈高电平状态,这时应使电机和水泵停止工作,不再给水塔供水。

当水位降到下限以下时,B、C棒不能与A棒导电,从而断开与+5 V电源的连通。因此, b、c两端均呈低电平状态。这时,应启动电机,带动水泵工作,给水塔供水。

当水位处于上下限之间时,B棒与A棒导电,而C棒不能与A棒导电。因此,b端呈高电平状态,c端呈低电平状态。这时,无论是电机已在运转状态,带动水泵给水塔供水,使水位不断上升;还是电机在停止状态,水泵停止给水塔供水,用户用水使水位在不断下降,都应维持电机和水泵的现有工作状态,直到水位上升到水位上限或下降到水位下限。

2.单片机控制器

应用8031单片机实现的水塔水位控制器如图1-4所示。

图1-4 应用8031单片机实现的水塔水位控制器

该控制器的作用说明如下:

(1)由于8031单片机没有内部ROM,因此,需外扩展外部ROM作为程序存储器。本系统使用2732 EPROM构成4 KB的外部扩展程序存储器,74LS373作为地址锁存器。

(2)两个高、低水位信号分别由8031单片机的P1.1口和P1.0口输入,这两个信号共有4种组合状态,见表1-6。其中,第三种组合(c=1、b=0)在正常情况下是不可能发生的,但在设计中还是应该考虑到,并作为一种故障状态处理。

表1-6 水位信号及操作状态表

(3)水泵电机的运转控制信号由8031单片机的P1.3口输出。为了提高控制的可靠性,使用了光电耦合器件。

(4)由8031单片机的P1.2口输出报警信号,驱动一支发光二极管实现光报警。

3.控制程序设计

硬件设计完成后,就该进行软件程序设计了。根据上述水位控制的要求和水位控制器的硬件设计,设计控制程序流程图和编写控制程序。程序设计可以用51汇编语言编程,也可用C51语言编程。下面分别给出用这两种语言的编程结果。

1)程序流程图

根据题意,设计水塔水位控制程序流程如图1-5所示。

图1-5 水塔水位控制程序流程图

2)51汇编语言程序

        ;****主程序****
                    ORG     0100H
                    ORL     P1, #03H        ;对P1口输入位初始化
                    AJMP    Star
            Loop:   ACALL   D10S            ;调用10 s延时程序
            Star:   MOV     A, P1           ;读水位检测口的状态
                    JB      ACC.1, St3_4    ;P1.1=1, 则转
                    JB      ACC.0, State2   ;P1.1=0, P1.0=1, 则转状态2
                    ;****P1.1=0, P1.0=0, 状态1****
            State1: SETB    92H             ;P1.2←1, 清除报警
                    CLR     93H             ;P1.3←0, 电机运转
                    AJMP    Loop
                    ;****P1.1=0, P1.0=1, 状态2****
            State2: AJMP    Loop            ;维持原状不变
            St3_4:  JB      ACC.0, State4   ;P1.1=1, P1.0=1, 则转状态4
                    ;****P1.1=1, P1.0=0, 状态3****
            State3: CLR     92H             ;P1.2←0, 故障报警
                    SETB    93H             ;P1.3←1, 电机停转
                    AJMP    Loop
                    ;****P1.1=1, P1.0=1, 状态4****
            State4: SETB    92H             ;P1.2←1, 清除报警
                    SETB    93H             ;P1.3←1, 电机停转
                    AJMP    Loop
        ;****延时子程序D10S(延时10 s)****
                    ORG     0150H
            D10S:   MOV     R3, #19H
            Loop1:  MOV     R1, #85H
            Loop2:  MOV     R2, #FAH
            Loop3:  DJNZ    R2, Loop3
                    DJNZ    R1, Loop2
                    DJNZ    R3, Loop1
                    RET

3)C51语言程序

        #include <reg52.h>
        #define uint unsigned int
        sbit P10=P1^0;              //定义位变量P10,表示P1.0
        sbit P11=P1^1;              //定义位变量P11,表示P1.1
        sbit P12=P1^2;              //定义位变量P12,表示P1.2
        sbit P13=P1^3;              //定义位变量P13,表示P1.3
        /*10s延时函数(按照单片机的晶振为12 MHz计算)*/
        void delay10s()
        {
          uint x, y, z;
          for (z=10;z>0;z--)
            {for(x=1000;x>0;x--)
              for(y=120;y>0;y--)
                {;}
            }
        }
        /*初始化函数*/
        void init()
        {
          P10=0x01;                 //将P1.0初始化为输入位
          P11=0x01;                 //将P1.1初始化为输入位
        }
        /*输入扫描和输出控制函数
          扫描P1.0和P1.1的状态,进而进行相应输出控制操作*/
        void scan_control ()
        {
          if(P11==1)
          {
            if(P10==1)
              {P12=1; P13=1;}        //若P1.1为1并且P1.0为1,则清除报警,电机停转
            else
              {P12=0; P13=1;}        //若P1.1为1并且P1.0为0,则故障报警,电机停转
          }
          else
          {
            if (P10==1)
              {;}                    //若P1.1为0并且P1.0为1,则维持原状不变
            else
              {P12=1; P13=0;}        //若P1.1为0并且P1.0为0, 则清除报警,电机运转
          }
        }
        /*主函数*/
        void main()
        {
          init();                   //调用初始化函数
          while(1)                  //进入不断循环
          {
            scan_control();          //调用输入扫描和输出控制函数
            delay10s();              //调用10 s延时函数
          }
        }