智能寻迹避障小车电机控制系统设计_第1页
智能寻迹避障小车电机控制系统设计_第2页
智能寻迹避障小车电机控制系统设计_第3页
智能寻迹避障小车电机控制系统设计_第4页
智能寻迹避障小车电机控制系统设计_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第一章 智能寻迹避障小车电机控制系统设计1任务 任务一:产生智能寻迹避障小车电机的基本控制信号;任务二:编制智能寻迹避障小车基本巡航动作的控制函数;2要求(1)能控制智能寻迹避障小车电机的旋转方向和速度;(2)能控制智能寻迹避障小车实现基本巡航动作;1.1 项目描述本项目的主要内容是:对C51单片机编程,使之产生控制电机旋转方向和转速的各种基本控制信号,然后在此基础上编制出能够控制智能寻迹避障小车实现前进、后退、左转弯、右转弯等基本巡航动作的控制函数。控制电机旋转是智能寻迹避障小车实现各种导航控制的重要基础,在本书后续项目模块中都要用到对电机的控制,因此本章所设计出的电机控制函数将作为功能模块

2、被后续设计案例直接调用;通过该项目的学习与实践,可以让读者获得如下知识和技能: 掌握单片机I/O端口的基本应用方法; 学会单片机C语言的基本编程方法; 掌握直流伺服电机的基本工作原理和控制方法; 掌握直流减速电机的基本工作原理和控制方法; 掌握H电桥驱动直流电机的工作原理与控制方法,即直流电机驱动芯片L293工作原理; 能够编制控制轮式教育机器人实现基本巡航动作的控制函数;1.2 必备知识 1.2.1伺服电机伺服:一词源于希腊语“奴隶”的意思。人们想把“伺服机构”当个得心应手的驯服工具,服从控制信号的要求而动作。在信号来到之前,转子静止不动;信号来到之后,转子立即转动;当信号消失,转子能即时自

3、行停转。由于它的“伺服”性能,因此而得名。标准的伺服电机有三条控制线,分别为:电源、地线及控制线。电源线与地线用于提供内部的电机及控制线路所需的能源,控制信号要求是一个周期性的正向脉冲信号,这个周期性脉冲信号的高电平时间通常在1ms2ms之间,而低电平时间应在5ms到20ms之间。本书向读者介绍的伺服电机是PARALLAX公司生产的连续旋转伺服电机,它的控制信号时序是:低电平时间固定为20ms,高电平为1.3ms1.7ms之间。图1.1为PARALLAX公司生产的直流伺服电机外形图。 图1.1 直流伺服电机外形图1.2.2 直流电机 方案二中采用的是直流减速电机,在此只介绍该电机的控制方法,对

4、于其内部结构不作介绍。该电机外形示意图如图1.2所示,它有红、黑两根控制线,电机状态控制电平如表1-1所示。 表1-1 电机控制电平与状态对应表红线控制端黑线控制端电机状态 0 1 顺转 1 0 逆转 1 1 停转直流电机的控制信号由单片机输出送至电机驱动芯片L293后,经L293内部H电桥电路驱动电机运转。 图1.2 直流电机外形图1.2.3 直流电机H桥驱动电路工作原理 本设计中直流电机H桥驱动电路由驱动芯片L293D完成,在L293D内部形成一个H桥型的驱动驱动电路,类似如图1.3所示。图中用开关模拟电机信号通断,在实际的控制中是采用晶体三极管来完成此功能,可参见图1.4所示的电机控制示

5、意图。此处只是为简述控制原理,所以用开关模拟电机工作过程。 图1.3 H桥驱动直流电机电路 从图中可以看出,其形状类似于字母“H”,而作为负载的直流电机是像“桥”一样架在上面的,所以称之为“ H 桥驱动”。4个开关所在位置就称为“桥臂”。从电路中不难看出,假设开关A、D接通,电机为正向转动,则开关B、C接通时,直流电机将反向转动。从而实现了电机的正反向驱动。借助这4个开关还可以产生电机的另外2个工作状态:(1) 刹车 将B 、D开关(或A、C)接通,则电机惯性转动产生的电势将被短路,形成阻碍运动的反电势,形成“刹车”作用。(2) 惰行 4个开关全部断开,则电机惯性所产生的电势将无法形成电路,从

