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

下载本文档

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

文档简介

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

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

3、来到之后,转 子立即转动;当信号消失,转子能即时自行停转。由于它的“伺服”性能,因此而得名。 标准的伺服电机有三条控制线,分别为:电源、地线及控制线。电源线与地线用于提 供内部的电机及控制线路所需的能源,控制信号要求是一个周期性的正向脉冲信号,这个 周期性脉冲信号的高电平时间通常在1ms-2ms之间,而低电平时间应在 5ms到20ms之间。 本书向读者介绍的伺服电机是 PARALLAX公司生产的连续旋转伺服电机,它的控制信号 时序是:低电平时间固定为 20ms,高电平为1.3ms 1.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所示。图中用开关模拟

5、电机信号通断,在实际的控制中是 采用晶体三极管来完成此功能,可参见图1.4所示的电机控制示意图。此处只是为简述控制 原理,所以用开关模拟电机工作过程。 VCC (5 图1.3 H 桥驱动直流电机电路 从图中可以看出,其形状类似于字母“H,而作为负载的直流电机是像“桥”一样架在 上面的,所以称之为“ H桥驱动”。4个开关所在位置就称为“桥臂”。 从电路中不难看出,假设开关 A、D接通,电机为正向转动,则开关 B、C接通时,直流 电机将反向转动。从而实现了电机的正反向驱动。借助这4个开关还可以产生电机的另外2 个工作状态: (1)刹车 一一将B、D开关(或 A C)接通,则电机惯性转动产生的电势将

6、被短 路,形成阻碍运动的反电势,形成“刹车”作用。 (2)惰行 一一4个开关全部断开,则电机惯性所产生的电势将无法形成电路,从而 也就不会产生阻碍运动的反电势,电机将惯性转动较长时间。 POJ 1A 2 p k3 1Y PLO 1 P0.1 2A 3卜 AT89C52 图1.4 电机控制示意图电路 1.2.4 延时函数 在实际的单片机应用系统开发过程中,由于程序功能的需要,经常编写各种延时程 序,延时时间从数微秒到数秒不等。 实现延时通常有两种方法:一种是硬件延时,要用到单片机的定时器/计数器,这种方 法可以提高 CPU的工作效率,同时也能做到精确延时;另一种是软件延时,这种方法主要 采用循环

7、体进行,本项目开发过程中采用的是软件延时的方法,在后续各项目模块中经常 作为延时功能调用的几个延时函数原形如下: void delay_n 卩s(uint/i)延时微秒级函数 i=i/10 ; while(-i); void delay_nms(uint n)/ 延时毫秒级函数 n=n+1 ; while(-n) delay_n 卩 s(90;) void delayms(uint x)/ 延时函数 12 兆晶振 1000 为一秒; 11.0592兆晶振922为一秒(会有一定误差) uchar i; while(x-) for(i=0;i123;i+); 上述函数设计的基本原理是通过执行循环体

8、来消耗时间从而达到延时的目的,其中 delay_nms()是毫秒级的延时,而delay_n氣)是微秒级的延时。例如:如果你想延时 1毫 秒,可以使用语句 delay_nms(1);延时100微秒则可使用语句 delay_n宙(100);来完成。 注意:上述延时函数是在外部晶振为12MHZ的情况下设计的,如果外部晶振频率不是 12MHz,调用这两个函数所产生的真正延时就会发生变化。对于许多C51开发者特别是初 学者编制非常精确的延时函数有一定难度,关于延时函数的编程经验和技巧此处不作详细 介绍,读者目前只要会将这两个函数作为功能模块调用就行了 1.3案例设计 1.3.1系统设计方案 本项目向读者

9、详细介绍了两种实现方案,其中学员实操采用方案二进行。同时该项目 设计为本书后续设计案例的基础控制模块,后续的寻迹、避障等功能模块实在该项目上扩展 实现的。 方案一:该设计方案采用 CPU对执行机构输出控制, 不涉及到对外部数据信息的采集, 因此,系统采用“CPU+执行机构”的总体设计方案,其中CPU采用目前性价比较高的 STC89C52 单片机,并以此为核心构建最小控制系统,执行机构的动力装置采用PARALLAX司生产的 连续旋转伺服电机,其优点是编程控制方便且不需额外增加驱动电路,系统总体框图如图 1.5所示。 图1.5 方案一系统框图 方案二:采用“单片机最小系统 +电机驱动芯片+直流电机

