单片机C语言简明教程(吴加国20140104).doc_第1页
单片机C语言简明教程(吴加国20140104).doc_第2页
单片机C语言简明教程(吴加国20140104).doc_第3页
单片机C语言简明教程(吴加国20140104).doc_第4页
单片机C语言简明教程(吴加国20140104).doc_第5页
已阅读5页,还剩67页未读 继续免费阅读

下载本文档

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

文档简介

单片机C51程序设计简明教程单片机C51程序设计简明教程温州职业技术学院 吴加国 编著二一四年一月目 录第1章单片机C语言开发环境的建立11.1C51语言的特点及其程序结构11.2单片机C语言开发环境的建立6习题一24第2章C51数据类型与运算252.1C51数据类型252.2C51数据存储类型252.3C51定义SFR(特殊功能寄存器)272.4C51定义并行口272.5C51定义位变量282.6C51运算符、表达式及其规则28习题二31第3章C51流程控制语句323.1选择语句323.2循环语句34习题三37第4章C51构造数据类型384.1数组384.2指针394.3结构体(struct)404.4共用体(union)424.5枚举(enum)44习题四45第5章C51函数475.1函数的定义与分类475.2函数的调用475.3函数的嵌套调用与递归调用485.4指向函数的指针变量495.5C51的库函数50习题五52第6章C51应用编程536.151系列单片机内部资源编程536.251系列单片机扩展资源编程546.351系列单片机接口技术资源编程55习题六60第7章项目开发实例电子钟的设计617.1功能要求617.2方案论证617.3系统硬件电路设计617.4系统程序设计637.5调试及性能分析647.6控制源程序清单64习题七68第1章 单片机C语言开发环境的建立1.1 C51语言的特点及其程序结构C语言是一种通用的计算机程序设计语言,在国际上十分流行,它既可以用来编写计算机的系统程序,也可以用来编写一般的应用程序。C51是在51系列单片机上使用的C语言。C51程序结构与一般的C语言没有什么差别。一个C51程序大体上是一个函数定义的集合,在这个集合中仅有一个名为main的函数(主函数)。主函数是程序的入口,主函数中的所有语句执行完毕,则程序执行结束。C51中使用的编译器(开发环境)有多种,而Keil C51是其中的佼佼者; Keil C51完全支持C的标准指令,并有很多用来优化8051指令结构的C的扩展指令。本课程也采用它来进行教学。1.1.1 C51的特点1和汇编语言相比,对处理器的指令集不必了解,8051CPU的基本结构可以了解,但不是必须的。2寄存器的分配以及各种变量和数据的寻址由编译器完成。3程序拥有了正式的结构(C语言带来的),并且能被分成多个单独的子函数。这使整个应用系统的结构变得清晰,同时让源代码变得可重复使用。4具有选择特定操作符来操作变量的能力,提高了源代码的可读性。5可以运用和人的思维接近的词汇和算法表达式。6编写程序和调试程序的时间得到了很大程度的缩短。由于程序的模快结构技术,使得现有的程序段可以很容易的包含到新的程序中去。1.1.2 C51的程序结构C51程序结构与一般C语言没有什么区别。一个C51程序大体上是一个函数定义的集合,在这个集合中仅有一个名为main的函数(主函数)。主函数是程序的入口,主函数中的所有语句执行完毕,则程序执行结束。 C51程序结构一般如下所示:1.1.3 简单的C51程序介绍例1.1 让接在P1.0引脚上的LED发光。程序如下:#includesbit P1_0=P10;void main()P1_0=0;程序分析:这个程序的作用是让接在P1.0引脚上的LED发亮。下面来分析一下这个C51程序所包含的信息。1. “文件包含”处理程序的第一行是一个“文件包含”处理。所谓“文件包含”是指一个文件将另一个文件的内容全部包含进来。这个程序看起来只有短短的4行,但C51编译器在处理这段程序时却要处理几十行。这段程序包含reg51.h文件的目的是为了要使用P1这个符号,即通知C编译器,程序中的P1是指8051单片机的P1端口而不是其他。这是如何做到的呢?让我们打开reg51.h文件看看究竟如何?/*-REG51.HHeader file for generic 80C51 and 80C31 microcontroller.Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.All rights reserved.-*/#ifndef _REG51_H_#define _REG51_H_/* BYTE Register */sfr P0 = 0x80;sfr P1 = 0x90;sfr P2 = 0xA0;sfr P3 = 0xB0;sfr PSW = 0xD0;sfr ACC = 0xE0;sfr B = 0xF0;sfr SP = 0x81;sfr DPL = 0x82;sfr DPH = 0x83;sfr PCON = 0x87;sfr TCON = 0x88;sfr TMOD = 0x89;sfr TL0 = 0x8A;sfr TL1 = 0x8B;sfr TH0 = 0x8C;sfr TH1 = 0x8D;sfr IE = 0xA8;sfr IP = 0xB8;sfr SCON = 0x98;sfr SBUF = 0x99;/* BIT Register */* PSW */sbit CY = 0xD7;sbit AC = 0xD6;sbit F0 = 0xD5;sbit RS1 = 0xD4;sbit RS0 = 0xD3;sbit OV = 0xD2;sbit P = 0xD0;/* TCON */sbit TF1 = 0x8F;sbit TR1 = 0x8E;sbit TF0 = 0x8D;sbit TR0 = 0x8C;sbit IE1 = 0x8B;sbit IT1 = 0x8A;sbit IE0 = 0x89;sbit IT0 = 0x88;/* IE */sbit EA = 0xAF;sbit ES = 0xAC;sbit ET1 = 0xAB;sbit EX1 = 0xAA;sbit ET0 = 0xA9;sbit EX0 = 0xA8;/* IP */ sbit PS = 0xBC;sbit PT1 = 0xBB;sbit PX1 = 0xBA;sbit PT0 = 0xB9;sbit PX0 = 0xB8;/* P3 */sbit RD = 0xB7;sbit WR = 0xB6;sbit T1 = 0xB5;sbit T0 = 0xB4;sbit INT1 = 0xB3;sbit INT0 = 0xB2;sbit TXD = 0xB1;sbit RXD = 0xB0;/* SCON */sbit SM0 = 0x9F;sbit SM1 = 0x9E;sbit SM2 = 0x9D;sbit REN = 0x9C;sbit TB8 = 0x9B;sbit RB8 = 0x9A;sbit TI = 0x99;sbit RI = 0x98;#endif我们学过8051单片机的硬件,知道reg51.h文件中都是一些符号的定义,即规定符号名与地址的对应关系。其中有这样一行:sfr P1 = 0x90;即定义P1与地址0x90对应,P1口的地址就是0x90( 0x90是C语言中十六进制的写法,相当于汇编语言中的90H)。从中还可以看到一个频繁出现的词: sfr这是Keil C51编译器为了能够直接访问8051中的SFR所提供的一个关键词,其用法:sfr 变量名=地址值;例如:sfr P1 = 0x90;2. 符号P1_0用来表示P1.0引脚在C语言中,如果直接写P1.0,C编译器不能识别,而且P1.0也不是一个合法的C语言标识符,所以得给它另起一个名。这里起的名为P1_0,但P1_0是否就是P1.0呢?即使你认为是,但C编译器并不这么认为,所以必须给它们之间建立联系。这里使用了Keil C51增加的关键字sbit来定义。sbit的用法有3种: sbit 位变量名=地址值; sbit 位变量名=SFR名称变量位地址值; sbit 位变量名=SFR地址值变量位地址值。例如,定义PSW中的OV可以用以下3种方法: sbit OV=0xd2; 0xd2是OV的位地址值; sbit OV=PSW2;PSW必须先用sfr定义好; sbit 位变量名=0xD02;0xD0就是PSW的地址值。因此这里用“sbit P1_0=P10;”,即用符号P1_0来表示P1.0引脚。如果愿意,也可以用P10之类的名字,只要下面程序中也随之更改。3. 主函数main每一个C语言程序有且只有一个主函数,函数后面一定有一对大括号“”,在大括号里面书写其他程序。通过上面的分析了解到部分C语言的特性,下面再来看一个稍微复杂一点的例子。例1.2让接在P1.0引脚上的LED闪烁发光。#include”reg51.h”#define uchar unsigned char#define uint unsigned intsbit P1_0=P10;/*延时程序,有Delay参数确定延迟时间*/void mDelay(uint Delay)uint i;for(;Delay0;Delay-)for(i=0;i124;i+);void main()for(;)P1_0=!P1_0;/取反P1.0引脚mDelay(1000);程序分析:现对例1.2程序中的main函数进行分析。第2行程序是“P1_0=!P1_0;”,在P1_0前面有一个符号“!”。符号“!”是C语言的一个运算符,就像数学中的“+”、“-”一样,意义是“取反”,即将该符号后面的那个变量的值取反(变量本身不变)。第1行程序是“for(;)”。这是一个循环语句,它同其后的一对大括号“”构成了一个无限循环语句,一旦程序开始运行,该大括号内的语句会被反复执行,直到断电为止。第3行程序是“mDelay(1000);”,其用途是延时1s时间。由于单片机执行指令的速度很快,如果不进行延时,LED亮之后马上就灭,灭了之后马上就亮,亮、灭之间的间隔时间非常短,人眼根本无法分辨,看到的效果不是闪烁,而是常亮。这里的mDelay(1000)并不是由Keil C51提供的库函数,而是用户自定义函数,有关自定义函数的内容以后介绍。1.1.4 C51程序特性的分析1 C语言是由函数构成的。一个C源程序至少包含一个函数(main),也可以包含一个main函数和若干其他函数。因此,函数是C程序的基本单位。被调用的函数可以是编译器提供的库函数,也可以是用户根据需要自己编制设计的函数。2 一个C语言程序总是从main函数开始执行的,而不管物理位置上这个main()放在什么地方,如例1.2中就放在了最后。3 C语言区分大小写。程序中的mDelay如果写成mdelay就会产生编译错误。4 C程序书写自由,一行内可以写几个语句,一个语句可以分写在多行上。C程序无行号。但为了程序的可读性,建议大家按一定的规范来编写。5 每个语句和数据定义的最后必须有一个分号。分号是C语句的必要组成部分。分号不可少,即使是程序中最后一个语句也应包含分号。6 可以用“/*/”对C程序中的任何部分作注释。一个好的、有使用价值的源程序都应当加上必要的注释,以增加程序的可读性。例如: /*延时程序,有Delay参数确定延迟时间*/ 特别地, Keil C51也支持C+风格的注释,可用“/”引导的语句是注释,例如: P1_0=!P1_0; /取反P1.0引脚“/*/”符号之间内容为注释,可以跨行有效;“/”符号之后内容为注释,跨行无效。1.2 单片机C语言开发环境的建立1.2.1 单片机应用系统的研制步骤和方法单片机的应用系统随其用途不同,其硬件和软件均不相同。单片机最初的选型很重要,原则上是选择高性价比的单片机。硬件软件化是提供高系统性价比的有效方法,尽量减少硬件成本,多用软件实现相同的功能,这样也可以大大提高系统的可靠性。虽然单片机的硬件选型不尽相同,软件编写也千差万别,但系统的研制步骤和方法是基本一致的,一般都分为总体设计、硬件电路的构思设计、软件的编制和仿真调试几个阶段。单片机应用系统的研制流程如图1-1所示。图1-1 单片机应用系统的研制流程1. 总体设计1) 确立功能特性指标不管是工程控制系统还是智能仪器仪表,都必须首先分析和了解项目的总体要求、输入信号的类型和数量、输出控制的对象及数量、辅助外设的种类及要求、使用的环境及工作电源要求、产品的成本、可靠性要求和可维护性及经济效益等因素,必要时可参考同类产品的技术资料,制定出可行的性能指标。2) 单片机的选型单片机的选型很重要,选择时需考虑其功能是否全部满足规定的要求,例如控制速度、精度、控制端口的数量、驱动外设的能力、存储器的大小、软件编写的难易程度、开发工具的支持程度等。再如要驱动LED显示器,可选用多端口的单片机直接驱动,还可以利用少端口的单片机加扩展电路构成,这就要具体分析选用何种器件有利于降低成本、电路易于制作、软件便于编写等因素。如果要求驱动显示器LCD,也可选用具有直接驱动LCD的单片机,也可使用加外接驱动芯片的办法,这就要求在应用时具体问题具体分析。3) 软件的编写和支持工具对于不同的单片机,甚至同一公司的单片机,它们的开发工具不一定相同或不完全相同。这就要求在选择单片机时,需考虑开发工具的因素,原则上是以最少的开发投资满足某一项目的研制过程,最好使用现有的开发工具或增加少量的辅助器材就可达到目的。当然,开发工具是一次性投资,而形成产品却是长远的效益,这就需要平衡产品和开发工具的经济性和效益性。2. 硬件系统根据总体设计中确立的功能特性要求,确定单片机的型号、所需外围扩展芯片、存储器、I/O电路、驱动电路,可能还有A/D和D/A转换电路以及其它模拟电路,设计出应用系统的电路原理图。1) 程序存储器随着微电子技术的发展,现在可用作程序存储器的类型相当多,各大半导体公司都推出了一系列程序存储器,像EPROM、EEPROM、Flash EEPROM以及OTP ROM等。这些存储器各有特点,互有所长。现在的单片机普遍都带有程序存储器,容量也分有不同的等级,从几百B到几百KB都有,这为它们的应用提供了更为广阔的前景。2) 数据存储器现在的单片机基本上都带有内部数据存储器。如80C51/52系列的单片机片内置有128B和256B的RAM,这对于一般中小型应用系统(如实时控制系统和智能仪器仪表)已能满足要求。如果是单片机数据采集系统,对容量要求较大的系统则需要采用更大容量的数据存储器RAM ,如果要求数据掉电保护,则需要采用Flash EEPROM作为数据存储器。当然,外扩的RAM也以尽可能少的芯片为原则。3) 单片机的系统总线80C51单片机的 P0和P2口作为数据和地址总线,一般可驱动数个外接芯片(视外接芯片要求的驱动电流而异),也即P0和P2口的驱动能力还是有限的。如果外接的芯片过多,负载过重,系统将可能不能正常工作,此时必须加接缓冲驱动器予以解决。通常使用74HC573作为地址总线驱动器,使用74HC245双向驱动器作为数据总线驱动器。4) I/O接口现在的单片机系列中普遍都有多I/O口的型号,对I/O口的使用应从其功能和驱动能力上加以考虑。对于仅需增加少量的I/O口,最好选用价格低廉的TTL或CMOS电路扩展,这样也可提高单片机口线的利用率。5) A/D和D/A转换器现在可使用的A/D转换器数量繁多、品种齐全,各种分辨率、精度及速度的芯片应有尽有。最著名的是美国的模拟数字器件公司(Analog)的一系列转换器,此外还有Motorola和Maxim公司等,这给使用提供了很多便利的条件。当然内置转换器的单片机,转换器一般都在12位以下,对那些有更高要求的应用系统,也只能外接转换器芯片。3. 软件系统1) 系统资源分配在单片机应用系统的开发中,软件的设计是最复杂和困难的,大部分情况下工作量都较大,特别是对那些控制系统比较复杂的情况。如果是机电一体化的设计人员,往往需要同时考虑单片机的软硬件资源分配。在考虑一个应用工程项目时就需要先分析该系统完成的任务,明确软硬件哪个承担哪些工作。2) 程序结构在单片机的软件设计中,任务可能很多,程序量很大,在这种情况下一般都需把程序分成若干个功能独立的模块,这也是软件设计中常用的方法,即俗称的化整为零的方法。对于复杂的多任务实时控制系统,一般要求采用实时任务操作系统,并要求这个系统具备优良的实时控制能力。3) 数学模型一个控制系统的研制,明确了各部分需要完成的任务后,设计人员必须进一步分析各输入输出变量的数学关系,即建立数学模型。这个步骤对一般较复杂的控制系统是必不可少的,而且不同的控制系统,它们的数学模型也不尽相同。4) 程序流程较复杂的控制系统一般都需要绘制一份程序流程图,可以说它是程序编制的纲领性文件,可以有效地指导程序的编写。5) 编制程序上述的工作完成后,就可以开始编制程序了。过去单片机应用软件以汇编语言为主,因为它简洁、直观、紧凑,使设计人员乐于接受。而现在高级语言在单片机应用软件设计中发挥了越来越重要的角色,性能也越来越好,C语言已成为现代单片机应用系统开发中较常用的高级语言。但不管使用何种语言,最终还是需要翻译成机器语言,调试正常后,通过烧录器固化到单片机或片外程序存储器中。至此,程序编写即告完成。1.2.2 单片机应用系统开发的软硬件环境1. 单片机应用系统开发的软硬件环境构成当用户目标系统设计完成后,还需要应用软件支持,用户目标系统才能成为一个满足用户要求的单片机应用系统。但该用户目标系统不具备自开发能力,需要借助于单片机仿真器(也称单片机开发系统)完成该项工作。一个典型的单片机系统开发环境组成如图1-2所示。 图1-2 单片机系统开发环境组成2. 单片机应用系统开发工具选择原则全地址空间的仿真。不占用任何用户目标系统的资源。必须实现硬断点,并且具有灵活的断点管理功能。硬件实现单步执行功能。可跟踪用户程序执行。可观察用户程序执行过程中的变量和表达式。可中止用户程序的运行或用户程序复位。系统硬件电路的诊断与检查。支持汇编和高级语言源程序级调试。3. 使用JTAG界面单片机仿真开发环境JTAG仿真开发环境如图1-3所示。在JTAG单片机仿真开发环境中,JTAG适配器提供了计算机通信口到单片机JTAG口的透明转换,并且不出借CPU和程序存储器给应用系统,使得仿真更加贴近实际目标系统。单片机内部已集成了基于JTAG协议调试和下载程序。图1-3 JTAG仿真开发环境4. 单片机的在线编程在线编程目前有两种实现方法:在系统编程(ISP)和在应用编程(IAP)。ISP一般通过单片机专用的串行编程接口对单片机内部的Flash存储器进行编程,而IAP技术是从结构上将Flash存储器映射为两个存储体,当运行一个存储体上的用户程序时,可对另一个存储体重新编程,之后将控制从一个存储体转向另一个。ISP的实现一般需要很少的外部电路辅助实现,而IAP的实现更加灵活,通常可利用单片机的串行口接到计算机的RS232口,通过专门设计的固件程序对内部的FLASH存储器编程。1.2.3 Keil C51高级语言集成开发环境单片机系统的编程语言有汇编语言和高级语言两种。每一种类型的单片机都有与其指令系统对应的汇编语言,汇编语言就是机器语言,优点是可直接操作硬件,可执行文件比较小,而且执行速度很快。汇编语言的缺点是软件的维护性和可移植性差。单片机的高级语言包括:Basic语言、PL/M语言和C/C+语言。Basic语言主要应用在MCS-51系列单片机上,效果不是很理想,现在已经不再使用。PL/M语言对硬件的控制能力和代码效率都很好,但局限于Intel公司的单片机系列,移植性差。 C/C+语言是目前单片机的主流编程语言。注:IAR for 8051 7.5A C/C+ Compiler V7.50A/W32 IAR是瑞典的一家公司官方网站可以下载Keil C51软件是目前最流行开发80C51系列单片机的软件工具,这从近年来各单片机仿真机厂商纷纷宣布全面支持Keil C51即可看出。Keil C51提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(Vision3 IDE)将这些部份组合在一起。掌握这一软件的使用对于使用80C51系列单片机的爱好者来说是十分必要的,即使不使用C语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令开发者事半功倍。1. Vision3 IDE主要特性Vision3 IDE基于Windows的开发平台,包含一个高效的编辑器、一个项目管理器和一个MAKE工具。Vision3 IDE支持所有的Keil C51工具,包括 C 编译器、宏汇编器、连接/定位器、目标代码到 HEX 的转换器。Vision3 IDE内嵌多种符合当前工业标准的开发工具,可以完成从工程建立、管理、编译连接、目标代码的生成、软件仿真、硬件仿真等完整的开发流程。 Vision3 IDE主要特性如下: 集成开发环境 C51 编译器和A51汇编器 LIB51库管理器 BL51链接器/定位器 Vision3 软件调试器 Vision3 IDE硬件调试器 RTX51 实时操作系统2. Vision3 IDE集成开发环境Vision3 IDE界面如图1-4所示。Vision3 IDE界面 图1-4 Vision3 IDE界面Vision3 IDE提供下拉菜单和工具条按钮两种操作方式。下拉菜单提供有多种选项,根据不同需要选用,工具条按钮实际上是下拉菜单中一些重要选项功能的快捷方式。Vision2 IDE的菜单详细说明具体见“附录A Vision2 IDE集成开发环境使用 ”。3. Vision3 IDE的使用Vision3 IDE安装后自带了一些帮助文档,位于安装目录的KeilC51HLP文件夹,包括A51.pdf、C51.pdf、 C51lib.chm、DBG51.CHM、errors.chm、GS51.pdf等,你可以通过Vision3开发环境Project Window的Books标签页中的连接来打开这些文档。 Vision3 IDE包括一个项目管理器,它可以使 8x51 应用系统的设计变得简单。要创建一个应用,需要按下列步骤进行操作:启动Vision3 IDE,新建一个项目文件并从器件库中选择一个CPU器件。新建一个源文件并把它加入到项目中。增加并设置选择的器件的启动代码。针对目标硬件设置工具选项。 编译项目并生成可以编程ROM的HEX文件。 下面通过创建项目实例介绍一个简单的软件开发流程。例1.3示例程序中定义一个加法计数器字节型变量ucTimer,每次加1后送到P2口显示,并使用打印printf函数输出相应指示信息,整个程序只包含一个源文件McuTimer.c,这个小型的应用程序帮助大家确定Keil Vision3可以编译、链接和调试一个应用程序。 设项目名MyProject,采用标准的AT89C52芯片,程序使用的硬件资源是AT89C52片内的并行I/O口P2和串行口,不需要一个实际的单片机系统,因为Vision3 IDE可以模拟程序所需要的硬件并行I/O口和串行口。1) 选择【Project】/【New Project】选项,如图1-5 a)所示。2) 在弹出的“Create New Project”对话框中选择要保存项目文件的路径,比如保存到McuPort目录里,在“文件名”文本框中输入项目名为MyProject,如图1-5 b)所示,然后单击“保存”按钮。a) Project 菜单 b) Create New Project 对话框图1-5 【Project】/【New Project】选项这时会弹出一个对话框,要求选择单片机的型号。以常用的 AT89C52为例来说明,先选择ATMEL公司,再选择AT89C52 之后,如图1-6所示。然后单击“确定”按钮,弹出将8051初始图1-6 选择单片机的型号化代码拷贝到项目中的询问窗口,如下图1-7所示。单击“Y”按钮。图1-7新建项目后Vision3 界面如图1-8所示。图1-8新建一个源程序文件。建立一个汇编或C文件,如果已经有源程序文件,可以忽略这一步。选择【File】/【New】选项,在弹出的程序文本框中输入一个简单的程序,如下图1-9所示,具体方法现场演示一次。 图1-93) 选择【File】/【Save As】选项,或者单击工具栏按钮,保存文件,如图1-10所示。图1-104) 然后要将McuTimer.c文件加入到项目中,鼠标右键点左边项目窗口中“Source Group 1”,在弹出的菜单中选择“Add Files to GroupSource Group 1”,选择刚才的建立的文件 McuTimer.c,如图1-11所示。图1-115) 这时在Source Group 1里就有 McuTimer.c 文件和事先建立项目时已经加入的文件STARTUP.A51,如图1-12所示。图1-126) 编译环境设置。Vision3可以为目标硬件设置选项。通过工具栏图标打开Option for Target对话框,如图1-13所示。在Target标签的页面中,可以指定目标硬件以及所选器件的片内部件的所有相关参数。图1-13 Option for Target对话框表1-1说明了Target对话框的选项。表1-1 Target对话框的选项对话框选项说 明Xtal指定单片机器件的时钟频率Memory Model指定C51编译器的存储模式Code Rom Size指定程序存储器容量Oprating指定操作系统Off Chip Code memory指定目标器件的所有外部存储器区域Code Banking指定代码和xdata分体的参数7) 编译项目和创建HEX、OMF文件。通过工具栏图标打开Option for Target对话框,如图1-14所示。在Output标签的页面中,使能Creat HEX File、在Name of Executable窗口中的文件名加上扩展名omf,Vision3每次编译处理都会生成HEX和omf文件。HEX文件用于下载程序到芯片,omf文件用于下载到Proteus VSM仿真芯片中进行带原程序仿真。图1-14 编译设置界面8) 编译连接程序,选择【Project】/【Rebuild all target files】选项,如图1-15所示。 图1-15如果没有错误,则编译连接成功,开发环境右下角信息框会显示编译连接成功的信息,如图1-16所示。 图1-169) 编译完毕之后,选择【Debug】/【Start/Stop Debug Session】选项,即就进入Debug调试环境,如图1-17所示。 图1-1710) 装载代码之后,开发环境Output Window(在左下角)显示如图1-18所示的装载成功信息。 图1-1811) 示例程序中定义一个加法计数器字节型变量ucTimer,每次加1后送到P2口显示,并使用打印printf函数输出相应指示信息,整个程序只包含一个源文件McuTimer.c。 选择【View】/【Serial Window #1】选项,如图1-19所示。图1-1912) 选择【Peripherals】/【I/O-Ports】/【Port 2】选项,如图1-20所示。 图1-2013) 按“F5”键启动程序,在串口窗口Serial #1可看到printf的输出信息和P2端口数据的变化情况,如图所示。串口窗口默认字符显示模式“Ascii Mode”,在窗口中点鼠标右键,在弹出的窗口单击右键可修改显示模式为“Hex Mode”,如图1-21所示。图1-211.2.4 基于Proteus的单片机系统仿真从“1.2.2单片机应用系统开发的软硬件环境”一节可知,开发单片机系统硬件投入比较大。在具体的工程实践中,如果因为方案有误而要重新进行相应的开发设计,就会浪费较多的时间和经费。 英国Labcenter Electronics公司推出的的Proteus套件,可以对基于微控制器的设计连同所有的周围电子器件一起仿真。用户甚至可以实时采用诸如LED/LCD、键盘、RS232 终端等动态外设模型来对设计进行交互仿真。目前在单片机的教学过程中,已越来越受到重视,并被提倡应用于单片机数字实验室的构建之中。Proteus支持的微处理芯片(Microprocessors Ics)包括8051系列、AVR系列、PIC系列、HC11系列、ARM7/LPC2000系列以及Z80等。 1. Proteus 7 Professional界面介绍安装完 Proteus后,运行ISIS 7 Professional,会出现如图1-22所示的窗口界面。图1-22 ISIS窗口界面窗口内各部分的功能用中文作了标注。ISIS大部分操作与windows的操作类似。1) 原理图编辑窗口(The Editing Window)2) 预览窗口(The Overview Window)3) 模型选择元件栏(Mode Selector Toolbar)4) 元件列表区(The Object Selector)5) 方向工具栏(Orientation Toolbar) 6) 仿真工具栏7) 3)、4)、5)、6)操作命令类似于windows操作,详细见现场演示。8)2. 绘制电路原理图1) 将所需元器件加入到对象选择器窗口,如图1-23所示。图1-232) 放置元器件至图形编辑窗口,如图1-24所示。图1-243) 放置总线至图形编辑窗口,如图1-25所示。图1-254) 添加电源和接地引脚,如图1-26所示。图1-265) 元器件之间的连线Wiring Up Components on the Schematic,如图1-27所示。图1-276) 给导线或总线加标签,如图1-28所示。图1-287) 添加电压探针,如图1-29所示。图1-298) 添加文字标注,如图1-30所示。图1-309) 添加虚拟仪器,如图1-31所示。图1-3110) 选择AT89C52属性并加载程序文件,如图1-32所示。图1-3211) 保存设计文件从“文件”下拉菜单选择“保存”项,出现如图对话框,提示输入文件名,图中设文件名为80C51VSM.DSN,点“保存”按钮,如图1-33所示。 图1-3312) 程序仿真单击仿真运行开始按钮,进入调试运行窗口,如图1-34所示。 图1-34虚拟终端窗口,如图1-35所示。 图1-353. Proteus VSM与Vision3的联调Proteus VSM支持第三方集成开发环境IDE,目前支持的第三方80C51IDE有:IAR Embedded Workbench、Keil Vision3 IDE。本文以Keil Vision3 IDE为例介绍Proteus VSM与Vision3 IDE的联调。 对于proteus 6.9或更高的版本,在安装盘里有vdmagdi插件或到LABCENTER公司下载该插件,安装该插件后即可实现与Keil Vision3 IDE的联调。下面的叙述是假定我们已经分别安装了如下软件:(1)Proteus 7 Professional(2)Keil Vision3 IDE(3)vdmagdi.exe(安装在Keil目录下)1) Proteus VSM的设置选中“use romote debuger monitor”, 如图1-36所示。图1-362) Vision3 IDE设置(1) 设置option for target /Debug选项, 如图1-37所示。图1-37(2) 设置option for ta rget /Output选项, 如图1-38所示。图1-383) Proteus VSM与Vision3的联调在Vision3环境下,首先按“F7”产生该项目的HEX文件,然后进入Vision3 调试模式,为了在Proteus VSM环境下能观察到程序连续运行情况,取消目前项目中所有断点。按“F5”按钮进入全速运行。可以看到完全一致的运行画面。此时Proteus VSM的运行完全依赖于外部调试器Vision3。我们利用图1-39接在U1AT89C52单片机P1.0和P1.3的元件单刀双掷开关“SW-SPDT”和P1.6的元件按钮“BUTTON”说明如何仿真AT89C52片外的外围部件。 图1-39要求在图中,当单刀双掷开关“SW-SPDT”接到P1.0,单片机P2口输出作加法计数,当单刀双掷开关“SW-SPDT”接到P1.3,单片机P2口输出作减法计数。当按钮“BUTTON”按下时超过1秒,单片机P2口的计数输出清“0”。为此我们修改项目MyProject中的文件McuTimer.c,在Vision3 IDE环境下重新编译该项目。按“F5”按钮进入全速运行。然后切换到Proteus VSM环境。可以分别点“加1按钮”、“减1按钮”和“清零按钮”可以观察程序单片机外围部件仿真运行情况。 习题一1 C语言的优点是什么?2 C语言程序主要的结构特点是什么?3 写出一个C51程序的构成。第2章 C51数据类型与运算2.1 C51数据类型C51的数据类型如下所示:数据类型基本类型位型(bit)字符型(char)整形(int)长整型(long)浮点型(float)双精度浮点型(double)构造类型数组类型(array)结构体类型(struct)共用体型(union)枚举型(enum)指针类型空类型C51编译器支持的数据类型、长度和值域如下表1-1所示。与面向数学运算的计算机相比,51单片机对变量类型或数据类型的选择更具有关键性意义。如果在程序设计中使用大量而不必要的变量类型,这会导致C编译器调用库函数的数量,以处理大量的变量类型和数据类型。所以必须特别慎重地进行变量和数据类型的选择。表1-1 C51的数据类型数据类型长度(bit)长度(Byte)值域范围bitunsigned charsigned charunsigned intsigned intunsigned longsigned longfloatdouble一般指针188161632323264241122444830,10255128127065535327683276704 294 967 2952 147 483 6482 147 483 6471.176E383.40E38(6位数字)1.176E383.40E38(10位数字)存储空间0655352.2 C51数据存储类型C51编译器还可以通过将变量、常量定义成不同的存储类型(data,bdata,idata,pdata,xdata,code)的方法,将它们定义在不同的存储区中。存储类型与51单片机实际存储空间的对应关系如表1-2所示。表1-2 C51存储类型与51单片机实际存储空间的对应关系存储类型与存储空间的对应关系databdataidatapdataxdatacode直接寻址片内数据存储区,访问速度快(128B)可位寻址片内数据存储区,允许位与字节混合访问(16B)间接寻址片内数据存储区,可访问片内全部RAM地址空间(256B)分页寻址片外数据存储区(256B),由MOVX Ri访问寻址片外数据存储区(64KB),由MOVX DPTR访问寻址代码存储区(64KB),由MOVC DPTR访问当使用存储类型data、bdata定义常量和变量时,C51编译器会将它们定位在片内数据存储区中。片内RAM是存放临时性传递变量或使用频率较高变量的理想场所。访问片内数据存储器(data、bdatai、data)比访问片外数据存储器(xdata、pdata)相对快一些,因此可将经常使用的变量置于片内数据存储器,而将规模较大的或不常使用的数据置于片外数据存储器中。C51存储类型及其大小和值域如表1-3所示。例如:表1-3 C51存储类型及其大小和值域存储类型长度(bit)长度(Byte)值域范围dataidatapdataxdatacode888161611122025502550255065 535065 535char data var1; /*字符变量var1被定义为data存储类型,定位在片内RAM中*/bit bdata flags; /*位变量flags被定义为data存储类型,定位在片内RAM中的位寻址区*/ /*(20H2FH)*/float idata x,y,z;/*浮点变量x,y,z被定义为idata存储类型,定位在片内RAM中,并只能用间接寻址的方法进行访问*/unsigned int pdata dimension;/*无符号整型变量dimension被定义为pdata存储类型,定位在片外RAM中,并用MOVX Ri访问*/unsigned char xdata vector1044;/*无符号字符三维数组变量vector1044 被定义为xdata存储类型,定位在片外RAM中,占据1044=160个字节空间*/如果在变量定义时省略存储类型标志符,编译器会自动默认存储类型。默认的存储类型进一步由SMALL、COMPACT和LARGE存储模式指令限制,见表1-4所示。存储模式决定了变量的默认存储类型、参数传递区和无明确存储类型的说明。例如,char var1在SMALL存储模式下,var1被定位在data存储区;在COMPACT模式下,var1被定位在pdata存储区,在LARGE模式下,var1被定位在xdata存储区中。表1-4 存储模式及说明存储模式说明SMALL参数及局部变量放入可直接寻址的片内存储器(最大128B,默认存储类型是data),因此访问十分方便。另外所有对象,包括栈,都必须嵌入片内RAM。栈长很关键,因为实际栈长依赖于不同函数的嵌套层数。COMPACT参数及局部变量放入分页片外存储区(最大256B,默认存储类型是pdata),通过寄存器R0和R1间接寻址,栈空间位于片内数据存储区中。LARGE参数及局部变量放入片外数据存储区(最大64KB,默认存储类型是xdata),使用数据指针DPTR来进行寻址。用此数据指针访问的效率较低,尤其是对两个或多个字节的变量,这种数据类型的访问机制直接影响代码的长度,另一不方便之处在于这种数据指针不能对称操作。2.3 C51定义SFR(特殊功能寄存器)51单片机内有21个特殊功能寄存器(SFR),它们分布在片内RAM的高128B中,对特殊功能寄存器只能用直接寻址方式访问。特殊功能寄存器中还有11个可位寻址的寄存器。在C51中

温馨提示

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

评论

0/150

提交评论