6、而也就不会产生阻碍运动的反电势,电机将惯性转动较长时间。 图1.4 电机控制示意图电路 1.2.4 延时函数在实际的单片机应用系统开发过程中,由于程序功能的需要,经常编写各种延时程序,延时时间从数微秒到数秒不等。实现延时通常有两种方法:一种是硬件延时,要用到单片机的定时器/计数器,这种方法可以提高CPU的工作效率,同时也能做到精确延时;另一种是软件延时,这种方法主要采用循环体进行,本项目开发过程中采用的是软件延时的方法,在后续各项目模块中经常作为延时功能调用的几个延时函数原形如下:void delay_ns(uint i) /延时微秒级函数 i=i/10; while(-i); void de

7、lay_nms(uint n) /延时毫秒级函数 n=n+1; while(-n) delay_ns(900); void delayms(uint x)/延时函数 12兆晶振 1000为一秒; 11.0592兆晶振 922为一秒 (会有一定误差)uchar i;while(x-)for(i=0;i123;i+);上述函数设计的基本原理是通过执行循环体来消耗时间从而达到延时的目的,其中delay_nms( )是毫秒级的延时,而delay_ns( )是微秒级的延时。例如:如果你想延时1毫秒,可以使用语句delay_nms(1); 延时100微秒则可使用语句delay_ns(100) ;来完成。注

8、意:上述延时函数是在外部晶振为12MHZ的情况下设计的,如果外部晶振频率不是12MHz,调用这两个函数所产生的真正延时就会发生变化。对于许多C51开发者特别是初学者编制非常精确的延时函数有一定难度,关于延时函数的编程经验和技巧此处不作详细介绍,读者目前只要会将这两个函数作为功能模块调用就行了1.3 案例设计 1.3.1 系统设计方案本项目向读者详细介绍了两种实现方案,其中学员实操采用方案二进行。同时该项目设计为本书后续设计案例的基础控制模块,后续的寻迹、避障等功能模块实在该项目上扩展实现的。方案一:该设计方案采用CPU对执行机构输出控制,不涉及到对外部数据信息的采集,因此,系统采用“CPU+执

9、行机构”的总体设计方案,其中CPU采用目前性价比较高的STC89C52单片机,并以此为核心构建最小控制系统,执行机构的动力装置采用PARALLAX公司生产的连续旋转伺服电机,其优点是编程控制方便且不需额外增加驱动电路,系统总体框图如图1.5所示。 图1.5 方案一系统框图方案二:采用“单片机最小系统+电机驱动芯片+直流电机”的设计方案,设计方案中的电机采用直流减速电机,该电机具有控制原理简单、性价比高,易于控制等特点,被广泛应用于各种智能玩具小车设计之中;电机驱动采用集成芯片L293完成,该芯片运用H电桥驱动直流电机的控制原理实现对直流电机旋转方向和速度的控制。系统总体框图如图1.6所示。 图

10、1.6 方案二统框图1.3.2 硬件电路设计方案一:该设计方案的硬件电路如图1.7所示:它是在单片机最小系统的基础上直接?础_0ol_1连接伺服电机构成的,其中左电机的控制信号由P1_0提供,右电机的控制信号由P1_1提供,直接对该两个端口编程,便可实现对伺服电机旋转方向和速度控制。图1.7 方案一系统原理图方案二:该设计方案的硬件电路如图1.8所示:电机控制信号由单片机的P0.0P0.3输出送到电机驱动芯片的2脚与7脚以及10脚与15脚,再从芯片的3脚与6脚(左电机控制)以及11脚与14脚(右电机控制)输出驱动电机工作。图1.8 方案二系统原理图1.3.3 系统软件设计任务一:产生智能寻迹避

11、障小车电机的基本控制信号 方案一:本任务是对单片机编程,在指定的单片机引脚P1_0输出伺服电机的各种控制信号。1、源程序sfr P1 = 0x90; /P1口C51定义;sbit P1_0 = P10; /特殊功能位定义#define uint unsigned intvoid delay_ns(uint i) /延时ns函数 i=i/10; while(-i); void delay_nms(uint n) /延时nms函数 n=n+1; while(-n) delay_ns(900); int main(void) /主函数while(1)P1_0=1; /P1_0输出高电平delay_n