10、”的设计方案,设计方案中 的电机采用直流减速电机,该电机具有控制原理简单、性价比高,易于控制等特点,被广泛 应用于各种智能玩具小车设计之中;电机驱动采用集成芯片L293完成,该芯片运用 H电桥 驱动直流电机的控制原理实现对直流电机旋转方向和速度的控制。系统总体框图如图1.6所 示。 图1.6方案二统框图 1.3.2硬件电路设计 方案一: 该设计方案的硬件电路如图1.7所示:它是在单片机最小系统的基础上直接 连接伺服电机构成的,其中左电机的控制信号由P1_0提供,右电机的控制信号由P1_1提 供,直接对该两个端口编程,便可实现对伺服电机旋转方向和速度控制。 5V 左轮驱动电机 右轮驱动电机 GN

11、D 4 12MHZ I C20PFT 18 19 20 P1.0 P1.1 VCC AT89C51 RST XTA1 XTA2 GND GND GND 图1.7方案一系统原理图 万案二: 该设计方案的硬件电路如图1.8所示:电机控制信号由单片机的P0.0P0.3 输出送到电机驱动芯片的 2脚与7脚以及10脚与15脚,再从芯片的3脚与6脚(左电机控 制)以及11脚与14脚(右电机控制)输出驱动电机工作。 133系统软件设计 任务一:产生智能寻迹避障小车电机的基本控制信号 方案一:本任务是对单片机编程,在指定的单片机引脚P1_0输出伺服电机的各种控制 信号。 1、源程序 sfr P1 = 0 x9

12、0;P1 口 C51 定义; sbit P1_0 = P1A0;/特殊功能位定义 #defi ne uint un sig ned int void delay_n卩 s(uint/)延时 n 函数 i=i/10 ; while(-i); void delay_nms(uint n) / 延时 nms 函数 n=n+1 ; while(-n) delay_n 卩 s(90;) int main(void)/ 主函数 while(1) P1_0输出高电平 / 延时 1。5ms P1_0输出低电平 /延时20ms P1_0=1; delay_n 卩 s(150O) P1_0=0; delay_nm

13、s(20); 2、程序运行及调试 在智能寻迹避障小车控制板上按图1.7连接伺服电机控制电路,编译以上程序,将产 生的可执行文件烧写到控制板上的单片机程序存储器,具体操作步骤如下: 步骤1:启动Keil uVision4 IDE,完成对上面程序的编辑,编译和调试,产生可执行的HEX 文件。 步骤2:将ISP下载线一端连接到 PC机的并行接口上,另一端(小端)连接到智能寻迹避 障小车的程序下载口上。 打开ISP下载软件将步骤1获得的HEX文件下载到智能寻迹避障小车的单片机内部程 序存储器,开启电源,运行程序,用示波器测量P1_0引脚,可测出使伺服电机转速为零的 控制信号,其波形如图 1.9所示。

14、Vdd(5v) Vss(0v) 20ms 图1.9 使伺服电机转速为零的控制信号时序图 将程序中的 delay_n卩s(1500)改成delay_n卩s(1300),即延时1.3ms,再重复以上步 骤,可用示波器测得使伺服电机使电机顺时针全速旋转的控制信号,其波形如图1.10所 示。 4 * 1.3ms*| 严 1.3ms Vdd(5v) Vss(0v) 20ms 图1.10 使电机顺时针全速旋转的控制脉冲序列 将程序中的 delay_n卩s(1500)改成delay_n卩s(1700),即延时1.7ms,再重复以上步 骤,可用示波器测得使伺服电机逆时针全速旋转的控制信号,其波形如图1.11所

15、示。 巧 +1.7ms巧 + 1.7ms Vdd(5v) pq Vss(Ov) 20ms 图1.11使伺服电机逆时针全速旋转的脉冲序列 在1.3ms 1.5ms 1.7ms时间范围内改变延时函数的延时量,可获得控制伺服电机不 同旋转方向和转速的各种波形。 步骤3:对伺服电机进行零点标定 所谓伺服电机零点标定是指当发送一个使伺服电机转速为零的控制信号给伺服电机时, 让电机保持静止不动的过程,伺服电机在出厂时没有预先标定,因此需要调整。具体做法是: 将步骤2产生的使电机转速为零的控制程序加载到单片机程序存储器,开机运行,若电 机有旋转,说明未标定,用螺丝刀调整伺服电机上的电位器,同时观察电机的旋转

