数据采集系统的设计_第1页
数据采集系统的设计_第2页
数据采集系统的设计_第3页
数据采集系统的设计_第4页
数据采集系统的设计_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

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

文档简介

目录TOC\o\h\z第一章计算机硬件系统概述 11.1计算机硬件系统的组成及结构 11.2I/O系统概述 21.3计算机硬件系统的设计内容 51.4计算机硬件系统的设计原则 5第二章数据采集技术概述 62.1数据采集系统的结构原理 62.1.1数据采集系统的分类 62.1.2数据采集系统的基本功能 62.1.3数据采集系统的结构形式 62.2数据采集系统设计的基本原则 72.2.1硬件设计的基本原则 72.2.2软件设计的基本原则 7第三章数据采集系统的硬件设计 83.1系统结构框图 83.2系统工作原理 83.2.1CPU处理核心模块 93.2.2ADC模数转换 103.2.3液晶显示流程 133.2.4完整的PCB版图 15第四章数据采集系统的软件设计 174.1汇编和keilc 174.2KeilC51vsANSIC(标准C) 174.2.1内存区域(MemoryAreas): 184.2.2变量或数据类型 184.2.3存储类型声明和存储模式 194.2.4KeilC51指针 214.2.5KeilC51函数 214.2.6中断服务 224.3使用KeilC时应做的和应该避免的 234.3.1采用短变量 244.3.2使用无符号类型 244.3.3避免使用浮点指针 244.3.4使用位变量 244.3.5用局部变量代替全局变量 244.3.6为变量分配内部存储区 254.3.7使用特定指针 254.3.8使用调令 254.3.9使用宏替代函数 254.4C51的编程规范 254.5keilc软件使用方法 274.6系统整体程序流程 364.7各模块软件程序流程 374.7.1ADC模数转换流程 374.7.2液晶显示模块 384.7.3键盘处理模块 394.7.4定时器中断响应处理程序 39第一章计算机硬件系统概述计算机硬件是在指令的控制下自动对数字进行操作,并将数字信息与其他形式信息进行相互转换的机器系统,是一个高度复杂的由多种电子线路、精密机械装置等构成的能自动并高速完成数据计算的装置或者工具。本章将介绍计算机硬件系统的基本组成和设计过程。1.1计算机硬件系统的组成及结构原始的冯·诺依曼计算机在结构上是以运算器为中心的,而发展到现在,已转向以存储器为中心,图1-1为计算机最基本的组成框图。输入设备辅助存储器输出设备输入设备辅助存储器输出设备主存储器运算器控制器外设主机CPU图1-1计算机的组成框图输入设备的任务是把人们编好的程序和原始数据送到计算机中去,并且将它们转换成计算机内部所能识别和接受的信息方式。按输入信息的形态分为字符输入、图形输入。图像输入及语音输入等。目前,常见的输入设备有:键盘、鼠标、扫描仪等。辅助存储器(磁盘、磁带)也可以看作输入设备。另外,自动控制和检测系统中使用的模数(A/D)装置也是一种输入设备。(2)输出设备输出设备的任务是将计算机的处理结果以人或其他设备所能接受的形式送出计算机。目前最常用的输入设备是打印机和显示器。辅助存储器也可以看作输出设备。另外,数模(D/A)转换装置也是一种输出设备。(3)存储器存储器是用来存放程序和数据的部件,它是一个记忆装置,也是计算机能够实现“存储程序控制”的基础。在计算机系统中,规模较大的存储器往往分成若干级,称为存储系统。如图1-2所示的是常见的三级存储系统。主存储器可由CPU直接访问,存储速度快但容量较小,一般用来存放当前正在执行的程序和数据。辅助存储器设置在主机外部,它的存储容量大,价格低,但存取速度较慢,一般用来存放暂时不参与运行的程序和数据,这些程序和数据在需要时可传送到主存,因此它是主存的补充和后援。当CPU速度很高时,为了使访问存储器的速度能与CPU的速度相匹配,又在主存和CPU间增设了一级Cache(高速缓冲存储器)。Cache的存取速度比主存更快,但容量更小,用来存放当前最急需处理的程序和数据,以便快度地向CPU提供指令和数据。(4)运算器运算器使对信息进行处理和运算的部件。经常进行的运算使算术运算和逻辑运算,所以运算器又称算术逻辑运算部件(ArighmeticandLogicalUnit,ALU)。运算器的核心是加法器。运算器中还有若干个通用寄存器或累加寄存器。用来暂存操作数,并存放运算结果。寄存器的存取速度比存储器的存取速度快的多。(5)控制器控制器是整个计算机的指挥中心,它的主要功能是按照人们预选取确定的操作步骤,控制整个计算机的各部件有条不紊的自动工作。控制器存主存中逐条地取出指令进行分析,根据指令的不同来安排操作顺序,向各部件发出相应的操作信号,控制他们执行指令所规定的任务。将前述的各大基本部件,按某种方式连接起来就构成了计算机的硬件系统。目前许多计算机的基本部件之间是用总线连接起来的。计算机的总线按其逻辑结构来看,可以分为单总线和多总线结构。1.2I/O系统概述在以计算机为控制核心的硬件系统中,CPU和存储器一般封装在主机中,计算机系统与其他硬件设备信息的传输是通过I/O系统来完成的,因此I/O系统的设计是硬件系统设计的焦点,下面介绍一下I/O系统基本组成和功能。(1)I/O系统的组成主机外设外设识别数据或命令或状态外设识别地址信息数据(串)数据(并)数据(并串)控制联络图1-2接口与主机、外设间的连接示意图I/O系统包括外部设备主机外设外设识别数据或命令或状态外设识别地址信息数据(串)数据(并)数据(并串)控制联络图1-2接口与主机、外设间的连接示意图(2)I/O模块的功能I/O模块是连接主机(CPU、主存)和外部设备的桥梁,因此它必须有计算机的内接接口和计算机的外接接口。其功能主要包括:·各种外设的操作方法不同,由CPU统一控制不切合实际。·外设的数据传输速率比存储器和CPU慢,使得高速总线不能直接与外设相连。·外设所使用的数据格式各不一致。(3)I/O设备的编址为了CPU便于对I/O设备进行寻址和选择,必须给众多的I/O设备进行编址,也就是给每一台设备规定一些地址码,称为设备号或设备代码。I/O设备两种寻址方法:·专设I/O指令:例指令IN完成输入,指令OUT完成输出操作。其地址码指出I/O设备的设备代码。这是I/O空间独立于存储器空间的情况,即设备码的编码和存储器的存储单元的编码是平行存在的。·存储器映象方式:利用访存(取数/存数)指令完成I/O功能。使用这种方法时,从主存的地址空间中分出一部分地址码作为I/O的设备代码,当访问到这些地址时,表示被访的不是主存储器,而是I/O设备寄存器。这时I/O空间和存储器空间是合在一起的,即I/O设备和存储单元是统一编址的。(4)I/O接口类型按照数据传送的宽度可分为并行接口和串行接口。并行接口中,设备和接口是将一个字节(或字)的所有位同时传送。传送完?设置内存缓冲区首址设置计数器启动外设传送一个数据修改内存地址传送完?设置内存缓冲区首址设置计数器启动外设传送一个数据修改内存地址修改计数值结束I/O传送准备好?未完是完否图1-3程序直接控制输入输出方式流程按照数据传送的控制方式可分成程序控制输入输出接口,程序中断输入输出接口和直接存储器存取(DMA)接口等。(5)I/O技术常用的输入输出方式有五种,包括:程序直接控制(编程I/O)、程序中断控制(中断驱动I/O)、存储器直接存取(DMA)、通道方式、外围处理机方式。在实际硬件系统设计种,较常用的是程序直接控制方式和中断方式,下面介绍一下,这两种方式的特点和过程。·程序直接控制(programeddirectcontrol)特点:完全通过程序来控制主机和外围设备之间的信息传送。过程:首先启动设备,发出启动命令,接着CPU等待外围设备完成接收或发送数据的准备工作,在等待时间内,CPU不断地用一条测试指令检测外围设备工作状态标志触发器。一旦测试到标志触发器已置成“完成”状态,即可进行数据传送,其流程如图1-3。缺点:这种控制方式简单,但CPU和外围设备只能串行工作,而CPU的速度比I/O设备的速度快得多,所以CPU的大量时间都处于等待,空闲状态,使系统效率大大降低。·程序中断传送(programinterrupttransfer)关中断保护断点、保护现场判断中断条件转入中断服务程序开中断执行中断服务程序关中断恢复现场、恢复断点开中断返回断点图1-4程序中断传送程序流程过程:启动外围设备后主机继续执行程序。当外围设备完成数据传送的准备后,便向CPU发关中断保护断点、保护现场判断中断条件转入中断服务程序开中断执行中断服务程序关中断恢复现场、恢复断点开中断返回断点图1-4程序中断传送程序流程优点:在一定程度上实现了CPU和外围设备的并行工作。多中断:若在某一时刻有几台外围设备发出中断请求信号,CPU可根据预先规定好的优先顺序,按轻重缓急去处理几台外设的数据传送,从而实现了外围设备的并行工作。1.3计算机硬件系统的设计内容计算机硬件系统的设计不仅仅是将电路设计出来就完成任务,要将硬件设计并调试到软件可以方便运行和调用的程度,所涉及的内容要广的多。目前一般认为下列内容都属于硬件工程师要完成的任务:电路设计、可编程器件的逻辑设计、专用集成电路设计、指令系统设计、计算机系统设计、微程序控制设计、汇编语言程序设计、设备驱动程序设计和系统仿真和调试的测试。目前,嵌入式硬件的设计师还用懂得嵌入式实时操作系统。总之,凡是实现“操作数字”的任务,以及以上层软件如何调用这些基本操作所涉及的软硬件接口,都是硬件设计的内容。计算机硬件设计的层次不同,采用的方法也有所区别,专业的计算机一股脑见人员可能会涉及到处理器设计、存储器设计和传输通道设计,而非计算机的工程技术人员往往是利用已有的器件来设计板卡或者某种数字化装置。一般来说,现代的硬件设计人员应该掌握电子设计自动化(EDA)方法和相应的软件工具。EDA是利用计算机软件设计和仿真工具来进行硬件的芯片设计、电路原理设计、布板、运行仿真、热设计和电磁兼容性仿真等。它可以大大提高硬件设计的效率和正确性。作为硬件设计人员,还要学习硬件描述语言HDL,会采用各种开发工具软件和测试工具软件,并会用逻辑分析仪和示波器等调试硬件电路。1.4计算机硬件系统的设计原则计算机硬件系统的设计要遵循两个原则:(1)加快经常性事件经常性事件就是发生最频繁、占时间最多的事件,如果某个事件占了总运行时间的90%,这部分加快了10倍,总时间就会显著减小到原来的19%。但如果某个事件只占了总时间的10%,即使加快10000倍,总时间也会少于原来的90%。所以,加快经常性事件效果最好。(2)性能平衡原则即CPU、内存、I/O的性能要相互匹配才是一个性能平衡的系统,不平衡就会出现瓶颈。一个经验的定律是:每一个MIPS(每秒兆指令数)的处理能力,需要1MB的内存与1MB/s的I/O带宽与之匹配。第二章数据采集技术概述数据采集技术是微型计算机应用技术的重要分支。外部现实对象(广义的外部设备)通过接口和计算机交换信息,在现实对象中.信息表现为不同的形式并有明确的物理意义,输入到计算机内部后部变成二进制数,统称为数据。数据经过计算机的加工处理再作用到现实对象,又变成具体的物理信号。上述整个过程部可以看成是数据采集技术涵盖的内容。2.1数据采集系统的结构原理数据采集系统一般包括模拟信号的输入输出通道和数字信号的输入输出通道。数据采集系统的输入又称为数据的收集;数据采集系统的输出又称为数据的分配。2.1.1数据采集系统的分类数据采集系统的结构形式多种多样,用途和功能也各不相同,常见的分类方法有以下几种:根据数据采集系统的功能分类:数据收集和数据分配;根据数据采集系统适应环境分类:隔离型和非隔离型,集中式和分布式,高速、中速和低速型;根据数据采集系统的控制功能分类:智能化数据采集系统,非智能化数据采集系统;根据模拟信号的性质分类:电压信号和电流信号,高电平信号和低电平信号,单端输入(SE)和差动输入(DE),单极性和双极性;根据信号通道的结构方式分类:单通道方式,多通道方式。2.1.2数据采集系统的基本功能数据采集系统的任务,具体地说,就是采集传感器输出的模拟信号并转换成计算机能识别的数字信号,然后送入计算机,根据不同的需要由计算机进行相应的计算和处理,得出所需的数据。与此同时,将计算得到的数根进行显显示和打印,以便文现对某些物理量的监视[2]。由数据采集系统的任务可以知道,数据采集系统具有以下几方面的功能:数据采集、模拟信号处理、数字信号处理、开关信号处理、二次数据计算、屏幕显示、数据存储、打印输出、人机联系。2.1.3数据采集系统的结构形式从硬件力向来看,白前数据采集系统的结构形式主要有两种:一种是微型计算机数据采集系统;另一种是集散型数据采集系统。微型计算机数据采集系统是由传感器、模拟多路开关、程控放大器、采样/保持器、AD转换器、计算机及外设等部分组成。集散型数据采集系统是计算机网络技术的产物,它由若十个“数据采集站”和一台上位机及通信线路组成。数据采集站一般是由单片机数据采集装置组成。位于生产设备附近,可独立完成数据采集和颈处理任务,还可将数据以数字信号的形式传送给上位机。2.2数据采集系统设计的基本原则对于不同的采集对象,系统设计的具体要求是不相同的。但是,由于数据采集系统是由硬件和软件两部分组成的,因此,系统设计的一些基本原则是大体相同的[2]。2.2.1硬件设计的基本原则(1)经济合理系统硬件设计中,一定要注意在满足件能指标的前提下,尽可能地降低价格,以便得到高的性能价格比,这是硬件设计中优先考虑的一个主要因素,也是一个产品争取市场的主要因素之一。(2)安全可靠选购设备要考虑环境的温度、湿度、压力、振动、粉尘等要求,以保认在规定的下作环境下,系统性能稳定、工作可靠。要有超量程和过载保护,保证输入、输出通道正常工作。要注意对交流市电以及电火花等的隔离。要保证连接件的接触可靠。(3)足够的抗干扰能力有完善的抗干扰措施,是保证系统精度、工作正常和不产生错误的必要条件。2.2.2软件设计的基本原则(1)结构合理程序应该采用结构模块化设计。这不仅有利于程序的进一步扩充,而且也有利于程序的修改和维护。在程序编序时,要尽量使得程序的层次分明,易于阅读和理解,同时还可以简化程序,减少程序对于内存的使用量。当程序中有经常需要加以修改或变化的参数时,应该设计成独立的参数传递群序,避免程序的频繁修改。(2)操作性能好操作件能好是指使用方便。这点对数据采集系统来说是很重要的。在开发程序时,应该考虑如何降低对操作人员专业知识的要求。(3)系统应设计一定的检测程序,例如状态检测利诊断程序,以便系统发生故障时容易确定故障部位,对于重要的参数要定时存储,以防止因掉电而丢失数据。(4)提高程序的执行速度。(5)给出必要的程序说明。第三章数据采集系统的硬件设计3.1系统结构框图物理模拟量数据采集模块物理模拟量数据采集模块键盘单片机液晶显示图3-1系统模块关系图3.2系统工作原理该系统工作的总原理图如图3-2。图3-2系统总原理图3.2.1CPU处理核心模块AT89C52是一种高性能低功耗的采用CMOS工艺制造的8位微控制器,拥有8KB的可编程的闪存(Flashprogrammableanderasablereadonlymemory)。它提供下列标准特征:8K字节的闪速存储器,56字节的RAM,32条I/O线,3个16位定时器/计数器,一个六中断源两个优先级的中断结构,一个双工的串行口,片上震荡器和时钟电路。其管脚图如图3-3所示:图3-38051芯片管脚图图3-38051芯片管脚图·VCC:电源电压·GND:地·P0口:P0口是一组8位漏极开路型双向I/O口,作为输出口用时,每个引脚能驱动8个TTL逻辑门电路。当对0端口写入1时,可以作为高阻抗输入端使用。当P0口访问外部程序存储器或数据存储器时,它还可设定成地址数据总线复用的形式。在这种模式下,P0口具有内部上拉电阻。在Flash编程时,P0口接收指令字节,同时输出指令字节在程序校验时。程序校验时需要外接上拉电阻。·P1口:P1口是一带有内部上拉电阻的8位双向I/O口。P1口的输出缓冲能接受或输出4个TTL逻辑门电路。当对P1口写1时,它们被内部的上拉电阻拉升为高电平,此时可以作为输入端使用。当作为输入端使用时,P1口因为内部存在上拉电阻,所以当外部被拉低时会输出一个低电流(IIL)。·P2口:P2是一带有内部上拉电阻的8位双向的I/O端口。P2口的输出缓冲能驱动4个TTL逻辑门电路。当向P2口写1时,通过内部上拉电阻把端口拉到高电平,此时可以用作输入口。作为输入口,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出电流(IIL)。P2口在访问外部程序存储器或16位地址的外部数据存储器(例如MOVX@DPTR)时,P2口送出高8位地址数据。在这种情况下,P2口使用强大的内部上拉电阻功能当输出1时。当利用8位地址线访问外部数据存储器时(例MOVX@R1),P2口输出特殊功能寄存器的内容。当Flash编程或校验时,P2口同时接收高8位地址和一些控制信号。·P3口:P3是一带有内部上拉电阻的8位双向的I/O端口。P3口的输出缓冲能驱动4个TTL逻辑门电路。当向P3口写1时,通过内部上拉电阻把端口拉到高电平,此时可以用作输入口。作为输入口,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出电流(IIL)。P3口同时具有AT89C51的多种特殊功能,具体如下表3-1所示。表3-1P3口的第二功能端口引脚第二功能RXD(串行输入口)TXD(串行输出口)(外部中断0)(外部中断1)T0(定时器0)T1(定时器1)(外部数据存储器写选通)(外部数据存储器都选通)·RST:复位输入。当振荡器工作时,RST引脚出现两个机器周期的高电平将使单片机复位。·ALE/:当访问外部存储器时,地址锁存允许是一输出脉冲,用以锁存地址的低8位字节。当在Flash编程时还可以作为编程脉冲输出()。一般情况下,ALE是以晶振频率的1/6输出,可以用作外部时钟或定时目的。但也要注意,每当访问外部数据存储器时将跳过一个ALE脉冲。·:程序存储允许时外部程序存储器的读选通信号。当AT89C52执行外部程序存储器的指令时,每个机器周期两次有效,除了当访问外部数据存储器时,将跳过两个信号。·/VPP:外部访问允许。为了使单片机能够有效的传送外部数据存储器从0000H到FFFH单元的指令,必须同GND相连接。需要主要的是,如果加密位1被编程,复位时EA端会自动内部锁存。当执行内部编程指令时,应该接到VCC端。·XTAL1:振荡器反相放大器以及内部时钟电路的输入端。·XTAL2:振荡器反相放大器的输出端。本系统中,采用AT89C52作为CPU处理器,充分利用其硬件资源,结合74ls373锁存器,7404、7402、74138等数字处理芯片,连接了各个硬件模块。地址分配如下:ADC0809地址:0111100000000000B--01111111XXXXXXXXB3.2.2ADC模数转换1.ADC0809主要特性ADC0809是采用CMOS工艺制造的双列直插式单片8位A/D转换器。分辨率8位,精度7位,带8个模拟量输入通道,有通道地址译码锁存器,输出带三态数据锁存器。启动信号为脉冲启动方式,最大可调节误差为±1LSB,ADC0809内部设有时钟电路,故CLK时钟需由外部输入,fclk允许范围为500kHz~1MHz,典型值为640kHz。每通道的转换需66~73个时钟脉冲,大约100~110μs。工作温度范围为-40℃~+85℃。功耗为15mW,输入电压范围为0~5V,单一+5V电源供电。它可以接与Z80、8085、8080、8031等2.ADC0809内部结构和外部引脚ADC0809A/D转换器,其内部结构如图3-4所示。包括一个高阻抗斩波比较器;一个带有256个电阻分压器的树状开关网络;一个逻辑控制环节和8位逐次比较寄存器(SAR);一个8位三态输出缓冲器。引脚功能介绍如下:图3-4图3-4ADC0809内部结构和外部引脚图A、IN0~IN8:8路输入通道的模拟量输入端,输入;B、2-1~2-8:8位数字量输出端;2-1为最低位(LSB),2-8为最高位(MSB),输出,三态;C、ALE:地址锁存控制信号,输入,上升沿有效。将地址选择信号A、B、C锁入地址寄存器;D、START:启动A/D转换控制信号,输入,上升沿有效。当输入一个正脉冲,便立即启动A/D转换,同时使EOC变为低电平;E、EOC:A/D转换结束信号,输出,高电平有效。EOC由低电平变为高电平,表明本次A/D转换已经结束;F、OE:输出允许控制信号,输入,高电平有效。OE由低电平变为高电平,打开三态输出锁存器,将转换的结果输出到数据总线上;G、VREF(-)、VREF(+):片内D/A转换器的参考电压输入端。VREF(-)不能为负值,VREF(+)不能高于VCC,且1/2[VREF(-)+VREF(+)]与1/2VCC之差不得大于;H、CLOCK:时钟输入端。500kHz~1MHz,典型值为640kHz。I、A、B、C:8路模拟开关的3位地址选通输入端,其对应关系如表3-2所示。表3-28路模拟开关地址选通输入端ADC0809时序图如图3-5所示。其中,tWS:最小起动脉宽,典型值为100ns,最大值为200ns;tWE:最小ALE脉宽,典型值为100ns,最大值为200ns;tD:模拟开关延时,典型值为1μs,最大值为μs;tC:转换时间,当fclk=640kHz时,典型值为100μs,最大值为116μs;tEOC:转换结束延时,最大位8个时钟周期加2μs。本系统采用中断连接方式,当传感器获取的信号经过放大器放大和滤波后再AD转换器进行处理。通过对其模拟通道控制线ADDA、ADDB、ADDC的设值可以对通道进行选择。将ADDA、ADDB、ADDC分别接系统地址锁存器提供的末三位地址,只要把三位位地址写入0809中的地址锁存器,就实现了通道的选择。将ADC0809的ALE和START信号连在一起,然后将8051中的P2.7作为片选信号,与8051中的/WR“或非”后接ALE信号,与/RD“或非”后连ADC0809的OE信号,同时将ADC的EOC转换结束信号连接8051的中断口。该模块的原理图如图3-6。图3-5ADC0809时序图图3-6AD转换模块原理图此时启动A/D转换只需一条MOVX指令。例如:MOVDPTR,#0000H;送入0809的口地址,选择IN0通道MOVX@DPTR,A;启动转换转换完成后,将会给8051一个中断,此时只要在中断程序中保存数据即可。3.2.3液晶显示流程本系统的显示部分采用RT1602c字符显示模块,与采用数码管相比,硬件连接和软件调试上都由优势。只要把要显示的内容放进液晶模块的显示存储器里面就可以直观的显示出指定的内容,操作方便。1602采用标准的14脚接口,其中:第1脚:VSS为地电源。第2脚:VDD接5V正电源。第3脚:V0为液晶显示器对比度调整端。第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。第5脚:RW为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。第7~14脚:D0~D7为8位双向数据线。第15~16脚:空脚1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如表3-3所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”表3-31602字符码表它的读写操作、屏幕和光标的操作都是通过指令编程来实现的。(说明:1为高电平、0为低电平),指令表见表3-4。表3-31602字符码表表3-41602字符模块指令表指令1:清显示,指令码01H,光标复位到地址00H位置指令2:光标复位,光标返回到地址00H指令3:光标和显示模式设置I/D:光标移动方向,高电平右移,低电平左移S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效指令4:显示开关控制。D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示C:控制光标的开与关,高电平表示有光标,低电平表示无光标B:控制光标是否闪烁,高电平闪烁,低电平不闪烁指令5:光标或显示移位S/C:高电平时移动显示的文字,低电平时移动光标指令6:功能设置命令DL:高电平时为4位总线,低电平时为8位总线N:低电平时为单行显示,高电平时双行显示F:低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符指令7:字符发生器RAM地址设置指令8:DDRAM地址设置指令9:读忙信号和光标地址BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。指令10:写数据指令11:读数据图3-7液晶显示原理图该模块的硬件原理图如图3-7所示。1602C的数据口接单片机的P0口,使能端E接P2.5,液晶的RS端接P2.3,读写端RW接P2.4,这样使用下面的子程序就可以实现写入命令和数据:RS=1;//置1为写入数据,置0为写入命令RW=0;//读写端置0为写命令,即将命令或数据写入液晶的数据命令寄存器E=1; //P0=l_data;//把数据赋给P0数据口E=0;//在使能端下降沿时将数据写入液晶的存储器delay();//写的过程要有数个延时3.2.4完整的PCB版图本次毕业设计的完整的PCB制版图如下图所示,所制作的PCB是单面板,图3-8所示的三根红线在制作完成的PCB版图中并不存在,需要使用飞线连接起来,这一点大家尤其要注意,否则系统不能正常工作。图3-9不带跳线的PCB图图3-8图3-9不带跳线的PCB图图3-8带有跳线的PCB图