12、s(1500); /延时1。5msP1_0=0; /P1_0输出低电平 delay_nms(20); /延时20ms2、程序运行及调试在智能寻迹避障小车控制板上按图1.7连接伺服电机控制电路,编译以上程序,将产生的可执行文件烧写到控制板上的单片机程序存储器,具体操作步骤如下:步骤1:启动Keil uVision4 IDE,完成对上面程序的编辑,编译和调试,产生可执行的HEX文件。步骤2:将ISP下载线一端连接到PC机的并行接口上,另一端(小端)连接到智能寻迹避障小车的程序下载口上。打开ISP下载软件将步骤1获得的HEX文件下载到智能寻迹避障小车的单片机内部程序存储器,开启电源,运行程序,用示波

13、器测量P1_0引脚,可测出使伺服电机转速为零的控制信号,其波形如图1.9所示。图1.9 使伺服电机转速为零的控制信号4理信号sf,而时序图将程序中的delay_ns(1500)改成delay_ns(1300),即延时1.3ms,再重复以上步骤,可用示波器测得使伺服电机使电机顺时针全速旋转的控制信号,其波形如图1.10所示。图1.10 使电机顺时针全速旋转的控制脉冲序列将程序中的delay_ns(1500)改成delay_ns(1700),即延时1.7ms,再重复以上步骤,可用示波器测得使伺服电机逆时针全速旋转的控制信号,其波形如图1.11所示。图1.11 使伺服电机逆时针全速旋转的脉冲序列在1

14、.3ms1.5ms1.7ms时间范围内改变延时函数的延时量,可获得控制伺服电机不同旋转方向和转速的各种波形。步骤3:对伺服电机进行零点标定所谓伺服电机零点标定是指当发送一个使伺服电机转速为零的控制信号给伺服电机时,让电机保持静止不动的过程,伺服电机在出厂时没有预先标定,因此需要调整。具体做法是:将步骤2产生的使电机转速为零的控制程序加载到单片机程序存储器,开机运行,若电机有旋转,说明未标定,用螺丝刀调整伺服电机上的电位器,同时观察电机的旋转情况,直到电机停止转动,表明已经标定。电机标定后,用步骤2产生的各种控制信号测试电机的旋转方向和速度,观察电机的运行情况,可以实现对电机的不同旋转方向和速度

15、的控制。3、程序设计思路基本思路是:根据伺服电机的控制信号的时序要求,调用延时函数控制单片机引脚高低电平的持续时间,并用循环执行的方式使单片机引脚不断的输出伺服电机控制信号。产生伺服电机基本控制信号的程序流程图1.12所示:图1.12 主函数流程图即利用延时函数将指定的引脚的低电平持续时间固定为20ms,而高电平持续时间根据需要在“1.3ms1.5ms1.7ms”时间范围内改变,然后循环执行,就可获得能够控制伺服电机不同旋转方向和转速的各种控制脉冲信号。方案二:对单片机P0.0、P0.1(左电机)和P0.2、P0.3(右电机)编程,程序设计以左电机为例。1、源程序#include#define

16、 uint unsigned int#define uchar unsigned charsbit zuo1=P01; /左电机端口定义sbit zuo2=P00;sbit you1=P03; /右电机端口定义sbit you2=P02;void delay(uint x) uchar i;while(x-)for(i=0;i123;i+);void qian()zuo1=0;zuo2=1;/左边往前you1=0;you2=1;/右边往前main()while(1)qian();delay(922*5);2、程序运行及调试在智能寻迹避障小车控制板上按图1.8连接伺服电机控制电路,编译以上程序,

17、将产生的可执行文件烧写到控制板上的单片机程序存储器,具体操作步骤如下:步骤1:启动Keil uVision4 IDE,完成对上面程序的编辑,编译和调试,产生可执行的HEX文件。步骤2:将STC下载线一端连接到PC机的并行接口上,另一端(小端)连接到智能寻迹避障小车的程序下载口上。打开STC下载软件将步骤1获得的HEX文件下载到智能寻迹避障小车的单片机内部程序存储器,开启电源,运行程序,此时左右电机顺时针旋转,小车前进。将上述程序中的前进函数中的左右端口控制电平按表1-1所示的修改,编辑、编译后便可以得到电机逆转(后退)、停转(原地不动)的控制函数。任务二:编制智能寻迹避障小车基本巡航动作的控制