16、情况, 直到电机停止转动,表明已经标定。 电机标定后,用步骤 2产生的各种控制信号测试电机的旋转方向和速度,观察电机的运 行情况,可以实现对电机的不同旋转方向和速度的控制。 3、程序设计思路 基本思路是:根据伺服电机的控制信号的时序要求,调用延时函数控制单片机引脚高低 电平的持续时间,并用循环执行的方式使单片机引脚不断的输出伺服电机控制信号。 产生伺服电机基本控制信号的程序流程图1.12所示: 图1.12主函数流程图 即利用延时函数将指定的引脚的低电平持续时间固定为20ms,而高电平持续时间根 据需要在“1.3ms 1.5ms 1.7ms”时间范围内改变,然后循环执行,就可获得能够控制伺 服电

17、机不同旋转方向和转速的各种控制脉冲信号。 方案二:对单片机P0.0、P0.1(左电机)和P0.2、P0.3(右电机)编程,程序设计以左电 机为例。 1、源程序 #include #define uint unsigned int #define uchar unsigned char sbit zuo1=P0A1;/左电机端口定义 sbit zuo2=P0A0; sbit you1=P0A3; /右电机端口定义 sbit you2=P0A2; void delay(uint x) uchar i; while(x-) for(i=0;i123;i+); void qian() / 左边往前 /

18、 右边往前 zuo1=0; zuo2=1; you1=0; you2=1; main() while(1) qian(); delay(922*5); 2、程序运行及调试 在智能寻迹避障小车控制板上按图 1.8 连接伺服电机控制电路,编译以上程序,将产 生的可执行文件烧写到控制板上的单片机程序存储器,具体操作步骤如下: 步骤1:启动Keil uVision4 IDE,完成对上面程序的编辑,编译和调试,产生可执行的HEX 文件。 步骤2:将STC下载线一端连接到 PC机的并行接口上,另一端(小端)连接到智能寻迹避 障小车的程序下载口上。 打开STC下载软件将步骤1获得的HEX文件下载到智能寻迹避

19、障小车的单片机内部程 序存储器,开启电源,运行程序,此时左右电机顺时针旋转,小车前进。 将上述程序中的前进函数中的左右端口控制电平按表 1-1 所示的修改, 编辑、编译后便 可以得到电机逆转(后退)、停转(原地不动)的控制函数。 任务二:编制智能寻迹避障小车基本巡航动作的控制函数 方案一: 本任务是在伺服电机基本控制信号的基础上设计出智能寻迹避障小车的基本巡航动作 的控制函数,并按一定的算法调用这些控制函数,使智能寻迹避障小车完成比较复杂的运动。 1源程序 程序名:Co ntrol.c 功 能:控制轮式教育机器人实现前后左右运动的基本动作 =*/ #i nclude #defi ne uint

20、 un sig ned int #defi ne uchar un sig ned char void delay_n 卩 s(uint i); / 函数声明 void delay_ nms(uint n); void Forward(void); void Left_Tur n( void); void Right_Tur n( void); void Backward(void); uchar Navigatio n10=F,L,F,F,R,B,L,B,B,Q; mai n( void)/ 主函数 int addr=0; while(Navigatio naddr!=Q) switch(N

21、avigati on addr) case F:Forward();break; case L:Left_Tur n( );break; case R:Right_Turn();break; case B:Backward();break; addr+; void delay_n卩 s(uint /)延时 n 卩 s i=i/10; while(-i); void delay_nms(uint n) / 延时 n ms n=n+1; while(-n) delay_n 卩 s(900); void Forward(void)/ 前进子函数 uchar i; for(i=1;i=65;i+) P

22、1_1=1; delay_n 卩 s(1700); P1_ 仁0; P1_0=1; delay_n 卩 s(1300); P1_0=0; delay_ nm s(20); void Left_Turn(void)/ 左转弯子函数 uchar i; for(i=1;i=26;i+) P1_1=1; delay_n 卩 s(1300); P1_ 仁0; P1_0=1; delay_n 卩 s(1300); P1_0=0; delay_ nm s(20); void Right_Turn(void)/ 右转弯子函数 uchar i; for(i=1;i=26;i+) P1_1=1; delay_n

