C51单片机应用C语言程序设计智能机器人

上传人:微*** 文档编号:168529957 上传时间:2022-11-10 格式:DOCX 页数:163 大小:1.73MB
返回 下载 相关 举报
C51单片机应用C语言程序设计智能机器人_第1页
第1页 / 共163页
C51单片机应用C语言程序设计智能机器人_第2页
第2页 / 共163页
C51单片机应用C语言程序设计智能机器人_第3页
第3页 / 共163页
点击查看更多>>
资源描述
工程对象教学法系列教材C51单片机应用与C语言程序设计基于机器人工程对象的项目实践秦志强等编著电子工业出版社内容提要本教材以两轮智能移动机器人工程项目为主线,通过循序渐进的构建智能机 器人的智能控制器和传感器电路,将单片机外围接口特性、内部结构原理、应用 设计方法和C语言程序设计等知识通过先项目实践、后总结归纳的方式传授给 学生,彻底打破了传统的教学方法和教学体系结构,解决了单片机原理与应用, 以及C语言程序设计等核心专业基础课程抽象与难学的老大难问题。本书可作为中等职业教育和高等职业教育的单片机技术与应用以及嵌入式C语言程序设计两门课程的学习教材和教学参考书,也可以作为本科院校工程训练、电子制作的实践教材和相应专业课程的实验配套教材,同时还可以供广大希望从事嵌入式系统开发和C语言程序设计的学生或者个人自学使用。刖 S本书可作为高职高专院校工程类专业二年级及以上学生学习单片机原理与应用的主导教材,也 可以作为大学二年级及以上工程类专业学生学习单片机原理与应用的辅助教材,还可以供其他机器 人爱好者使用。使用者只需要有初级的编程基础和简单的计算机操作和基础的英语,不需要专业的 C语言基础。本书的任务是要让每个学习单片机原理与应用的学生或者个人都能够以教育机器人作为 程対象,让他们在开发自己的教育机器人过程中学习和掌握单片机的基本原理与应用系统的开发技 能,包括: C51系列单片机的C语言编程环境和使用方法; 单片机的输入接口、使用方法和C程序设计: 单片机的输出接口、使用方法和C程序设计; 単片机的接口电气特性和外围电路; 单片机的串口通讯、应用与C程序设计; 单片机与LCD的连接与C编程; 基础传感器原理和用C51编程实现机器人基本智能的实现方法等。本书在编写过程当中非常注意的一点,就是寓教于乐,兴趣为先。将传统的学习单片机原理与 应用(即先理论讲解,然后实验验证)的模式,改变为先实验和实践如何应用,然后再归纳单片机 原理(即先实践,后归纳)的模式,并以机器人作为贯穿实践过程的典型工程对象,使整个教学和 学习过程充满挑战和乐趣,大大提高学习效率。同时在学习和实践的过程中,还可以培养学生的系 统世界观和方法论。熟练掌握本教材的学生或者个人,可以继续高级机器人制作的课程。通过本课程的学习和实践,可以引领学生或者个人进入神奇的信息技术世界和机器人世界。本书的完成,编者首先要感谢东南大学的张文锦教授,是他的建议促成了本书的成文;其次要 感谢深圳市德普施科技有限公司的邓莹和阮科,邓莹对本书的最后完成付出了巨大的努力,阮科 一-验证了本书的所有项目;还要感谢德普施科技的前员刘庆秋,是他最早帮助起草了本书的初稿。目 录第一章 C5!单片机编程环境与机器人智能1单片机与C51系列单片机1机器人与 C51 单片机3任务获得软件4任务二安装软件5任务三硬件连接5任务四你的第一个程序6printf 函数12C语言数据类型14常量14变量14运算符15表达式15任务五做完实验关断电源16工程素质和技能归纳16科学精神的培养16第二章单片机输出接口与伺服电机控制17C51单片机的输入/输出接口17任务单灯闪烁控制18while 语句20任务二机器人伺服电机控制信号21任务三计数并控制循环次数23for语句23任务四 用你的计算机来控制机器人的运动27scant 函数28工程素质和技能归纳29科学精神的培养29第三章 C语言函数与机器人巡航控制31任务基本巡航动作31任务二 匀加速/减速运动36任务三用函数调用简化运动程序38任务四髙级主题用数组建立复杂运动43字符型数据43数组45switch 格句48工程素质和技能归纳50科学精神的培养50第四章 单片机输入接口与机器人触觉导航51触觉导航与单片机输入接口51任务一 安装并测试机器人胡须51位操作符53if语句54?操作符54任务二 通过胡须导航57关系与逻辑运算符58任务三机器人进入死区后的人工智能决策62工程素质和技能归纳66科学精神的培养66第五章C51输入/输出接口与红外线导航67使用红外线发射和接收器件探测道路67任务 搭建并测试IR发射和探测器对68任务二探测和避开障碍物72任务三 高性能的IR导航76do.while 语句78任务四俯视的探测器79工程素质和技能归纳84科学精神的培养84第六章机器人的距离检测85用同样的IR LED/探测电路检测距离85任务一定时/计数器的运用85任务测试扫描频率89任务三 尾随小车92任务四 跟际条纹带98工程素质和技能归纳101科学精神的培养101第七章 机器人中UART的应用102串口控制寄存器SCON103RS232电平与TTL电平转换103任务编写串口通信程序104串口工作流程108工程素质和技能归纳109科学精神的培养109第八章LCD应用编程及与机器人的集成技术110任务 认识LCD显示器110任务二 编写LCD模块驱动程序113指针117任务三 用LCD显示机器人运动状态118C语言的编译预处理118工程素质和技能归纳125科学布神的培养125第九章 多传感器智能机器人126多传感器智能机器人的设计目标126任务 多传感器信息与C语言结构体的使用和编程126结构体126任务二智能机器人的行为控制策略和编程133工程素质和技能归纳138科学精神的培养138附录AC语言概要归纳139附录B微控制器原理归纳149附录C无焊锡面包板153附录DLCD模块电路156附录E本讲义所使用机器人零配件清单157第一章C51单片机编程环境与机器人智能单片机与C51系列单片机什么是单片机?台能够工作的计算机要有这样儿个部份:CPU (Central Processing Unit,中央处理单 元:进行运算、控制)、RAM (Random Access Memory,随机存储器:数据存储)、ROM (Read Only Memory,只读存储器:程序存储)、输入/输出设备(串行口、并行等)。在个人计算 机上这些部份被分成若干块芯片或者插卡,安装一个称之为主板的印刷线路板上。而在单片 机中,这些部份全部被做到块集成电路芯片中,所以就称为単片机。学习单片机有必要吗?与我们经常使用的个人计算机、笔记本电脑相比,单片机的功能是很小的,那学它干啥 吗?实际生活中并不是任何需要计算机的场合都要求计算机有很高的性能,比如空调温度的 控制,冰箱温度的控制等都不需要很复杂高级的计算机。应用的关键是看是否够用,是否有 很好的性能价格比。单片机凭借体积小、质量轻、价格便宜等优势,已经渗透到我们生活的各个领域:导弹 的导航装置、飞机上各种仪表的控制、工业自动化过程的实时控制和数据处理、广泛使用的 各种智能IC卡、民用豪华轿车的安全保障系统、录象机、摄象机、全自动洗衣机、程控玩 具、电子宠物等等。更不用说自动控制领域的机器人、智能仪表、医疗器械了。因此,単片机的学习、开发与应用将造就一批计算机应用、嵌入式系统设计与智能化控 制的科学家、工程师,同时,学习使用单片机也是了解通用计算机原理与结构的最佳选择。C51系列单片机一提到单片机,你就会经常听到这样些名词:MCS51、8051、C51等等,它们之间究 竟是什么关系呢?MCS51是指由美国!NTEL公司生产的系列单片机的总称。这系列单片机包括了好 些品种,如8031, 8051, 8751等,其中8051是最典型的产品,该系列单片机都是在8051 的基础上进行功能的增、减、改变而来的,所以人们习惯于用8051来称呼MCS51系列单 片机。INTEL公司将MCS51的核心技术授权给了很多其它公司,所以有很多公司在做以8051 为核心的单片机,当然,功能或多或少有些改变,以满足不同的需求。其中较典型的款单 片机AT89c51 (简称C51)由于由美国ATMEL公司以8051为内核开发生产。本教材使用 的AT89S52单片机是在此基础上改进而来。AT89s52是种高性能、低功耗的8位单片机,内含8k字节ISP(In-system Programmable, 系统在线编程)可反复擦写1000次的FLASH只读程序存储器,器件采用ATMEL公司的高 密度、非易失性存储技术制造,兼容标准MCS51指令系统及其引脚结构。在实际工程应用 中,功能强大的AT89s52已成为许多高性价比嵌入式控制应用系统的解决方案。什么是单片机的位数?现在市场上闹得沸沸扬扬的微软新推出的系统VISTA是64位操作系统:大家常用的系 in WINDOWS XP. WINDOWS 2003第足32位操作系统;这里你将用到的单片机AT89s52 是8位的,而有些厂家生产的単片机则是16位的。那么,这些位数:64、32、16、8代表 什么意义呢?简単地说,这些位数指的是CPU能一次处理的数据的最大长度。当然,这里的位是指二进制的位,而非十进制的位。AT89S52是8位的单片机,意味着它如果要处理16位数据 的话就应该分两次处理。嵌入式系统嵌入式系统是指嵌入到工程对象中能够完成某些相对简单或者某些特定功能的计算机 系统。与从8位机迅速向16位、32位、64位过渡的通用计算机系统相比,嵌入式系统有其 功能的特殊要求和成本的特殊考虑,从而决定了嵌入式系统在高、中、低端系统三个层次共 存的局面。在低端嵌入式系统中,8位单片机从2。世纪0年代初期诞生至今还一直在业 生产和日常生活中广泛使用。嵌入式系统嵌入到对象系统中,并在对象环境下运行。与对象领域相关的操作主要是对 外界物理参数进行采集、处理,对对象实现控制,并与操作者进行人机交互等。鉴于嵌入式低端应用对象的有限响应要求、嵌入式系统低端应用的巨大市场以及8位机 具有的计算能力,可以预测在未来相当长的时间内,8位机仍然是嵌入式应用中的主流机型。早期的单片机应用程序开发通常需要仿真机、编程机等配套工具,要配置这些工具需要 笔不小的投资。木教材采用的AT89s52,不需要仿真机和编程机,只需运用ISP电缆就可 以对单片机的FLASH反复擦写!000次以上,因此使用起来特别方便简单,尤其适合初学 者使用,而且配置十分灵活,可扩展性特别强。In-system Programmable (ISP,系统在线编程)In-system programmable是指用户可把已编译好的程序代码通过一条下载线直接写 入到器件的编程(烧录)方法,已经编程的器件也可以用ISP方式擦除或再编程。1SP所用 的“下载线”并非不需要成本,但相对于传统的“编程器”成本已经大大下降了。通常FIASH 型芯片会具备ISP下载能力。本教材将引导你如何运用AT89S52作为机器人的大脑制作一款教育机器人,并采用C 语言对AT89S52进行编程,使机器人实现述四个基本智能任务:1 .安装传感器以探测周边环境;2 .基于传感器信息做出决策;3 .控制机器人运动(通过操作带动轮子旋转的电机);4 .与用户交换信息;通过这些任务的完成,使你在无限的乐趣之中,不知不觉地掌握C51单片机原理与应 用开发技术,以及C语言程序设计技术,轻松走上嵌入式系统开发之路。为了方便单片机微控制器与电源、ISP下载电缆、串口线以及各种传感器和电机的连接, 需要制作一个电路板,并将单片机插在教学板上,如图1T所示。本教材将此电路板叫做教 学板。图1-1 C51单片机教学板机器人与C51单片机图1-2所示的是本教材使用的机器人工程对象,它采用AT89s52单片机作为大脑,通过 教学板安装在机器人底盘匕本教材将以此机器人作为典型工程对象,完成上节提到的机器 人所需具备的四种基本能力,使机器人具有基本的智能。本教材假设你已经学习过基础机 器人制作课程,并已经组装好该机器人的机械套件和伺服电机,且已经调试好了机器人伺 服电机的零点。如果没有学习过基础机器人制作与编程,也不要紧,可以在边学习该课 程的同时,参考基础机器人制作与编程的相关章节,在后面的任务中,如果需要,会给 出相关指引。图1-2采用C51单片机的机器人本章首先通过以下步骤告诉你如何安装和使用C51单片机的C语言编程开发环境,如何 开发第一个简单机器人程序,并在机器人上如何运行你写的这个程序。本章的具体任务包括: 寻找并安装开发编程软件 连接机器人到电池或者供电的电源 连接单片机教学板ISP接口到计算机,以便编程连接单片机教学板串行接口到计算机,以便调试和交互 运用C语言初次编写少量的程序,运用编译器编译生成可执行文件,然后下载到单片 机上,通过串口观察机器人上的单片机教学板的执行结果 完成后断开电源任务获得软件在本课程的学习中,你将反复用到三款软件:KeiluVision2IDE集成开发环境、SL ISP 下载软件、串口调试软件等。1. Keil uVision2 IDE集成开发环境该软件是德国KEIL公司出品的51系列单片机C语言集成开发系统。如果你已经学习过 基础机器人制作与编程,并掌握了 PBASIC语言编程思想和基本技能,你将会发现,C 语言在语法结构上更加灵活,功能更加强大,但同时学习和理解起来也稍困难些。你可以在KEIL公司的网站上获得该软件的安装包。2. SLISP软件下载工具该软件是广州天河双龙电子有限公司推出的款ISP下载软件,使用该软件你可以将可 执行文件下载到你的机器人单片机上。该软件的使用需要你的计算机有并行口。你可以在双龙公司的网站中获得该软件。3. 串口调试软件此软件是用来显示单片机与计算机的交互信息的。在硬件上,你的计算机至少要有串口 或USB接口来与单片机教学板的串口连接。教材光盘中提供了该软件的绿色版本,无需安装即可使用。教你招,如何从互联网上获得你想要的东西:当今互联网如此发达,以至我们可以“万事”不求人。熟练运用互联网的搜索引擎,你 也可以做个百事通。如今有两大著名的搜索引擎,国内的,全球的,只要你输 入关键字,你就可以找到相关的任何东西:比如你想找Kdl软件,你可以先打开google网, 然后输入关键字Keil下载”,你就可以找到很多相关的网站。如http: ?boa rdID=7&ID=6352 &pane = 1任务二安装软件到目前为止,你已从网站上,或从教材配套光盘中获得了软件安装包。在教材配套光盘 中提供了几个文件夹,它们分别是KeiluVision2安装包、ISP软件安装包、串口调试终端、 头文件和本书例程的源码。软件的安装很简单,与你安装的其他软件过程一样。安装 Keil uVision21 .执行Keil uVision2安装程序,选择安装Eval Version版进行安装2 .在后续出现的窗口中全部选择Next按钮,将程序默认安装在C: Program FilesKeil文件目录下3 .将光盘“头文件”文件夹中的文件拷贝到C:ProgramFilesKeilC51INC文件夹 里Keil uVision IDE软件安装到你的电脑上的同时,会在你的计算机桌面建立一个快捷 方式。安装ISP下载软件与此类似。任务三硬件连接C51教学板(或者说机器人大脑)需要连接电源以便运 行,同时也需要连接到PC机(或笔记本电脑)以便编程和 交互。以上接线完成后,你就可以用编辑器软件来对系统进 行测试。下面将告诉你如何完成上述硬件连接任务。串口的连接机器人教学板通过串口电缆连接到PC机(或笔记本电 脑)上以便与用户交互。如果你的计算机有串行接口,直接 使用串口连接电缆。如果没有,此时需要使用USB转串口适 配器,如图1-3所示。你只需将该串口线一端的串口连接到 你的机器人教学板,而另一端连接到计算的USB 口上。如果你使用的是Windows98操作系统,在使用该适配器 调试程序前,你还需要给适配器安装驱动程序,相关步骤请 按照适配器硬件和软件安装说明书进行。如果是Windows2000 以上的操作系统,则通常可以直接使用,无需安装驱动程序。图1-3 USB转串口适配器图1-4 ISP载线ISP下载线的连接机器人程序通过连接到PC机或者笔记本电脑的并口上的ISP下载线来下载到教学板上 的単片机内。图1-4所示为ISP下载线。下载线一端连接到PC机或者笔记本的并行接口上, 而另一端(小端)连接到教学板上的程序下载口上。电池的安装本教材使用的机器人采用五号碱性电池给机器人电机和教学板供电,在继续下面的任务 前,请先检査机器人底部电池盒内是否已经装好电池,并是否有正常的电压输出。如果没有, 请更换新的电池。更换过程中,确保每颗电池都按照塑料盒子里面标记的电池极性( + 和一)方向装入。012图1-5处于关闭状态的三位开关012图!-6处于1位状态的三位开关给教学板和单片机进行通电检査教学底板上有一个三位开关(见图!-5),当开 关拨到“O”位断开教学底板电源。无论你是否将电 池组或者其它电源连接到教学底板上,只要三位开 关位于“0”位,那么设备就处于关闭状态。现在将三位开关由“0”位拨至“1”位,打开 教学板电源,如图6所示。检查教学底板上标有 “Pwr”的绿色LED电源指示灯是否变亮。如果没有, 检查电池盒里的电池和电池盒的接头是否已经插到 教学板的电源插座上。开关“2”你将会在后续章节中用到。将开关拨至“2”后,电源不仅要结教学板供电, 同时还会给机器人的执行机构伺服电机供电,同样的,此时绿色LED电源指示灯仍然会 变亮。任务四你的第一个程序你编写和测试的第一个C语言程序将告诉AT89S52单片机控制器,让它在执行程序时发 送一条信息给PC机(或笔记本电脑)。创建与编辑你的第一个程序双击Keil uVision IDE的图标,启动Keil uVision IDE程序,你会得到图1-7所示的 Keil uVision2 IDE的主界面。通过用Project菜单中的New Project命令建立项目文件, 过程如下:图 1-7 Keil uVision IDE的主界内i1 .点击Project,会出现图1-8所示的菜单画面,然后选择“New Project,将出 现图9所示对话框。New Project.Import RVisionl Project.Open ProjectClose ProjectFile Extensions, Books and图 !-9 Create New Project对话框图1-8 Project菜单画面2 .在文件名中输入如“HelloRoBot,保存在你想保存的位置(如D:中级机器人制 作与编程、程序、Chapter 1),可不用加后缀名,点击“保存”,后会出现图1T0 所示的窗口。3 .这里要求我们选择芯片的类型,Keil uVision2 IDE几乎支持所有的51核心单片 机,并以列表的形式给出。本教材使用的是Atmel公司的AT89s52,在Keil uVision2 IDE提供的数据库(Data base)列表中找到此款芯片、然后点击确定,会出现图1-11 所示的窗口,询问你是否加载8051启动代码,在这里我们选择“否”,不加载。(如果你选择“是”,对你的程序没有任何影响。若你感兴趣,可选择“是”,看 看编译器加载了哪些代码。)之后会出现图1T2画面,此时即得到了项目文件。Select Devi ce for Target , TargetVendor: AtmelDevice: AT89S52L Use Extended Linker (1X51) instead of BL51Family: MCS-51厂 Use Extended Assembler (AX51) insteed of A51Data baseDescription:AT89LV55AT89s4D12AT89ssiAT89S52AT89553AT8958252AT8xC5122AT8xC51SNDlAT91F40416AT91F40816AT91FR40162AT91FR40428051 based Full Static CMOS controller wi th Three-Level Pr,_J32 I/O lines, 3 Timers/Counters, 8 Interrupts Sources, Wat, 8K Flash Memory, 256 Bytes On-chip RAM图1-12目标工程窗U图1-13 C语言源文件保存对话框图1-10单片机型号选择窗口? Ctw $(u4ar4 051 Stvtvf New”操作)为该项目新 建一个C语言程序文件,保存后 弹出图1T3所示的对话窗口,将 文件保存在项目文件夹中,在文 件类型中填写.C (这里.C为文件 扩展名,表示此文件类型为C语 言源文件),因为你下面将采用C 语言编写第一个程序。例程:HelloRoBot.c#includeuart. h int main (void)uart_Init(); /串口初始化printf(Hello, this is a message from your Robotn9: while (.1);将该例程键入Keil uVision IDE的编辑器,并以文件名HelloRoBot. c保存。下步就8是添加该文件到H标工程项目了,其具体添加过程如下:1 .单击图!-12中的,将出现图1-14所示的列表;2 .然后右键点击Source Group 1n ,在出现的菜单下选择Add File To Group Source Group 1,出现 Add Files to Group Source * Group 1 , 对话框。在 该对话框中选择需要添加的程序文件,如刚建立HelloRoBot. c,单击Add按钮, 把所选文件添加到项目文件中。一次可添加多个文件。3 .程序文件添加到项目文件中去后,这时上图中Source Group 1”的前面将出现 个+ ”号;单击它将出现刚添加的源文件名,如图1T5所示(注意:图中显示双击源文件即可显示源文件的编辑界面。下面来产生下载需要的可执行文件。要产生可执行的.Hex文件,需要对目标工程Target 1” 进行编译设置,右键点击Target 1,选择Option for target Target 1 。 点击output”,选择其中的Create HEX File,如图1T6所示,点击确定关闭设置窗 口。然后点击Keil uVision IDE快捷工具栏中的K,Keil的C编译器开始根据要生成的 目标文件类型对目标工程项目中的C语言源文件进行编译。编译过程中,可以观察到源文件 中有没有错误产生,如果没有错误产生,在IDE主窗口的下面出现如图1-17的提示信息, 表明已成功生成了可执行文件,并存储在C语言源程序存储的目录中,文件名就是 HelloRoBot. HexOpti ons for Target , TargetDevice | Target Output | Listing | C51| A51| BL51 Locate | BL51 Mi sc | Debug | Utilities |确定 | 取消 Defaults JSelect ?older for ObjctrNane of Executable: |HelloRoBot( Create Executable.HelloRoBot2 Debug Informatio2 Browse Informatir Merge32K Hexfile Create HEX FiHEX |HEX-80三 Create Library: .HelloRoBot. LIB Create Batch File图1-16设置目标工程的编译输出文件类型Build target Target 1 compiling HeiloRoBot.c. linking.Program Size: data-58.3 xdata-0 code1246 creating hex file from HelloRoBot. HelloRoBot - 0 Error(s), 0 Warning(s).4 p | | Build X Command / Find_in_Files Jjr|L:100 C:2MJMK/图1T7编译过程的输出提示信息下载可执行文件到单片机点击ISP下载软件图标,打开ISP下载软件窗口如图1-18所示,并将通信参数设置成 图中所示的参数。第一个为接口类型选择窗,该窗口的下拉列表中提供了许多接口类型:串口 COM1- COM16,并 LPT1LPT3以及USB接口等。教材使用并口 LPT1。第二个为下载速度选择窗口,该窗口内容与接口类型紧密相连。不同的接口,该窗就 提供不同内容的下载速度。若选择LPT1,则提供了五种下载速度:TURBO模式、FAST模式、 NORMAL模式、SLOW模式和TURBO SLOW模式。在这五种模式下,程序下载速度依次减小。教 材中的例程使用的是第一个模式TURBO模式,下载速度最快。第三个为单片机型号选择窗口。如何快速地认识新的软件?面对一款新的软件,你可能有一种无从下手的感觉:这个是干嘛的?那个又是干嘛的? 其实,软件本身就提供了问题的答案。每款软件都提供了帮助文档。如SL ISP软件界面的右上角有个“问号”按钮,单击 它就弹出一系列的选项,这些选项就对该款软件做出了大致的解释,有助你快速掌握软件的 使用。点击“Flash”,选择要下载的可执行HEX文件HelloRoBot.Hex,选择后点击编程 开始下载。如果下载成功,则下面显示完成次数:x次”,否则显示失败次数:x次”。如果芯片是第二次下载程序,请先选中“擦除”复选框。图1-18 ISP软件下载窗口举一反三如果你已经学习过基础机器人制作与编程,并已经掌握了采用BASIC Stamp系列单 片机模块的PBASIC语言开发技能,请你与刚介绍的C语言编程过程进行比较,看看有何 不同。并思考一下,这些不同对于初学者而言各有何优缺点。用串口调试软件查看单片机输出信息打开串口调试终端,选择串口 “C0M1”后点击“打开串口”,在“接收区”内你看到了 什么?什么也没有!为什么呢?因为从你把执行文件成功下载到单片机的那个时刻开始,程 序就开始运行了:单片机已经向PC机发送了信息。你错过了接收。怎么办呢?在机器人教学板上给你提供了 “Reset”按钮,它可以让下载到单片机内的程序重新运 行次。按下“Reset”按钮,是不是出现如图1-19所示画面呢?图!-19串U调试终端HelloRoBot.c是如何工作的?例程中第一行代码是HelloRoBot. c所包含的头文件。该头文件在编译过程中用来将下 面程序中需要用到的标准数据类型和由C语言编译器提供的一些标准输入/输出函数、中断 服务函数等包括进来,生成可执行代码。头文件中可以嵌套头文件,同时也可以直接定义一 些常用的功能函数。本例程中的头文件uart.h在本教材的后续任务中都耍用到,它其中就 包含了本例程中以及后面例程中都要用到的uartnit()函数的定义和实现。下面先讲一下函数的概念。个较大的C语言程序一般分成若干个模块,每个模块实现 一定的功能,我们称之为函数。任何个C语言程序本身就是一个函数,该函数必须以main 函数作为程序的起点,通常称之为主函数。主函数可以调用任何子函数,子函数之间也可以 相互调用(但是不可以调用主函数)。函数定义的一般格式为:函数返回值的类型函数名(形式参数 1,形式参数2丿第二行就是程序的入口 main函数。main前面的int是指定main的函数返回值类型为 整数类型,括号中void或无内容表示没有形式参数。每个函数的主体都耍用“”括起来 (反思一下同PBASIC语言编程的区别)。函数的具体讲解将在第.三第。main函数主体中有两行语句:第一行是串口初始化函数uartnit(),用来规定单片 机串口是如何与PC通信的。有兴趣的读者可以打开uart.h头文件,看看该函数是如何实现 的,如果其中有很多内容不懂,不要紧,记住这个函数的功能就行,以后慢慢学习和理解。 这行语句中“”后的是注释。注释是一行会被编译器忽视的文字,因为注释是为了给人阅 读。函数体中的第二行语句printf命令是单片机通过串口向PC机发送一条信息。printf函数printf函数称为格式输出函数,其功能是按用户指定的格式,把指定的数据显示输出。 该函数是C语言提供的标准输出函数,定义在C语言的标准函数库中,要使用它,必须包括 定义标准函数库的头文件stdio.h。由于在uart.h头文件中包括了 stdio.h,因此本例程无 需另外包括该头文件。printf函数的一般形式为:printf(“格式控制字符串”,输出列表);格式控制字符串可由格式字符串和非格式字符串两种组成。格式字符串是以%开头的字符串;输出表列在格式输出时用到,它给出了各个输出项, 要求与格式字符串在数量和类型上对应。非格式字符串在输出时原样输出,在显示中起提示作用。例程中用到的就是非格式字符 串。“n”是个向调试终端发送回车命令的控制符。也就是说,当你按下“Reset”按钮 再次运行程序时,将在下一行显示“Hello, this is a message from your Robot”:如果 没有n,则会在上一语句中的结尾,即“Robot”后面接着显示。while(1);的作用while是C语言里的循环控制语句,它的具体语法将在第二章里介绍,这里向你讲解为 何要加上这个循环。HEX文件是加载在单片机FLASH存储器上的,并且是从头开始往下加载。当你把HEX文 件加载上去的时候,填满了整个FLASH空间吗?当然没有!那么,当程序执行完printf函 数之后,它将还后向下执行,但后面的空间并没有存放程序代码,这时程序后会乱运行,也 就发生了跑飞现象。加上while(l);语句,让程序一直停止在这里,就是为了防止程序跑飞。该你了例程:HelloRoBotYourTurn.c#includeuart. hint main (void)(int i;uartlni t();i=7*ll:printf(Whats 7 X U?n);printfThe answer is :%dn i);while(l);)按照上述方法建立新的项目,输入程序HelloRoBotYourTurn.c,运行,查看输出结果, 是否与图20样?图 1-20 例程 HelloRoBotYourTurn.c 输出结果HelloRoBotYourTurn.c 是如何工作的?在介绍main函数内容之前,先向你讲解一下C语言的些基本知识。C语言数据类型C语言有5种基本数据类型:字符、整型、单精度实型、双精度实型和空类型。这些数 据类型的长度和范围会因处理器的类型和C语言编译程序的实现而有所不同,对于KEIL51 产生的目标文件,表1-1给出了两种教材中常用的数据长度和范围。表1-1常用数据类型的长度和范围类型长度(单位bit)范围char8-128-+127 即2(27-1)int16-32768+32767 即2(2,5-1)float32-3.4X10-383.4X1038标识符在C语言中,标识符是对变量、函数名和其他各种用户定义对象的命名。标识符的长 度可以是个或多个字符。绝大多数情况下,标识符的第一个字符必须是字母或下划线,随 后的字符必须是字母、数字或下划线(某些C语言编译器可能不允许下划线作为标识符的 起始字符)。表1-2是一些正确或错误标识符命名的实例。表1-2正确或错误标识符命名实例正确形式错误形式count2counttest23hi! therehighbalancehigh.balance常量C语言中的常量是不接受程序修改的固定值,常量可以为任意数据类型,如下例所示:char a、 9int 21、-234变量在程序中可以改变的量称为变量。个变量应该有一个名字(标识符),在内存中占据 一定的存储单元,在该存储单元中存放变量的值。请注意区分变量名和变量值这两个不同的 概念。所有C语言变量必须在使用之前定义。定义变量的一般形式是:type variable Jlist;这里的type必须是有效的C数据类型,variable_list (变量表)可以由一个或多个由逗 号分隔的多个标识符名构成。下面给出一些定义的范向:int i j,k;char注意,C语言中变量名与其类型无关。C语言有3大运算符:算术、关系与逻辑、位操作。另外,C语言还有一些特殊的运算 符,用于完成一些特殊的任务。算术运算符表1-3给出了 C语言允许的算术运算符。在C语言中,运算符“ + ”、“-、“朮和 “/”的用法与大多数计算机语言的相同,几乎可以用于C语言内定义的任何数据类型。表1-3算术运算符运算符用处+加法-减法*乘法/除法表达式由运算符、常量及变量构成。C语言的表达式遵循一般代数规则。C语言规定:任何表达式在其未尾加上分号就构成为语句。赋值运算符赋值运算符记为由“=连接的式子称为赋值表达式,其后加分号构成赋值语 句,其一般形式为:变量 =表达式;现在,来看看main函数是如何工作的。int i;定义了一个整型变量i。i即是变量的标识符。分号表示结束。uart_Init();与上一个例程一样,规定单片机串口如何与PC机通信的。i=7*U;将表达式“7*1的值赋给变量i,也就是说变量i的值为77。printffWhats 7X 11 Ni);输出“皿a7X?”,这里printf的用法与上一个例程一样。printf(The answer is :%dn,i);这里用到了 printf函数的格式字符串输出。%d是指定输出数据的类型为十进制整数。 printf函数首先输出“77ie answer is;然后它遇到了 “刎”,表示将后面输出列表中的变量以十进制的形式输出,即,将变量i以77”的形式输出;最后的输出结果即为:7淀曲s松r is :77最后一条语句:研e,也起到与在上例中同样的作用:防止程序跑飞。该你了利用printf ()函数输出图形通过两个例程的学习,你应该大概掌握了 printf()函数的使用。除此之外,你还可以 利用它来做一些有趣的事,比如你如何让竖线“丨”在屏幕上顺时针或逆时针转动输出呢? 参考下面的程序代码:printfr ;delay_nms (500);printf (y ;delay_nms (500);delay_nms (500);printf(y ;delay_nms (500);printf(、;delay_nms (500);当然,你还可以显示静态图形,如:* * * * * * *其实很简单仔细想想!任务五做完实验关断电源把电源从教学底板上断开很重要,原因有几点:首先,如果系统在不使用时没有消耗电 能,电池可以用的更久;其次,在以后的试验中,你将在教学底板上的面包板上搭建电路, 搭建电路时,应使面包板断电。如果是在教室,老师可能会有额外的要求,比如断开串口电 缆,把教学底板存放到安全的地方等等。总之,你做完试验后最重要的一步是断开电源。断开电源比较容易,只要三位开关拨到左边的位即可。工程素质和技能归纳1. C51系列单片机Keil uVision IDE (集成开发环境)软件和ISP下载软件的下载和 安装2. 机器人用C51教学板与计算机或者笔记本的连接3. 如何在集成开发环境中创建目标工程文件,并添加和编辑C语言源程序4. C语言程序的编译和下载5. 串口调试终端的使用6. C语言基本知识:基本数据类型、常量、变量、运算符、表达式7. printf格式输出函数的使用科学精神的培养1 .比较Keil uVision IDE与BASIC Stamp系列开发环境的优缺点,找出它们的共同 特点2 .比较第一个C语言程序与第一个PBASIC程序的异同,找出它们的共同点3 .比较BASIC Stamp的PBASIC调试指令和Keil C的输出指令printf的异同4 .查找C语言的标准输入输出库函数,了解printf的总体功能。本章中到了它的两 个格式符和控制符5 .查阅参考书,了解其他数据类型、算术运算符知识第二章单片机输出接口与伺服电机控制本章教你如何用单片机AT89S52的输入/输出接口来连接、测试和控制机器人伺服电机。 为此,你需要理解和掌握用单片机输入/输出接口控制伺服电机方向、速度和运行时间的相 关原理和编程技术。C51单片机的输入/输出接口控制机器人伺服电机以不同速度运动是通过让单片机的输入/输出(I/O)口输出不同的 脉冲序列来实现的。51系列单片机有4个8位的并行I/O : PO、Pl、P2和P3。这4个接 ,既可以作为输入,也可以作为输出;可按8位处理,也可按位方式(1位)使用。图2T 是单片机AT89S52的引脚定义图,这是个标准的40引脚双列直插式集成电路芯片。PDIP(T2) P1.O 匚140VCC(T2 EX) P1.! 匚239 PO.O (ADO)P1.2 匚338 PO.1 (AD1)P1.3 匚437 PO.2 (AD2)P1.4 匚536 PO.3 (AD3)(MOSI) P1.5 匚635 PO.4 (AD4) r(MISO) P1.6 匚734 PO.5 (AD5)(SCK) P1.7 匚833 PO.6 (ADG)RST匚932 PO.7 (AD7)丿(RXD) P3.O 匚1O31 EAA/PP(TXD) P3.! 匚1 130 ALE/PROG(INTO) P3.2 匚1229 PSEN(INT1) P3.3 匚1328 P2.7 (A15) x(TO) P3.4 匚1427 P2.6 (A14)(T1) P3.5 匚1526 P2.5 (A13)(wn)P3.6 匚1625 P2.4 (A12)(RD) P3.7 匚1724 P2.3 (A11),XTAL2 匚1823 P2.2 (A1O)XTAL1匚1922 P2.1 (A9)GND匚2021 P2.O (A8)丿图2-1单片机AT89s52引脚I/O定义图说到这里,你或许马上就会问,单片机如何知道它的引脚端口是作为输入还是输出呢?这与单片机各1/O接口的内部结构有关,而且每个8位并行I/O 的使用方式也不太 样。后面的章节会根据机器人控制的需要逐步介绍它们的原理和使用方法。本章主要介绍如 何用P1 口来完成机器人伺服电机的控制。P1 口作为输出时,使用非常简单,可以直接对该 端口的位进行操作而不需额外设置,只需向该端口的各个位输出你想输出的高低电平信号即 可。AT89S52 引脚如图2-1所示,AT89S52共有40根引脚,其中32根是I/O端口引脚。在这32根引脚 中,有29根具备两种用途(用圆括号写出),既可作为1/0端口,也可作为控制信号或地 址及数据线。任务单灯闪烁控制为了验证P1 口的输出电平是不是由你编写的程序输出的电平,可以采用一个非常简单 有效的办法,就是在你想验证的端口位接个发光二极管。当你输出高电平时,发光二级管 灭;输出低电平时,发光二极管亮。在本任务中,使用P!端U的第一脚(记为P1_O)来控制发光二极管以1HZ的频率不 断闪烁。LED电路元件1 .红色发光二极管2个2 . 470。电阻2个LED电路搭建如果你已经学习过基础机器人制作这本教材,你肯定对图2-2所示电路很熟悉。按 照图2-2上边所示电路,在智能机器人教学板的面包板上搭建起实际电路。实际搭建好的电 路参考图2-2下边的照片。实际搭建电路时注意:确认发光二极管的短针脚(阴极)插入通过电阻与Pl_0相连确认发光二极管的长针脚(阳极)插入“VCC”插口D1 IvccLED图2-2发光二极管与I/O脚P1_0的连接例程:HighLowLed.c接通板上的电源输入、保存、下载并运行程序HighLowLed.c (整个过程请参考第一章)观察与Pl_0连接的LED是否每隔一秒发光、关闭一次 ttinclude#includeint main (void)(uartjnit ()!初始化串 口printf(The LED connected to Pl_0 is blinking! n);while (1)P1_O=1;delay_nms (500);P1_O=O;delay nms (500);/ P1_O输出高电平 延时500ms P1_O输出低电平 /延时 500msHigh Low Led.c是如何工作的?与第一章程序相比,本例程多使用了一个头文件BoeBot.h,在该头文件中定义了两个延 时函数:void delay_nms(unsigned int i)与 void delay nus(unsigned int i)o无符号整型数据unsigned int与第一章讲到的整型数据int相比,无符号整型数据unsigned int只有一个区别:数据的 取值范围从32768+32767变为65535,也就是说它只能取非负整数。delay一nms()是毫秒级的延时,而delay一nus()是微秒级的延时。如果你想延时1秒钟, 可以使用语句丿,T毫秒的延时则用delay_nus(1000)来完成。注意:上述的延时函数是在外部晶振为12MHz的情况设计的,如果外部晶振频率不 是12MHz,调用这两个函数所产生的真正延时就会发生变化。晶振的作用单片机要能工作,就必须有一个标准时钟信号,而晶振就是为单片机提供标准时钟信号。 uart一串口初始化函数,在头文件uart.h中实现,具体内容将在后面章节讲解。 调用printf是为了在程序执行前给调试终端发送一条提示信息,告诉你现在程序开始执 行了,并告诉你随后程序将开始干什么。这在你以后的编程开发过程中是一个良好的习惯, 将非常有助于你提高程序的调试效率。代码段:whi le (1)P1_O=1;delay_nms (500);P1_O=O;delay_nms (500);是本例程的功能主体。/ P1_O输出高电平 延时500ms/ P1_O输出低电平/延时 500ms 首先看两个大括号中的代码:先给P10脚输出高电平,由赋值 语句Pl_0=l完成,然后调用延时函数delay_nms(500),让单片机微控制等待500毫秒,再 给Pl_0脚输出低电平,即Pl_0=0,然后再次调用延时函数delay_nms(500)。这样就完成了 一次闪烁。在程序中,你没有看到Pl_0的定义,它已经在由C语言为C51开发的标准库中 定义好,由头文件uart.h包括进来。后续章节中将要用到的其它引脚名称和定义都是如此。注意:在所有计算机系统中,都用1表示高电平,0表示低电平,所以,P0=/就表 示要向该端口输出高电平,两尸/一0=0就表示给该端口输出低电平。例程中两次调用延时函数,让单片机微控制器在给Pl_0引脚端口输出高电平和低电平 之间都延时500ms,即输出的高电平和低电平都保持500ms0微控制器的最大优点之一就是它们从来不会抱怨不停地重复做同样的事情。为了让单片 机不断闪烁,你需要把让LED闪烁一次的几个语句放在while(l)循环里。这里用到了 C 语言实现循环结构的种形式:while语句while语句的一般形式如下:while(表达式)循环体语句当表达式为非值时,执行while语句中的内嵌语句,其特点是先判断表达式,后执行 语句。例程中直接用1代替了表达式,因此总是非值,所以循环永不结束,也就可以一直 让LED灯闪烁。注意:循环体语句如果包含一个以上的语句,就必须用花括号(“”)括起来,以 复合语句的形式出现。如果不加花括号,则while语句的范围只到while后面的第一个分号 处。例如,本例中while语句中如果没有花括号,则while语句范只到P1_O=1;
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 商业管理 > 商业计划


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!