18、函数方案一:本任务是在伺服电机基本控制信号的基础上设计出智能寻迹避障小车的基本巡航动作的控制函数,并按一定的算法调用这些控制函数,使智能寻迹避障小车完成比较复杂的运动。1、源程序 *=程序名:Control.c功 能:控制轮式教育机器人实现前后左右运动的基本动作=*/#include #define uint unsigned int#define uchar unsigned charvoid delay_ns(uint i); /函数声明void delay_nms(uint n);void Forward(void);void Left_Turn(void);void Right_Tur

19、n(void) ;void Backward(void) ;uchar Navigation10=F,L,F,F,R,B,L,B,B,Q;main(void)/主函数int addr=0;while(Navigationaddr!=Q) switch(Navigationaddr)case F:Forward();break;case L:Left_Turn();break;case R:Right_Turn();break;case B:Backward();break;addr+; void delay_ns(uint i) /延时ns i=i/10; while(-i); void de

20、lay_nms(uint n) /延时n ms n=n+1; while(-n) delay_ns(900); void Forward(void)/前进子函数 uchar i; for(i=1;i=65;i+)P1_1=1;delay_ns(1700); P1_1=0;P1_0=1;delay_ns(1300);P1_0=0;delay_nms(20);void Left_Turn(void)/左转弯子函数 uchar i; for(i=1;i=26;i+)P1_1=1;delay_ns(1300); P1_1=0;P1_0=1;delay_ns(1300);P1_0=0;delay_nms

21、(20);void Right_Turn(void) /右转弯子函数 uchar i; for(i=1;i=26;i+)P1_1=1;delay_ns(1700); P1_1=0;P1_0=1;delay_ns(1700);P1_0=0;delay_nms(20);void Backward(void) /后退子函数 uchar i; for(i=1;i=65;i+)P1_1=1;delay_ns(1300); P1_1=0;P1_0=1;delay_ns(1700);P1_0=0;delay_nms(20);2、运行程序这里仍然按图1.7连接伺服电机控制电路,编译以上程序,将产生的可执行文件

22、烧写到智能寻迹避障小车控制板上的单片机程序存储器,开机运行,可以看到小车能按如下规律运动,即:前进左转弯前进前进右转弯后退左转弯后退后退停止,仔细观察可以发现,它的运动轨迹接近一个矩形。3、程序设计思路主函数按数组设定的次序依次调用前进,左转弯、右转弯和后退等四个基本控制函数,这四个函数是在任务一介绍过的伺服电机基本控制信号的基础上设计的,下面我们重点以“前进子函数”为例介绍其基本设计思路,为了便于分析,这里再把程序中的“前进子函数”单独列出如下:void Forward(void)/前进子函数 uchar i; for(i=1;i=65;i+)P1_1=1;delay_ns(1700); P

23、1_1=0;P1_0=1;delay_ns(1300);P1_0=0;delay_nms(20);仔细分析以上程序,根据P1_0和P1_1引脚的高低电平持续时间,可以画出让轮式教育机器人前进的左右电机控制脉冲时序图,如下: 图1.13 前进控制信号时序图对照任务一中介绍过的伺服电机正转、反转控制信号,我们发现,以上控制小车前进的脉冲信号有两个问题需要进一步解释。第一:因为伺服电机安装在车架上的朝向刚好相反,其中一个电机如果原来是正转,那么掉转朝向之后就变成了反转,所以要使两个电机带动两个轮子朝一致的方向转动,就必须让两个伺服电机的旋转方向为一正一反。第二:因为受到单片机的编程限制,两个电机的控

24、制脉冲并没有在时间上保持绝对的同步(如图1.13所示),这样看起来似乎一个电机要先动作,而另一个电机稍微有点滞后,并且由此引起的低电平持续时间也不再是前面介绍的20ms。不过这点小误差在程序实际运行中的影响可以被忽略。图1.13只给出了控制小车前进的一个控制脉冲,为驱使小车向前行进一段距离,程序中用for循环语句产生65个这样的脉冲序列,在具体应用中,可以根据实际需要改变循环次数,以达到改变小车行进距离的目的。用同样的思路,读者不难分析本案例中的左转弯、右转弯和后退等基本动作控制函数。方案二:本任务是在直流减速电机基本控制信号的基础上设计出智能寻迹避障小车的基本巡航动作的控制函数,主要完成智能