23、卩 s(1700); P1_ 仁0; P1_0=1; delay_n 卩 s(1700); P1_0=0; delay_ nm s(20); void Backward(void)/ 后退子函数 uchar i; for(i=1;i=65;i+) P1_1=1; delay_n 卩 s(1300); P1_ 仁0; P1_0=1; delay_n 卩 s(1700); P1_0=0; delay_ nm s(20); 2、运行程序 这里仍然按图1.7连接伺服电机控制电路,编译以上程序,将产生的可执行文件烧写到 智能寻迹避障小车控制板上的单片机程序存储器,开机运行,可以看到小车能按如下规律 运动

24、,即:前进t左转弯t前进t前进t右转弯t后退t左转弯t后退t后退t停止,仔 细观察可以发现,它的运动轨迹接近一个矩形。 3、程序设计思路 主函数按数组设定的次序依次调用前进,左转弯、右转弯和后退等四个基本控制函 数,这四个函数是在任务一介绍过的伺服电机基本控制信号的基础上设计的,下面我们重 点以“前进子函数”为例介绍其基本设计思路,为了便于分析,这里再把程序中的“前进 子函数”单独列出如下: void Forward(void)/ 前进子函数 uchar i; for(i=1;i=65;i+) P1_1=1; delay_n 卩 s(1700); P1_ 仁0; P1_0=1; delay_n

25、 卩 s(1300); P1_0=0; delay_ nm s(20); 仔细分析以上程序,根据P1_0和P1_1引脚的高低电平持续时间,可以画出让轮式教育 机器人前进的左右电机控制脉冲时序图,如下: Vdd(5v) Vss(0v) + 1.3ms4 左电机控制脉冲 +1.3ms H21.7ms ! Vdd(5v) v 1.7ms Vss(Ov) 21.3ms 1.7ms 图1.13 前进控制信号时序图 对照任务一中介绍过的伺服电机正转、反转控制信号,我们发现,以上控制小车前进 的脉冲信号有两个问题需要进一步解释。 第一:因为伺服电机安装在车架上的朝向刚好相反,其中一个电机如果原来是正转, 那

26、么掉转朝向之后就变成了反转,所以要使两个电机带动两个轮子朝一致的方向转动,就 必须让两个伺服电机的旋转方向为一正一反。 第二:因为受到单片机的编程限制,两个电机的控制脉冲并没有在时间上保持绝对的 同步(如图1.13所示),这样看起来似乎一个电机要先动作,而另一个电机稍微有点滞后, 并且由此引起的低电平持续时间也不再是前面介绍的20ms。不过这点小误差在程序实际运 行中的影响可以被忽略。 图1.13只给出了控制小车前进的一个控制脉冲,为驱使小车向前行进一段距离,程序 中用for循环语句产生65个这样的脉冲序列,在具体应用中,可以根据实际需要改变循环 次数,以达到改变小车行进距离的目的。用同样的思

27、路,读者不难分析本案例中的左转 弯、右转弯和后退等基本动作控制函数。 万案二: 本任务是在直流减速电机基本控制信号的基础上设计出智能寻迹避障小车的 基本巡航动作的控制函数,主要完成智能寻迹避障小车前进、后退、停止等基本巡航动作。 #i nclude #defi ne uint un sig ned int #defi ne uchar un sig ned char sbit zuo1=P0A1; sbit zuo2=P0A0; sbit you1=P0A3; sbit you2=P0A2; void delay( uint x) uchar i; while(x-) for(i=0;i123

28、;i+); void qia n() zuo1=0; zuo2=1; you1=0; you2=1; void hou() zuo1=1; zuo2=0; you1=1; you2=0; void zuo() zuo1=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(); / 左边往前 /

