表3.2 P3 端口引脚兼用功能表
什么叫上拉电阻?上拉电阻简单来说就是把电平拉高,通常用4.7-10K 的电阻接到Vcc 电源,下拉电阻则是把电平拉低,电阻接到GND 地线上。具体说明也不是这里要讨论的,接下来还是接着看其它的引脚功能吧。
5.其它的控制或复用引脚
(1) ALE/PROG 30 访问外部存储器时,ALE(地址锁存允许)的输出用于锁存地址的低位字节。即使不访问外部存储器,ALE 端仍以不变的频率输出脉冲信号(此频率是振荡器频率的1/6)。在访问外部数据存储器时,出现一个ALE 脉冲。对Flash 存储器编程时,这个引脚用于输入编程脉冲PROG。
(2) PSEN 29 该引是外部程序存储器的选通信号输出端。当AT89C51 由外部程序存储器取指令或常数时,每个机器周期输出2 个脉冲即两次有效。但访问外部数据存储器时,将不会有脉冲输出。
(3) EA/Vpp 31 外部访问允许端。当该引脚访问外部程序存储器时,应输入低电平。要使AT89C51 只访问外部程序存储器(地址为0000H-FFFFH),这时该引脚必须保持低电平。对Flash 存储器编程时,用于施加Vpp 编程电压。Vpp 电压有两种,类似芯片最大频率值要根据附加的编号或芯片内的特征字决定。具体如表3.3 所列。
表3.3 Vpp 与芯片型号和片内特征字的关系
看到这您对AT89C51 引脚的功能应该有了一定的了解了,引脚在编程和校验时的时序我们在这里就不做详细的探讨,通常情况下我们也没有必要去撑握它,除非您想自己开发编程器。下来的课程我们要开始以一些简单的实例来讲述C 程序的语法和编写方法技巧,中间穿插相关的硬件知识如串口,中断的用法等等。
3.3 生成HEX 文件和最小化系统
在开始C语言的主要内容时,我们先来看看如何用KEIL uVISION2来编译生成用于烧写芯片的HEX文件。HEX文件格式是Intel公司提出的按地址排列的数据信息,数据宽度为字节,所有数据使用16进制数字表示, 常用来保存单片机或其他处理器的目标程序代码。它
保存物理程序存储区中的目标代码映象。一般的编程器都支持这种格式。我们先来打开第一课做的第一项目,打开它的所在目录,找到test.Uv2的文件就可以打开先前的项目了。然后右击图3.10中的1项目文件夹,弹出项目功能菜单,选Options for Target’Target1’,弹出项目选项设置窗口,同样先选中项目文件夹图标,这时在Project菜单中也有一样的菜单可选。打开项目选项窗口,转到Output选项页图3.13所示,图中1是选择编译输出的路径,2是设置编译输出生成的文件名,3则是决定是否要创建HEX文件,选中它就可以输出HEX文件到指定的路径中。选好了?好,我们再将它重新编译一次,很快在编译信息窗口中就显示HEX文件创建到指定的路径中了,如图3.14。这样我们就可用自己的编程器所附带的软件去读取并烧到芯片了,再用实验板看结果,至于编程器或仿真器品种繁多具体方法就看它的说明书了,这里也不做讨论。
(技巧:一、在图3.12中的1里的项目文件树形目录中,先选中对象,再单击它就可对它进行重命名操作,双击文件图标便可打开文件。二、在Project下拉菜单的最下方有最近编辑过的项目路径保存,这里可以快速打开最近在编辑的项目。)
图3.12项目功能菜单
图3.13 项目选项窗口
图3.14 编译信息窗口
或许您已把编译好的文件烧到了芯片上,如果您购买或自制了带串口输出元件的学习实验板,那您就可以把串口和PC 机串口相联用串口调试软件或Windows 的超级终端,将其波特率设为1200,就可以看到不停输出的“Hello World!”字样。也许您还没有实验板,那这里先说说AT89C51 的最小化系统,再以一实例程序验证最小化系统是否在运行,这个最小化系统也易于自制用于实验。图3.15 便是AT89C51 的最小化系统,不过为了让我们可以看出它是在运行的,我加了一个电阻和一个LED,用以显示它的状态,晶振可以根据自己的情况使用,一般实验板上是用11.0592MHz 或12MHz,使用前者的好外是可以产生标准的串口波特率,后者则一个机器周期为1 微秒,便于做精确定时。在自己做实验里,注意的是VCC 是+5V 的,不能高于此值,否则将损坏单片机,太低则不能正常工作。在31 脚要接高电平,这样我们才能执行片内的程序,如接低电平则使用片外的程序存储器。下面,我们建一个新的项目名为OneLED 来验证最小化系统是否可以工作。程序如下:
#include //预处理命令 void main(void) //主函数名 {
//这是第一种注释方式
unsigned int a; //定义变量a 为int 类型 /*
这是第二种注释方式 */
do{ for (a=0; a<50000; a++); P1_0 = 0; for (a=0; a<50000; a++); P1_0 = 1; }
while(1); }
//do while 组成循环 //这是一个循环
//设P1.0 口为低电平,点亮LED //这是一个循环
//设P1.0 口为高电平,熄灭LED
图3.15 AT89C51 最小化系统
在KEIL C 编译器所支持的注释语句。一种是以“//”符号开始的语句,符号之后的语句都被视为注释,直到有回车换行。另一种是在“/*”和“*/”符号之内的为注释。注释不会被C 编译器所编译。一个C 应用程序中应有一个main 主函数,main 函数可以调用别的功能函数,但其它功能函数不允许调用main 函数。不论main 函数放在程序中的那个位置,总是先被执行。用上面学到的知识编译写好的OneLED 程序,并把它烧到刚做好的最小化系统中。上电,刚开始时LED 是不亮的(因为上电复位后所有的IO 口都置1 引脚为高电平),然后延时一段时间(for (a=0; a<50000; a++)这句在运行),LED 亮,再延时,LED熄灭,然后交替亮、灭。第一个真正的小应用就做完,呵呵,先不要管它是否实用哦。如果没有这样的效果那么您就要认真检查一下电路或编译烧写的步骤了。
3.4数据类型
简单来说是C 语言的标识符和关键字。标识符是用来标识源程序中某个对象的名字的,这些对象可以是语句、数据类型、函数、变量、数组等等。C 语言是大小字敏感的一种高级语言,如果我们要定义一个定时器1,可以写做“Timer1”,如果程序中有“TIMER1”,那么这两个是完全不同定义的标识符。标识符由字符串,数字和下划线等组成,注意的是第一个
字符必须是字母或下划线,如“1Timer”是错误的,编译时便会有错误提示。有些编译系统专用的标识符是以下划线开头,所以一般不要以下划线开头命名标识符。标识符在命名时应当简单,含义清晰,这样有助于阅读理解程序。在C51 编译器中,只支持标识符的前32 位为有效标识,一般情况下也足够用了,除非你要写天书:P。
关键字则是编程语言保留的特殊标识符,它们具有固定名称和含义,在程序编写中不允许标识符与关键字相同。在KEIL uVision2 中的关键字除了有ANSI C 标准的32 个关键字外还根据51 单片机的特点扩展了相关的关键字。其实在KEIL uVision2 的文本编辑器中编写C 程序,系统可以把保留字以不同颜色显示,缺省颜色为天蓝色。先看表3.3,表中列出了KEIL uVision2 C51 编译器所支持的数据类型。在标准C 语言中基本的数据类型为char,int,short,long,float 和double,而在C51 编译器中int 和short 相同,float 和double 相同,这里就不列出说明了。下面来看看它们的具体定义:
表3.3 KEIL uVision2 C51 编译器所支持的数据类型
1. char 字符类型
char 类型的长度是一个字节,通常用于定义处理字符数据的变量或常量。分无符号字符类型unsigned char 和有符号字符类型signed char,默认值为signed char 类型。unsigned char 类型用字节中所有的位来表示数值,所可以表达的数值范围是0~255。signed char 类型用字节中最高位字节表示数据的符号,“0”表示正数,“1”表示负数,负数用补码表示。所能表示的数值范围是-128~+127。unsigned char 常用于处理ASCII字符或用于处理小于或等于255 的整型数。
*正数的补码与原码相同,负二进制数的补码等于它的绝对值按位取反后加1。 2. int 整型
int 整型长度为两个字节,用于存放一个双字节数据。分有符号int 整型数signed int和无符号整型数unsigned int,默认值为signed int 类型。signed int 表示的数值范围是-32768~+32767,字节中最高位表示数据的符号,“0”表示正数,“1”表示负数。unsigned int 表示的数值范围是0~65535。
我们来写个小程序看看unsigned char 和unsigned int 用于延时的不同效果,说明它们的长度是不同的,呵,尽管它并没有实际的应用意义,这里我们学习它们的用法就行。依旧用我们上一课的最小化系统做实验,不过要加多一个电阻和LED,如图4-1。实验中用D1 的点亮表明正在用unsigned int 数值延时,用D2 点亮表明正在用unsigned char 数值延时。