25、寻迹避障小车前进、后退、停止等基本巡航动作。 #include#define uint unsigned int#define uchar unsigned charsbit zuo1=P01;sbit zuo2=P00;sbit you1=P03;sbit you2=P02;void delay(uint x)uchar i;while(x-)for(i=0;i123;i+);void qian()zuo1=0;zuo2=1;/左边往前you1=0;you2=1;/右边往前void hou()zuo1=1;zuo2=0;/左边往后you1=1;you2=0;/右边往后void zuo()zu

26、o1=1;zuo2=0;/左边往后you1=0;you2=1;/右边往前void you()zuo1=0;zuo2=1;/左边往前you1=1;you2=0;/右边往后void ting()zuo1=1;zuo2=1;you1=1;you2=1;main()while(1)qian();delay(922*5);hou();delay(922*4);ting();delay(922*3);2、运行程序这里仍然按图1.8连接直流减速电机控制电路,编译以上程序,将产生的可执行文件烧写到智能寻迹避障小车控制板上的单片机程序存储器,开机运行,可以看到小车能按如下规律运动,即:前进5秒后退4秒停止3秒;

27、如此周而复始循环。3、程序设计思路主函数按事先设定的次序依次调用前进,延时、后退,延时、停止,延时函数;让智能寻迹避障小车完成规定动作。即主要测试电机的前进、后退、停止功能是否控制正常,读者可以将左转弯、右转弯函数加入主函数中加以调用,看功能是否实现。1.4 相关知识通过上述设计案例的学习和实践,在对单片机输出接口的应用有了直观认识之后,我们下面再来详细学习有关单片输入/输出口机(I/O口)的基本结构及原理,以及特殊功能寄存器(sfr)的Cx51定义方法。1.4.1 89C51并行IO口的内部结构及原理89C51单片机总共有4个8位的并行IO接口,分别是P0,P1,P2和P3(本案例用到P1口

28、),共32根I/O口线,实际上4个并行I/O口就是特殊功能寄存器SFR之中的4个,每个I/O口主要由4部分构成:端口锁存器、输入缓冲器、输出驱动器和端口引脚,下面分别介绍其内部结构及原理: (a)P0口的位结构 (b)P1口的位结构 (c)P2口的位结构 (d)P3口的位结构图1.14 89C51 各I/O口的位结构1、P0口:图1.14中的(a)是P0口中一位结构图。其中包含一个输出锁存器、两个三态缓冲器、一个输出驱动电路和一个输出控制电路。输出驱动电路由两个场效应管T1和T2组成,其工作状态受输出控制电路的控制。控制电路包括一个与门、一个反相器和模拟转换开关MUX。模拟开关的位置由来自CP

29、U的控制信号决定,当控制信号为低电平时,它把输出级与锁存器的Q端接通。同时,因为与门输出为低电平,输出级中的场效应管T1处于截止状态,因此是输出级是漏级开路的开漏电路。这种情况P0口可用做一般的I/O线。其输出和输入操作如下:当CPU向端口输出数据时,写脉冲加在触发器的时钟端CL上,此时与内部总线相连的D端的数据经反向后出现在Q端上,再经T2管反相,于是在P0口这一位引脚上出现的数据正好是内部总线上的数据(当P0口作输出口使用时,输出级属开漏电路,在驱动NMOS电路时应外接上拉电阻)。当输入操作时,端口中的两个三态缓冲器用于读操作。图中下面一个缓冲器用于读端口引脚数据。当执行一般的端口输入指令

30、时,读引脚脉冲把三态缓冲器打开,于是端口上的数据将经过缓冲器输送到内部总线;上面一个缓冲器读取锁存器中Q端的数据。Q端的数据实际上与引脚的数据是一致的,结构上的这种安排是为了适应所谓“读修改写”这类指令的需要。这类指令的特点是:先读端口,随之可以对读入的数据进行修改,然后再写到端口上。例如,逻辑与指令(ANL P0,A),此指令的功能是先把P0口的数据读入CPU,随后同累加器A中的数据按位进行逻辑与操作(即对读入的数据作修改)最后把结果写回P0口。对于“读修改写”这类指令,不直接读引脚上的数据而读锁存器Q端上的数据是为了避免可能错读引脚上的电平信号。例如,用一条口线去驱动一个晶体管的基极,当向