29、右边往前 / 左边往后 / 右边往后 / 左边往后 / 右边往前 / 左边往前 / 右边往后 delay(922*3); 2、运行程序 这里仍然按图1.8连接直流减速电机控制电路,编译以上程序,将产生的可执行文件烧 写到智能寻迹避障小车控制板上的单片机程序存储器,开机运行,可以看到小车能按如下 规律运动,即:前进 5秒t后退4秒t停止3秒;如此周而复始循环。 3、程序设计思路 主函数按事先设定的次序依次调用前进,延时、后退,延时、停止,延时函数;让智能 寻迹避障小车完成规定动作。即主要测试电机的前进、后退、停止功能是否控制正常, 读者 可以将左转弯、右转弯函数加入主函数中加以调用,看功能是否实

30、现。 1.4相关知识 通过上述设计案例的学习和实践,在对单片机输出接口的应用有了直观认识之后,我 们下面再来详细学习有关单片输入/输出口机(I/O 口)的基本结构及原理,以及特殊功能 寄存器(sfr )的Cx51定义方法。 1.4.1 89C51并行IO 口的内部结构及原理 89C51单片机总共有4个8位的并行IO接口,分别是P0, P1, P2和P3(本案例用到P1 口), 共32根I/O 口线,实际上4个并行I/O 口就是特殊功能寄存器 SFR之中的4个,每个I/O 口 主要由4部分构成:端口锁存器、输入缓冲器、输出驱动器和端口引脚,下面分别介绍其内 部结构及原理: 地址/数据控制 VCC

31、 円口艘再鶴伽神册蜡枸 (a)P0 口的位结构 (b)P1 口的位结构 读锁存器 读锁存器 写入 (c)P2 口的位结构 内部总线 写入 读引脚 (d)P3 D Q 锁存器 CP Q 第二输入功能 VCC T1 口的位结构 P1.X 图1.14 89C51 各I/O 口的位结构 1、P0 口:图1.14中的(a)是P0 口中一位结构图。其中包含一个输出锁存器、两个 三态缓冲器、一个输出驱动电路和一个输出控制电路。输出驱动电路由两个场效应管T1和 T2组成,其工作状态受输出控制电路的控制。控制电路包括一个与门、一个反相器和模拟 转换开关MUX模拟开关的位置由来自 CPU的控制信号决定,当控制信号

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

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

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

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

36、该口线由内部提升电路拉成高 电平。于是,当外部输入为高电平信号时,该口线为 1;输入为低电平信号时,该口线为 0, 从而使输入端的电瓶随输入信号改变,读入正确的数据信息。P1 口作为是输入时,可被任 何TTL电路和MOS电路所驱动。由于具有内部提升电阻, 也可以直接被集电极开路或漏极开 路的电路驱动而不必外加提升电路。 CPU读P1 口有两种情况:读引脚和读锁存器状态。读引脚时,打开三态门2,读入引 脚上的输入状态(如 MOXA,P1指令);读锁存器状态时,打开三态门 1,与p0 口的I/O功 能一样, P1 口可以进行“读修改写”操作。 3、P2 口: P2 口为准双向口。每一位的结构如图

37、1.14中(c)所示。P2 口可以作为通 用的I/O 口使用,外接I/O设备,也可以作为扩展系统时的地址总线口(输出高8位地址), 由控制信号控制转换开关来实现。当转换开关(MUX)倒向左边时,P2 口作通用I/O 口使 用,作用和P1 口相同。当作为地址总线口使用时, MUX在CPU的控制下倒向右边, 从而在 P2 口的引脚上输出地址(A15A8)。P2 口的地址信息来源于 PCH DPH。对于8031单片机 来说,P2 口通常只作为地址总线口使用,而不作 I/O 口线直接与外部设备连接。 4、P3 口: P3 口为双功能口,其每一位的结构如图1.14中(d)所示。当它作为第一 功能口(通用

38、的I/O 口)使用时,工作原理与 P1 口和P2 口类似,但第二输出功能线保持为 高电平,使与非门3对锁存器输出端(Q端)是畅通的(与非门3的输出只取决于 Q的状态)。 当P3 口作为第二功能使用时,相应位的锁存器必须为“1”状态,使与非门3的输出电路由 第二输出功能线的状态来确定,或使此口线允许输入第二功能信号。对P3 口不管是作通用 输入口或作第二功能输入口,相应位的锁存器和第二输出功能端都必须为1。在P3 口的引 脚信号输入通道中有两个缓冲器2和4 ,第二输入功能信号取自缓冲器4的输出端,通用 输入信号取自缓冲器 2的输出端。P3 口的第二功能定义见表 8-1 表1-2 P3 口的第二功