第四章数据采集系统的软件设计4.1汇编和keilc汇编语言是一种用文字助记符来表示机器指令的符号语言,是最接近机器码的一种语言。其主要优点是占用资源少、程序执行效率高。但是不同的CPU,其汇编语言可能有所差异,所以不易移植。对于目前普遍使用的RISC架构的8bitMCU来说,其内部ROM、RAM、STACK等资源都有限,如果使用C语言编写,一条C语言指令编译后,会变成很多条机器码,很容易出现ROM空间不够、堆栈溢出等问题。而且一些单片机厂家也不一定能提供C编译器。而汇编语言,一条指令就对应一个机器码,每一步执行什么动作都很清楚,并且程序大小和堆栈调用情况都容易控制,调试起来也比较方便。所以在资源较少单片机开发中,建议采用汇编语言比较好。C语言是一种编译型程序设计语言,它兼顾了多种高级语言的特点,并具备汇编语言的功能。C语言有功能丰富的库函数、运算速度快、编译效率高、有良好的可移植性,而且可以直接实现对系统硬件的控制。C语言是一种结构化程序设计语言,它支持当前程序设计中广泛采用的由顶向下结构化程序设计技术。此外,C语言程序具有完善的模块程序结构,从而为软件开发中采用模块化程序设计方法提供了有力的保障。因此,使用C语言进行程序设计已成为软件开发的一个主流。用C语言来编写目标系统软件,会大大缩短开发周期,且明显地增加软件的可读性,便于改进和扩充,从而研制出规模更大、性能更完备的系统,用C语言进行单片机程序设计是单片机开发与应用的必然趋势。所以作为一个技术全面并涉足较大规模的软件系统开发的单片机开发人员最好能够掌握基本的C语言编程。使用C语言肯定要使用到C编译器,以便把写好的C程序编译为机器码,这样单片机才能执行编写好的程序。KEILuVISION2是众多单片机应用开发软件中优秀的软件之一,它支持众多不同公司的MCS51架构的芯片,它集编辑,编译,仿真等于一体,同时还支持,PLM,汇编和C语言的程序设计,它的界面和常用的微软VC++的界面相似,界面友好,易学易用,在调试程序,软件仿真方面也有很强大的功能。因此本系统采用KEILuVISION2进行软件的编写和调试。4.2KeilC51vsANSIC(标准C)下面将介绍KeilC的主要特点和它与ANSIC的不同之处。Keil编译器除了少数一些关键地方外基本类似于ANSIC。差异主要是Keil可以让户针对8051的结构进行程序设计,其它差异主要是8051的一些局限引起的。深入理解并应用C51对标准ANSIC的扩展是学习C51的关键之一。因为大多数扩展功能都是直接针对8051系列CPU硬件的。大致有以下几点:(1)8051存储类型及存储区域,(2)变量类型声明与位变量与位寻址,(3)特殊功能寄存器(SFR),(4)C51指针与函数属性,具体说明如下。4.2.1内存区域(MemoryAreas):1.PragramArea:由Code说明可有多达64kBytes的程序存储器2.InternalDataMemory:内部数据存储器可用以下关键字说明:data:直接寻址区,为内部RAM的低128字节00H~7FHidata:间接寻址区,包括整个内部RAM区00H~FFHbdata:可位寻址区,20H~2FH3.ExternalDataMemory外部RAM视使用情况可由以下关键字标识:xdata:可指定多达64KB的外部直接寻址区,地址范围0000H~0FFFFHpdata:能访问1页(25bBytes)的外部RAM,主要用于紧凑模式(CompactModel)。4.SpeciacFunctionRegisterMemory8051提供128Bytes的SFR寻址区,这区域可位寻址、字节寻址或字寻址,用以控制定时器、计数器、串口、I/O及其它部件,可由以下几种关键字说明:sfr:字节寻址比如sfrP0=0x80;为PO口地址为80H,“=”后H~FFH之间的常数。sfr16:字寻址,如sfr16T2=0xcc;指定Timer2口地址T2L=0xccT2H=0xCDsbit:位寻址,如sbitEA=0xAF;指定第0xAF位为EA,即中断允许还可以有如下定义方法:sbit0V=PSW^2;(定义0V为PSW的第2位)sbit0V=0XDO^2;(同上)或bit0V-=0xD2(同上)。4.2.2变量或数据类型C51提供以下几种扩展数据类型:bit位变量值为0或1sbit从字节中定义的位变量0或1sfrsfr字节地址0~255sfr16sfr字地址0~65535其余数据类型如:char,enum,short,int,long,float等与ANSIC相同。1.bit位标量bit位标量是C51编译器的一种扩充数据类型,利用它可定义一个位标量,但不能定义位指针,也不能定义位数组。它的值是一个二进制位,不是0就是1,类似一些高级语言中的Boolean类型中的True和False。bit型变量可用变量类型,函数声明、函数返回值等,存贮于内部RAM20H~2FH。注意:(1)用#pragmadisable说明函数和用“usign”指定的函数,不能返回bit值。(2)一个bit变量不能声明为指针,如bit*ptr;是错误的(3)不能有bit数组如:bitarr[5];错误。可位寻址区说明20H-2FH,可作如下定义:intbdatai;charbdataarr[3],然后:sbitbito=in0;sbitbit15=I^15;sbitarr07=arr[0]^7;sbitarr15=arr[i]^7;2.sbit可录址位sbit同位是C51中的一种扩充数据类型,利用它可以访问芯片内部的RAM中的可寻址位或特殊功能寄存器中的可寻址位。如先前我们定义了sfrP1=0x90;//因P1端口的寄存器是可位寻址的,所以我们可以定义//同样我们可以用P1.1的地址去写,如sbitP1_1=0x91;这样我们在以后的程序语句中就可以用P1_1来对P1.1引脚进行读写操作了。通常这些可以直接使用系统提供的预处理文件,里面已定义好各特殊功能寄存器的简单名字,直接引用可以省去一点时间。3.sfr特殊功能寄存器sfr也是一种扩充数据类型,点用一个内存单元,值域为0~255。利用它可以访问51单片机内部的所有特殊功能寄存器。如用sfrP1=0x90这一句定P1为P1端口在片内的寄存器,在后面的语句中我们用以用P1=255(对P1端口的所有引脚置高电平)之类的语句来操作特殊功能寄存器。4.sfr1616位特殊功能寄存器sfr16占用两个内存单元,值域为0~65535。sfr16和sfr一样用于操作特殊功能寄存器,所不同的是它用于操作占两个字节的寄存器,好定时器T0和T1。4.2.3存储类型声明和存储模式说明了一个变量的数据类型后,还可选择说明该变量的存储器类型。存储器类型的说明就是指定该变量在C51硬件系统中所使用的存储区域,并在编译时准确的定位。变量或参数的存储类型可由存储模式指定缺省类型,也可由关键字直接声明指定。各类型分别用:code,data,idata,xdata,pdata说明:data--直接访问内部数据存储器(128字节),访问速度最快;bdata--可位寻址内部数据存储器(16字节),允许位与字节混合访问;idata--间接访问内部数据存储器(256字节),允许访问全部内部地址;pdata--分页访问外部数据存储器(256字节),用MOVX@Ri指令访问;xdata--外部数据存储器(64KB),用MOVX@DPTR指令访问;code--程序存储器(64KB),用MOVC@A+DPTR指令访问。datauar1charcodearray[]=“hello!”;unsignedcharxdataarr[10][4][4];如果省略存储器类型,系统则会按编译模式SMALL,COMPACT或LARGE所规定的默认存储器类型去指定变量的存储区域。无论什么存储模式都可以声明变量在任何的8051存储区范围,然而把最常用的命令如循环计数器和队列索引放在内部数据区可以显著的提高系统性能。还有要指出的就是变量的存储种类与存储器类型是完全无关的。SMALL存储模式把所有函数变量和局部数据段放在8051系统的内部数据存储区这使访问数据非常快,但SMALL存储模式的地址空间受限。在写小型的应用程序时,变量和数据放在data内部数据存储器中是很好的因为访问速度快,但在较大的应用程序中data区最好只存放小的变量、数据或常用的变量(如循环计数、数据索引),而大的数据则放置在别的存储区域。COMPACT存储模式中所有的函数和程序变量和局部数据段定位在8051系统的外部数据存储区。外部数据存储区可有最多256字节(一页),在本模式中外部数据存储区的短地址用@R0/R1。LARGE存储模式所有函数和过程的变量和局部数据段都定位在8051系统的外部数据区外部数据区最多可有64KB,这要求用DPTR数据指针访问数据。之前提到简单提到sfr,sfr16,sbit定义变量的方法,下面我们再来仔细看看。sfr和sfr16可以直接对51单片机的特殊寄存器进行定义,定义方法如下:sfr特殊功能寄存器名=特殊功能寄存器地址常数;sfr16特殊功能寄存器名=特殊功能寄存器地址常数;我们可以这样定义AT89C51的P1口:sfrP1=0x90;//定义P1I/O口,其地址90Hsfr关键定后面是一个要定义的名字,可任意选取,但要符合标识符的命名规则,名字最好有一定的含义如P1口可以用P1为名,这样程序会变的好读好多。等号后面必须是常数,不允许有带运算符的表达式,而且该常数必须在特殊功能寄存器的地址范围之内(80H-FFH),具体可查看附录中的相关表。sfr是定义8位的特殊功能寄存器而sfr16则是用来定义16位特殊功能寄存器,如8052的T2定时器,可以定义为:sfr16T2=0xCC;//这里定义8052定时器2,地址为T2L=CCH,T2H=CDH用sfr16定义16位特殊功能寄存器时,等号后面是它的低位地址,高位地址一定要位于物理低位地址之上。注意的是不能用于定时器0和1的定义。sbit可定义可位寻址对象。如访问特殊功能寄存器中的某位。其实这样应用是经常要用的如要访问P1口中的第2个引脚P1.1。我们可以照以下的方法去定义:(1)sbit位变量名=位地址sbitP1_1=Ox91;这样是把位的绝对地址赋给位变量。同sfr一样sbit的位地址必须位于80H-FFH之间。(2)Sbit位变量名=特殊功能寄存器名^位位置sftP1=0x90;sbitP1_1=P1^1;//先定义一个特殊功能寄存器名再指定位变量名所在的位置,当可寻址位位于特殊功能寄存器中时可采用这种方法。(3)sbit位变量名=字节地址^位位置sbitP1_1=0x90^1;这种方法其实和2是一样的,只是把特殊功能寄存器的位址直接用常数表示。在C51存储器类型中提供有一个bdata的存储器类型,这个是指可位寻址的数据存储器,位于单片机的可位寻址区中,可以将要求可位录址的数据定义为bdata,如:unsignedcharbdataib;//在可位录址区定义ucsignedchar类型的变量ibintbdataab[2];//在可位寻址区定义数组ab[2],这些也称为可寻址位对象sbitib7=ib^7//用关键字sbit定义位变量来独立访问可寻址位对象的其中一位sbitab12=ab[1]^12;操作符"^"后面的位位置的最大值取决于指定的基址类型,char0-7,int0-15,long0-31。4.2.4KeilC51指针C51支持一般指针(GenericPointer)和存储器指针(Memory_SpecificPointer)。1.一般指针一般指针的声明和使用均与标准C相同,不过同时还可以说明指针的存储类型,例如:long*state;为一个指向long型整数的指针,而state本身则依存储模式存放。char*xdataptr;ptr为一个指向char数据的指针,而ptr本身放于外部RAM区,以上的long,char等指针指向的数据可存放于任何存储器中。一般指针本身用3个字节存放,分别为存储器类型,高位偏移,低位偏移量。2.存储器指针基于存储器的指针说明时即指定了存贮类型,例如:chardata*str;str指向data区中char型数据intxdata*pow;pow指向外部RAM的int型整数。这种指针存放时,只需一个字节或2个字节就够了,因为只需存放偏移量。3.指针转换即指针在上两种类型之间转化:·当基于存储器的指针作为一个实参传递给需要一般指针的函数时,指针自动转化。·如果不说明外部函数原形,基于存储器的指针自动转化为一般指针,导致错误,因而请用“#include”说明所有函数原形。·可以强行改变指针类型。4.2.5KeilC51函数C51函数声明对ANSIC作了扩展,具体包括:1.中断函数声明中断声明方法如下:voidserial_ISR()interrupt4[using1]{/*ISR*/}为提高代码的容错能力,在没用到的中断入口处生成iret语句,定义没用到的中断。/*definenotusedinterrupt,sogenerate"IRET"intheirentrance*/voidextern0_ISR()interrupt0{}/*notused*/voidtimer0_ISR()interrupt1{}/*notused*/voidextern1_ISR()interrupt2{}/*notused*/voidtimer1_ISR()interrupt3{}/*notused*/voidserial_ISR()interrupt4{}/*notused*/2.通用存储工作区3.选通用存储工作区由usingx声明4.指定存储模式由smallcompact及large说明,例如:voidfun1(void)small{}提示:small说明的函数内部变量全部使用内部RAM。关键的经常性的耗时的地方可以这样声明,以提高运行速度。5.#pragmadisable在函数前声明,只对一个函数有效。该函数调用过程中将不可被中断。6.递归或可重入函数指定在主程序和中断中都可调用的函数,容易产生问题。因为51和PC不同,PC使用堆栈传递参数,且静态变量以外的内部变量都在堆栈中;而51一般使用寄存器传递参数,内部变量一般在RAM中,函数重入时会破坏上次调用的数据。可以用以下两种方法解决函数重入:a、在相应的函数前使用前述“#pragmadisable”声明,即只允许主程序或中断之一调用该函数;b、将该函数说明为可重入的。如下:voidfunc(param...)reentrant;KeilC51编译后将生成一个可重入变量堆栈,然后就可以模拟通过堆栈传递变量的方法。由于一般可重入函数由主程序和中断调用,所以通常中断使用与主程序不同的R寄存器组。另外,对可重入函数,在相应的函数前面加上开关“#pragmanoaregs”,以禁止编译器使用绝对寄存器寻址,可生成不依赖于寄存器组的代码。7.指定PL/M-51函数由alien指定。4.2.6中断服务8051的中断系统十分重要,C51使你能够用C来声明中断和编写中断服务程序(当然你也可以用汇编来写)。中断过程通过使用interrupt关键字和中断号(0到31)来实现,中断号告述编译器中断程序的入口地址。中断号对应着IE寄存器中的使能位,换句话说,IE寄存器中的0位对应着外部中断0相应的外部中断0的中断号是0。下表反映了这种关系。IE寄存器中的使能位和C中的中断号中断源0外部中断01定时器0溢出2外部中断13定时器1溢出4串行口中断5定时器2溢出一个中断过程并不一定带上所有参数,可以没有返回值。有了这些限制,编译器不须要担心寄存器组参数的使用和对累加器,状态寄存器,B寄存器,数据指针和默认的寄存器的保护,只要他们在中断程序中被用到,编译的时候会把他们入栈,在中断程序结束时将他们恢复。中断程序的入口地址被编译器放在中断向量中。C51支持所有5个8051/8052标准中断从0到4和在8051系列中多达27个中断源。一个中断服务程序的例子如下:1 #include<reg51.h>2 #include<stdio.h>34 #defineRELOADVALH0x3C5 #defineRELOADVALL0xB067 externunsignedinttick_count;89 voidtimer0(void)interrupt1{10 TR0=0;//停止定时器011 TH0=RELOADVALH;//50ms后溢出12 TL0=RELOADVALL;13 TR0=1;//启动T014 tick_count++;//时间计数器加115 printf("tick_count=%05u\n",tick_count);16 }当指定中断程序的工作寄存器组时,保护工作寄存器的工作就可以被省略。使用关键字using,后跟一个0到3的数对应着4组工作寄存器。当指定工作寄存器组的时候,默认的工作寄存器组就不会被推入堆栈,这将节省32个处理周期,因为入栈和出栈都需要2个处理周期。为中断程序指定工作寄存器组的缺点是,所有被中断调用的过程都必须使用同一个寄存器组,否则参数传递会发生错误。下面的例子给出了定时器0的中断服务程序,但我已经告述编译器使用寄存器组0:1 #include<reg51.h>2 #include<stdio.h>34 #defineRELOADVALH0x3C5 #defineRELOADVALL0xB067 externunsignedinttick_count;89 voidtimer0(void)interrupt1using0{10 TR0=0;//停止定时器011 TH0=RELOADVALH;//设置溢出时间为50ms12 TL0=RELOADVALL;13 TR0=1;//启动T014 tick_count++;//时间计数器加115 printf("tick_count=%05u\n",tick_count);16 }4.3使用KeilC时应做的和应该避免的Keil编译器能从你的C程序源代码中产生高度优化的代码,但你可以帮助编译器产生更好的代码,下面将讨论这方面的一些问题。4.3.1采用短变量一个提高代码效率的最基本的方式就是减小变量的长度。使用C编程时我们都习惯于对循环控制变量使用int类型,这对8位的单片机来说是一种极大的浪费。你应该仔细考虑你所声明的变量值可能的范围,然后选择合适的变量类型。很明显经常使用的变量应该是unsignedchar只占用一个字节。4.3.2使用无符号类型为什么要使用无符号类型呢,原因是8051不支持符号运算,程序中也不要使用含有带符号变量的外部代码。除了根据变量长度来选择变量类型以外,你还要考虑是否变量是否会用于负数的场合。如果你的程序中可以不需要负数,那么把变量都定义成无符号类型的。4.3.3避免使用浮点指针在8位操作系统上使用32位浮点数是得不偿失的,你可以这样做,但会浪费大量的时间。所以当你要在系统中使用浮点数的时候,你要问问自己这是否一定需要。可以通过提高数值数量级和使用整型运算来消除浮点指针。处理ints和longs比处理doubles和floats要方便得多,你的代码执行起来会更快,也不用连接处理浮点指针的模块。如果你一定要采用浮点指针的话,你应该采用西门子80517和达拉斯半导体公司的80320这些已经对数处理进行过优化的单片机。如果你不得不在你的代码中加入浮点指针,那么你的代码长度会增加,程序执行速度也会比较慢。如果浮点指针运算能被中断的话,你必须确保要么中断中不会使用浮点指针运算,要么在中断程序前使用fpsave指令把中断指针推入堆栈,在中断程序执行后使用fprestore指令把指针恢复。还有一种方法是,当你要使用像sin()这样的浮点运算程序时,禁止使用中断,在运算程序执行完之后再使能它。4.3.4使用位变量对于某些标志位,应使用位变量而不是unsignedchar。这将节省你的内存,你不用多浪费7位存储区。而且位变量在RAM中,访问他们只需要一个处理周期。4.3.5用局部变量代替全局变量把变量定义成局部变量比全局变量更有效率。编译器为局部变量在内部存储区中分配存储空间,而为全局变量在外部存储区中分配存储空间,这会降低你的访问速度。另一个避免使用全局变量的原因是你必须在你系统的处理过程中调节使用全局变量。因为在中断系统和多任务系统中,不止一个过程会使用全局变量。4.3.6为变量分配内部存储区局部变量和全局变量可被定义在你想要的存储区中。根据先前的讨论,当你把经常使用的变量放在内部RAM中时,可使你的程序的速度得到提高,除此之外,你还缩短了你的代码,因为外部存储区寻址的指令相对要麻烦一些。考虑到存储速度,按下面的顺序使用存储器:DATA,IDATA,PDATA,XDATA,当然你要记得留出足够的堆栈空间。4.3.7使用特定指针当你在程序中使用指针时,你应指定指针的类型,确定它们指向哪个区域,如XDATA或CODE区。这样你的代码会更加紧凑,因为编译器不必去确定指针所指向的存储区,因为你已经进行了说明。4.3.8使用调令对于一些简单的操作如变量循环位移,编译器提供了一些调令供用户使用,许多调令直接对应着汇编指令,而另外一些比较复杂并兼容ANSI。所有这些调令都是再入函数,你可在任何地方安全的调用他们。和单字节循环位移指令RLA和RRA相对应的调令是_crol_循环左移和_cror_(循环右移),如果你想对int或long类型的变量进行循环位移,调令将更加复杂而且执行的时间会更长。对于int类型调令为_irol_,_iror_,对于long类型调令为_lrol_,_lror_。在C中也提供了像汇编中JBC指令那样的调令_testbit_。如果参数位置位他将返回1,否则将返回0。这条调令在检查标志位时十分有用,而且使C的代码更具有可读性。调令将直接转换成JBC指令。4.3.9使用宏替代函数对于小段代码,像使能某些电路或从锁存器中读取数据,你可通过使用宏来替代函数,使得程序有更好的可读性。你可把代码定义在宏中,这样看上去更像函数。编译器在碰到宏时,按照事先定义的代码去替代宏。宏的名字应能够描述宏的操作。当需要改变宏时,你只要修该宏定义处。宏能够使得访问多层结构和数组更加容易。可以用宏来替代程序中经常使用的复杂语句以减少你打字的工作量,且有更好的可读性和可维护性。4.4C51的编程规范1.注释(1)采用中文;(2)开始的注释:文件(模块)注释内容:公司名称、版权、作者名称、修改时间、模块功能、背景介绍等,复杂的算法需要加上流程说明;比如:/*********************************************************************//*公司名称:*//*模块名:LCD模块LCD型号:HD44780*//*创建人:zhaojunjie日期:2001-06-08*//*修改人:日期:2001-06-08*//*功能描述:*//*其他说明:*//*版本:/**********************************************************************/函数开头的注释内容:函数名称、功能、说明输入、返回、函数描述、流程处理、全局变量、调用样例等,复杂的函数需要加上变量用途说明;/***********************************************************************函数名:v_LcdInit*功能描述:LCD初始化*函数说明:初始化命令:0x3c,0x08,0x01,0x06,0x10,0x0c*调用函数:v_Delaymsec(),v_LcdCmd()*全局变量:*输入:无*返回:无*设计者:zhao日期:2005-6-30*修改者:zhao日期:2005-6-30*版本:***********************************************************************/(3)程序中的注释内容:修改时间和作者、方便理解的注释等。注释内容应简炼、清楚、明了,一目了然的语句不加注释。2.命名:命名必须具有一定的实际意义。(1)常量的命名:全部用大写。(2)变量的命名:变量名加前缀,前缀反映变量的数据类型,用小写,反映变量意义的第一个字母大写,其他小写。其中变量数据类型:unsignedchar前缀ucsignedchar前缀scunsignedint前缀uisignedint前缀siunsignedlong前缀ulsignedlong前缀slbit前缀b指针前缀p例:ucReceivData接收数据(3)结构体命名:(4)函数的命名:函数名首字大写,若包含有两个单词的每个单词首字母大写。函数原型说明包括:引用外来函数及内部函数,外部引用必须在右侧注明函数来源:模块名及文件名,内部函数,只要注释其定义文件名;3.编辑风格(1)缩进:缩进以Tab为单位,一个Tab为四个空格大小。预处理语句、全局数据、函数原型、标题、附加说明、函数说明、标号等均顶格书写。语句块的“{”“}”配对对齐,并与其前一行对齐;(2)空格:数据和函数在其类型,修饰名称之间适当空格并据情况对齐。关键字原则上空一格,如:if(...)等,运算符的空格规定如下:“->”、“[”、“]”、“++”、“--”、“~”、“!”、“+”、“-”(指正负号),“&”(取址或引用)、“*”(指使用指针时)等几个运算符两边不空格(其中单目运算符系指与操作数相连的一边),其它运算符(包括大多数二目运算符和三目运算符“?:”两边均空一格,“(”、“)”运算符在其内侧空一格,在作函数定义时还可据情况多空或不空格来对齐,但在函数实现时可以不用。“,”运算符只在其后空一格,需对齐时也可不空或多空格,对语句行后加的注释应用适当空格与语句隔开并尽可能对齐。(3)对齐:原则上关系密切的行应对齐,对齐包括类型、修饰、名称、参数等各部分对齐。另每一行的长度不应超过屏幕太多,必要时适当换行,换行时尽可能在“,”处或运算符处,换行后最好以运算符打头,并且以下各行均以该语句首行缩进,但该语句仍以首行的缩进为准,即如其下一行为“{”应与首行对齐。(4)空行:程序文件结构各部分之间空两行,若不必要也可只空一行,各函数实现之间一般空两行。(5)修改:版本封存以后的修改一定要将老语句用/**/封闭,不能自行删除或修改,并要在文件及函数的修改记录中加以记录。(6)形参:在定义函数时,在函数名后面括号中直接进行形式参数说明,不再另行说明。4.5keilc软件使用方法KeilC51软件是众多单片机应用开发的优秀软件之一,它集编辑,编译,仿真于一体,支持汇编,PLM语言和C语言的程序设计,界面友好,易学易用。下面介绍KeilC51软件的使用方法。进入KeilC51后,屏幕如图4-1所示。几秒钟后出现图4-2所示的编辑界面。图4-1启动KeilC51时的屏幕图4-2进入KeilC51后的编辑界面学习程序设计语言、学习某种程序软件,最好的方法是直接操作实践。下面通过简单的编程、调试,引导大家学习KeilC51软件的基本使用方法和基本的调试技巧。(1)建立一个新工程单击Project菜单,在弹出的下拉菜单中选中NewProject选项如图4-3所示。图4-3(2)然后选择你要保存的路径,输入工程文件的名字,比如保存到C51目录里,工程文件的名字为C51如图4-4所示,然后点击保存。图4-4(3)这时会弹出一个对话框,要求你选择单片机的型号,你可以根据你使用的单片机来选择,keilc51几乎支持所有的51核的单片机,我这里还是以大家用的比较多的Atmel的89C51来说明,如图4-5所示,选择89C51之后,右边栏是对这个单片机的基本的说明,然后点击确定。图4-5(4)完成上一步骤后,屏幕如图4-6所示。图4-6到现在为止,我们还没有编写一句程序,下面开始编写我们的第一个程序。(5)在图4-7中,单击“File”菜单,再在下拉菜单中单击“New”选项。图4-7新建文件后屏幕如图4-8所示。图4-8此时光标在编辑窗口里闪烁,这时可以键入用户的应用程序了,但笔者建议首先

温馨提示

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

评论

0/150

提交评论