31、此口线写1时,晶体管导通并把引脚上的电平拉低。这时,若从引脚上读取数据,就把该数据错读为0(实际上应是1),而从锁存器Q端读入,则得到正确的结果。由图1.14(a)可知,当读引脚操作(输入)时,引脚上的外部信号既加在三态缓冲器2的输入端上,又加在输出级场效应管(T2)的漏级上,若此时T2是导通的(例如曾输出过数据0),则引脚上的电位被钳在0电平上。为使引脚上输入的逻辑电平能正确地读入,在输出数据时,要先向锁存器写1,使其Q端为0,使输出级T1和T2两个管子均被截止,引脚处于悬浮状态,作高阻抗输入。因此,作为一般的I/O口使用时,P0口也是一个准双向口。当P0口作为地址/数据总线分时使用时,这时

32、控制信号为高电平,转换开关MUX把反相器输出端与T2接通,同时把与门开锁。输出的地址或数据信号通过与门驱动T1管,同时通过反相器驱动T2管,完成信息传送。2、P1口:P1口是一个准双向口,作通用的I/O口使用。其结构如图1.14(b)所示,在输出驱动部分接有内部提升电阻。当用做输出线时,将1写入锁存器,使输出驱动器T管截止,输出线由内部提升电阻拉成高电平(输出1);将0写入锁存器时,T导通,输出0。P1口作为输入线时,必须先将1写入锁存器,使T截止,把该口线由内部提升电路拉成高电平。于是,当外部输入为高电平信号时,该口线为1;输入为低电平信号时,该口线为0,从而使输入端的电瓶随输入信号改变,读

33、入正确的数据信息。P1口作为是输入时,可被任何TTL电路和MOS电路所驱动。由于具有内部提升电阻,也可以直接被集电极开路或漏极开路的电路驱动而不必外加提升电路。CPU读P1口有两种情况:读引脚和读锁存器状态。读引脚时,打开三态门2,读入引脚上的输入状态(如MOV A,P1指令);读锁存器状态时,打开三态门1,与p0口的I/O功能一样,P1口可以进行“读修改写”操作。3、P2口:P2口为准双向口。每一位的结构如图1.14中(c)所示。P2口可以作为通用的I/O口使用,外接I/O设备,也可以作为扩展系统时的地址总线口(输出高8位地址),由控制信号控制转换开关来实现。当转换开关(MUX)倒向左边时,

34、P2口作通用I/O口使用,作用和P1口相同。当作为地址总线口使用时,MUX在CPU的控制下倒向右边,从而在P2口的引脚上输出地址(A15A8)。P2口的地址信息来源于PCH,DPH。对于8031单片机来说,P2口通常只作为地址总线口使用,而不作I/O口线直接与外部设备连接。4、P3口:P3口为双功能口,其每一位的结构如图1.14中(d)所示。当它作为第一功能口(通用的I/O口)使用时,工作原理与P1口和P2口类似,但第二输出功能线保持为高电平,使与非门3对锁存器输出端(Q端)是畅通的(与非门3的输出只取决于Q的状态)。当P3口作为第二功能使用时,相应位的锁存器必须为“1”状态,使与非门3的输出

35、电路由第二输出功能线的状态来确定,或使此口线允许输入第二功能信号。对P3口不管是作通用输入口或作第二功能输入口,相应位的锁存器和第二输出功能端都必须为1。在P3口的引脚信号输入通道中有两个缓冲器2和4 ,第二输入功能信号取自缓冲器4的输出端,通用输入信号取自缓冲器2的输出端。P3口的第二功能定义见表8-1表1-2 P3口的第二功能通道位第二功能注释P3.0RXD串行输入口P3.1TXD串行输出口P3.2外部中断0输入P3.3外部中断1输入P3.4T0计数器0计数输入P3.5T1计数器1计数输入P3.6外部数据RAM写选通信号P3.7外部数据RAM写选通信号1.4.2 89C51特殊功能寄存器(

36、SFR)的C51定义方法1、89C51 特殊功能寄存器(SFR)及其Cx51定义方法89C51单片机片内有21个特殊功能寄存器(SFR),分散在片内RAM区的高128字节中,地址为80H0FFH,对SFR的操作,只能用直接寻址方式。 89C51单片机中,除了程序计数器PC和4组通用存器组之外,其他所有的寄存器,均称为SFR,并位于片内特殊寄存器区,每个SFR和其他地址见表1-3。SFR中有11个寄存器具有位寻地址能力。这些寄存器的字节地址都能被8整除,即字节地址是以8或0为尾数的。89C51单片机的SFR如表1-3所列:表1-3 89C51特殊功能寄存器一览表SFRMSB 位地址/位定义 LS