39、能 通道位 第二功能 注释 P3.0 RXD 串行输入口 P3.1 TXD 串行输岀口 P3.2 INT0 外部中断0输入 P3.3 INT1 外部中断1输入 P3.4 T0 计数器0计数输入 P3.5 T1 计数器1计数输入 P3.6 WR 外部数据RAM写选通信号 P3.7 RD 外部数据RAM写选通信号 1.4.2 89C51特殊功能寄存器(SFR)的C51定义方法 1、89C51特殊功能寄存器(SFR)及其Cx51定义方法 89C51单片机片内有21个特殊功能寄存器(SFR)分散在片内RAM区的高128字节中, 地址为80H0FFH,对SFR的操作,只能用直接寻址方式。89C51单片机

40、中,除了程序计数 器PC和4组通用存器组之外,其他所有的寄存器,均称为SFR并位于片内特殊寄存器区, 每个SFR和其他地址见表1-3。SFR中有11个寄存器具有位寻地址能力。这些寄存器的字节 地址都能被8整除,即字节地址是以 8或0为尾数的。89C51单片机的SFR如表1-3所列: 表1-389C51特殊功能寄存器一览表 SFR MSB位地址/位定义 LSB 字节 地址 B F0H ACC E0H PSW D7 D6 D5 D4 D3 D2 D1 D0 D0H CY AC F0 RS1 RS0 OV F1 P IP BF BE BD DC BB DA A9 B8 B8H -一- -一- -一-

41、 PS PT1 PX1 PT0 PX0 P3 B7 B6 B5 B4 B3 B2 B1 B0 B0H P3.7 P3.6 P3.5 P3.4 P3.3 P3.2 P3.1 P3.0 IE AF AE AD AC AB AA A9 A8 A8H EA -一- -一- ES ET1 EX1 ET0 EX0 P2 A0H SBUF 99H SCON 9F 9E 9D 9C 9B 9A 99 98 98H SM0 SM1 SM2 REN TB8 RB8 TI RI P1 90H TH1 8DH TH0 8CH TL1 8BH TL0 8AH TMOD GATE C/T M1 M0 GATE C/T M

42、1 M0 89H TCON 8F 8E 8D 8C 8B 8A 89 88 88H TF1 TR1 F0 R0 IE1 IT1 IE0 IT0 PCON SMOD -一- -一- -一- GF1 GF0 FD IDL 87H DPH 83H DPL 82H SP 81H P0 80H 为了能直接访问这些特殊功能寄存器,KFIL CX51提供了一种自主的定义形式方法。这 种定义方法与标准 C语言不兼容,只适用于对 89C51系列单片机进行 C编程。 这种定义的方法是引入关键字sfr”,语法为:sfr sfr-name=int constant ; 例如: sfr SCON=OX98/串口控制寄存

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

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

45、-n ameAi nt-c on sta nt 当特殊寄存器的地址这字节(8位)时,可使用这种方法。sfr-name必须是已定义的 SFR的名 字。*后的语句定义了基地址上的特殊位置。该位置必须是07的数。例如: sfr PSW=0Xd0; /定义PSW寄存器地址为 0XD0 sbit OV=PSWA2 /定义OV为位为PSW2, 地址为 0XD2 sbit TCY=PSWA7 /定义CY位为PSW.7地址为0XD7 方法二: int-constantAint-constant 这种方法以一个整常数作为基地址,该值必须在0X80OXFF之间,并能被8整除,确定 位置的方法同上。 例如:sbit

46、 OV=0XDOA20V位于地址为0XD2 sbit CY=OXDOA7CY 位地址为 0XD7 方法三: int-constant 这种方法将位的绝对地址赋给变量,地址必须位于0X800XF F之间,例如: sbit OV=OXD2; sSbit CY=OXD7; 特殊功能位代表了一个独立的定义类,不能与其他位定义和位域互换。 2、89C51并行接口及其CX51定义方法 前面提到89C51单片机芯片内带有 4个8位的并行口,共 32根I/O线,对I/O 口的操作实 际上就是对PO, P1, P2和P3四个寄存器进行操作,而PO, P1, P2和P3四个寄存器也属 于特殊功能寄存器(SFR,因此89C51并

温馨提示

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

评论

0/150

提交评论