37、B字节地址BF0HACCE0HPSWD7D6D5D4D3D2D1D0D0HCYACF0RS1RS0OVF1PIPBFBEBDDCBBDAA9B8B8H一一一PSPT1PX1PT0PX0P3B7B6B5B4B3B2B1B0B0HP3.7P3.6P3.5P3.4P3.3P3.2P3.1P3.0IEAFAEADACABAAA9A8A8HEA一一ESET1EX1ET0EX0P2A0HSBUF99HSCON9F9E9D9C9B9A999898HSM0SM1SM2RENTB8RB8TIRIP190HTH18DHTH08CHTL18BHTL08AHTMODGATEC/M1M0GATEC/M1M089HTCO

38、N8F8E8D8C8B8A898888HTF1TR1F0R0IE1IT1IE0IT0PCONSMOD一一一GF1GF0FDIDL87HDPH83HDPL82HSP81HP080H为了能直接访问这些特殊功能寄存器,KFIL CX51提供了一种自主的定义形式方法。这种定义方法与标准C语言不兼容,只适用于对89C51系列单片机进行C编程。 这种定义的方法是引入关键字“sfr”,语法为:sfr sfr-name=int constant;例如:sfr SCON=0X98; /串口控制寄存地址98Hsfr TMOD=0X89; /定时器/计数器方式控制寄存器地址89H注意:sfr必须跟一个特殊寄存器名,

39、”=”后面的地址必须是常数,不允许带有运算的表达式,这个常数值的范围必须在特殊功能寄存器地址范围内,位于0X800XFF之间。 对SFR的16数据的访问,在新的89C51系列产品中,SFR在功能上经常组合为16位值。当SFR的高端地址直接位于其低端地址之后时,对SFR16值可以进行直接访问。例如8052的定时器2就是这种情况,为了有效地访问这类SFR。可使用关键字”sfr16”。16位SFR定义的语法与8位SFR相同,16位SFR的低端地址必须作为”fr16”的定义地址。 例如:sfr16 T2=oxCC; /定义2:T2低8位地址=0CCH, T2高8位地址=OCDH定义中名字后面不是赋值语

40、句,而是一个SFR地址,高字节必须位于低字之后。这种定义适用于所有新的SFR,但不能用于定时器/计数器0和1。在典型的89C51应用问题中,经常需要单独访问SFR中的位,CX51的扩充功能之成为可能。特殊位(sbit)r 的定义像SFR一样不与标准C兼容,使用关键字”sbit”可以访问位寻址对象。与SFR定义一样,用关键字”sbit”定义某些特殊位,并接受任何符号名,”=”号后将绝对地址赋给变量名。这种地址分配有3种方法。方法一:sfr-nameint-constant当特殊寄存器的地址这字节(8位)时,可使用这种方法。sfr-name必须是已定义的SFR的名字。后的语句定义了基地址上的特殊位

41、置。该位置必须是07的数。例如:sfr PSW=0Xd0; /定义PSW寄存器地址为0XD0sbit OV=PSW2 /定义OV为位为PSW2,地址为0XD2sbit TCY=PSW7 /定义CY位为PSW.7,地址为0XD7方法二:int-constantint-constant 这种方法以一个整常数作为基地址,该值必须在0X80OXFF之间,并能被8整除,确定位置的方法同上。例如:sbit OV=0XDO2 /OV位于地址为0XD2 sbit CY=0XDO7 /CY位地址为0XD7方法三:int-constant这种方法将位的绝对地址赋给变量,地址必须位于0X800XFF之间,例如:sbit OV=OXD2;sSbit CY=OXD7;特殊功能位代表了一个独立的定义类,不能与其他位定义和位域互换。2、89C51并行接口及其CX51定义方法前面提到89C51单片机芯片内带有4个8位的并行口,共32根I/O线,对I/O口的操作实际上就是对P0,P1,P2和P3四个寄存器进行操作,而P0,P1,P2和P3四个寄存器也属于特殊功能寄存器(SFR),因此89C51并行接口的CX51定义方法与上面介绍的特殊功能寄存器(SFR)定义方法一样,下面结合本案例中用到的P

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论