《51单片机C语言编程入门以及keil_uvision使用方法介绍(.pdf》由会员分享,可在线阅读,更多相关《51单片机C语言编程入门以及keil_uvision使用方法介绍(.pdf(83页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 中国科学技术大学业余无线电协会编 目 录 1 前言 1 2 单片机简介 2 2.1 数字电路简介 2 2.2 MCS-51 单片机简介 2 2.3 Easy 51 Kit Pro 简介 5 2.4 Easy 51 Kit Pro 电路功能分析 5 3 MCS-51 单片机的 C 语言编程 8 3.1 汇编语言 8 3.2 建立你的第一个 C 项目 8 3.3 生成 hex 文件 12 3.4 Keil C 语言 14 3.5 单片机 I/O 18 3.6 中断 25 3.7 定时器/计数器 27 3.8 定时器的应用举例 29 3.9 外部中断 34 3.10 串行通信 38 3.11 定时
2、器 2 43 3.12 看门狗 47 3.13 空闲模式和掉电模式 50 4 MCS-51 单片机 C 语言编程应用进阶 51 4.1 扫描式键盘 51 4.2 EEPROM 芯片 AT93C46 的读写 55 4.3 Keil C 的高级使用 63 5 编写高质量的单片机 C 程序 64 5.1 文件结构 64 5.2 程序的版式 66 5.3 单片机程序命名规则与变量选择 70 5.4 表达式和基本语句 73 5.5 函数设计 77 5.6 单片机程序框架 79 附图:Easy 51 Kit Pro 电路图(最小系统板)80 附图:Easy 51 Kit Pro 电路图(学习板)81 V2
3、.0.2 51 单片机 C 语言编程入门Easy 51 Kit Pro 配套学习资料 中国科学技术大学业余无线电协会 11 前言 什么是单片机,目前还没有一个确切的定义。普通认为单片机是将CPU、RAM、ROM、定时器/计数器以及输入输出(IO)接口电路等计算机主要部件集成在一块芯片上,这样所组成的芯片级微型计算机称为单片微型计算机(Single Chip Microcomputer)。简称为单片微机或单片机。利用单片机程序,可以实现对硬件系统的小型化的智能控制。由于单片机的硬件结构与指令系统都是按工业控制要求设计的,常用于工业的检测、控制装置中,因而也称为微控制器(Micro-Control
4、ler)或嵌入式控制器(Embedded-Controller)。单片机的应用十分广泛,我们将以 Easy 51 Kit Pro 单片机学习板为基础,学习 51 单片机的入门知识。本学习资料面向掌握基本电路知识和基础 C 语言编程的单片机初学者。为使读者能迅速上手,本资料并不深入介绍单片机的内部体系结构和指令系统,而是从读者较熟悉的高级语言开始使读者掌握单片机的 C 语言编程。通过本资料的大量程序例子,读者应当可以在较短的时间内熟悉单片机的入门编程以及单片机基本外围电路的连接,从而具备基本的单片机开发能力。然而,本资料的局限性也正在于此,当读者需要更深入地开发单片机或其它控制器时,可能需要进一
5、步了解其内部体系结构和指令系统,这时读者就应查阅其它资料了。同时,本学习资料还致力于引导读者编写高质量的单片机 C 语言程序。尽管单片机程序的规模有限,但高质量的单片机程序除了可以优化运行效率外,对程序的开发速度和可维护性也具有重要的影响。51 单片机 C 语言编程入门Easy 51 Kit Pro 配套学习资料 2 单片机简介 2.1 数字电路简介 在一个控制系统中,单片机是电路的一部分,单片机中的程序是针对其所在的电路编写的。因此,要对单片机编程并实现一定的功能,必须了解整个系统的电路图。单片机编程是针对某个特定的电路进行的单片机编程是针对某个特定的电路进行的,这一点和普通的编程不一样。编
6、程时很可能要经常参照电路图。与单片机直接相关的电路大都是数字电路。数字电路各部分的功能十分明确,因此相对比较容易掌握。简单地说,数字电路就是只有“0”和“1”两种信号的电路。判别信号究竟是“0”还是“1”是通过电压的大小(常称作“电平”)来判断的。不同的数字器件的电平判断标准是不一样的。常用的数字器件以高电平(超过某一阈值的电平)作为逻辑“1”,以低电平(低于某一阈值的电平)作为逻辑“0”。其中高电平阈值大于低电平阈值,处于高电平阈值与低电平阈值之间的电压是无效的。高电平阈值与低电平阈值的具体值与数字器件的供电电压有关,如 AT89S51 单片机的高电平阈值为(0.2Vcc+0.9)V,低电平
7、阈值为(0.2Vcc-0.1)V,其中 Vcc 为单片机的供电电压。早年常用的数字器件的额定供电电压为 5V,现在 3.3V、1.8V等电压的数字器件已经大量使用了。在 Easy 51 Kit Pro 中,我们仍使用 5V 供电的单片机。另外,还有一种 RS-232 电平标准,以-12V-5V 作为逻辑“1”,以 5V12V 作为逻辑“0”。电脑上的串口都符合 RS-232 标准。还有一个“地”的概念。在电路中“地”并不是通常意义中的地,而是指电路中的一点,这一点的电压被人为地规定为 0V。2.2 MCS-51 单片机简介 目前生产单片机产品的公司非常多,当中较有影响力的有 intel 公司推
8、出的 MCS-51 系列等。很多公司的产品都是与 MCS-51 架构兼容(MCS-51 compatible)的。本资料中采用的atmel 公司的 AT89C51/52 或 AT89S51/52 单片机,就是兼容 MCS-51 架构的单片机。Atmel 公司的 AT89C51(以后简称“C51”以后简称“C51”)、AT89C52(以后简称“C52”以后简称“C52”)、AT89C2051(以后简称“C2051”以后简称“C2051”)以及 C51、C52 的换代产品 AT89S51(以后简称“S51”以后简称“S51”)、AT89S52(以后简称“S52”以后简称“S52”)容易上手、价格低
9、廉(不超过 10 元/片)、资料丰富,是初学者入门时广泛采用的单片机。C51 拥有 4096 字节(1 字节8 位)的片内程序存储器、128 字节的 RAM、32 个 I/O 口、两个定时器、6 个中断源、一个串口等。C52、C2051 的资源与 C51 差别不大,其中 C52 的片内程序存储器为 8192 字节、RAM 为 256 节、定时器有 3 个,其它与 C51 一样;C2051 的片内程序存储器为 2048 字节、I/O 口只有 15 个,另比 C51 多了一个模拟比较器,工作电压范围比较宽,为 2.7V6V(C51/52、S51/52 为 4.55.5V),其它与 C51 一样。I
10、/O、定时器、中断、串口等资源的用法在后面有详细介绍。这里只对程序存储器与 RAM作一下说明。单片机程序代码经过编译(C 程序)或汇编(汇编程序)后,要把编译或汇编得到的代码文件(一般来说编译得到 hex 格式文件、汇编得到 bin 格式文件)烧写到单片机内,存放这个程序的地方就是程序存储器。显而易见,单片机的程序存储器越大,我们就可以把越大、越复杂的程序放进去。如果我们编写的程序太大,那么单片机的程序存储器就有可能会放不下这个程序。这时,解决办法就只有精简代码、外接程序存储器(前提是所用的单片机支持使用外部程序存储器)或采用程序存储器容量更大的单片机。RAM 是单片机程序运行时存放变量的地方
11、,常量也可以放在 RAM 中。C51 中的 RAM 大小为 128 字节,这就是说单片机程序中最多只能同时存在 128 个 unsigned char 型的变量或 64 个 unsigned int 型的变量(在 Keil 环境中,int 型变量的长度为 16 位,这与 VC 的 32 位不一样)或者是相应的中国科学技术大学业余无线电协会 251 单片机 C 语言编程入门Easy 51 Kit Pro 配套学习资料 各种不同类型变量的组合。可以看出,单片机程序所允许的规模比 Windows 或其它操作系统环境下的程序要小得多。编写单片机程序时一定要注意不要滥用资源。S51 与 S52 分别是
12、C51、C52 的换代产品。从用户的角度看,S5x 单片机比相对应的 C5x单片机多了看门狗与在线编程(ISP)功能,另外最高运行速度有所增加(C5x 最高支持 24MHz的时钟频率,而 S5x 最高支持 33MHz 的时钟频率,但市面上比较容易买到的 S5x 单片机仍只最高支持 24MHz 的时钟频率)。看门狗的使用在后面会有详细介绍,我们来看看单片机的在线编程(ISP)功能。要把程序烧写到 AT89C 系列单片机中,最常用的做法是把单片机插入专用的编程器中,通过编程器把程序烧到单片机里。这样做的麻烦之处是在调试程序时,编程者对程序作出的每次修改,都要把单片机从电路中拔出来,插到编程器,烧好
13、后又要把单片机重新插回电路板。可以想象,这种工作是吃力不讨好的。利用 S5x 单片机的 ISP 功能,我们就无须来回插拔单片机,只要在电路中把单片机的 ISP 编程引脚接出来,并且这几个引脚所接的外围电路对 ISP 没有影响,就可以用 ISP 编程器对单片机进行烧写了。另外,支持 AT89C 系列单片机的编程器成本要比 ISP 下载线高最少几倍。一根并口 ISP 下载线的成本仅几元钱。除了 S 系列、C 系列外,atmel 公司的 MCS-51 兼容产品也有其它系列,它们的主要区别在于供作电压范围,在此就不作介绍了。值得注意的是,一片单片机可以反复擦写的次数是有限的,atmel 的 C 系列、
14、S 系列单片机的声称可重复擦写次数为 1000 次。下面以 S52 为例,对其引脚功能一一作出说明。C51、C52 以及 S51 的引脚功能与 S52大致相同,如有遇到不同的地方会用粗斜体字粗斜体字特别说明。图2.1 AT89S52引脚功能图 图2.2 AT89C2051引脚功能图 1、电源引脚 Vcc 40 电源引脚 GND 20 接地引脚 工作电压为4V5.5V。2、外接晶体引脚 中国科学技术大学业余无线电协会 351 单片机 C 语言编程入门Easy 51 Kit Pro 配套学习资料 中国科学技术大学业余无线电协会 4 XTAL1 19 XTAL2 18 XTAL1是片内振荡器的反相放
15、大器输入端,XTAL2则是输出端,使用外部振荡器时,外部振荡信号应直接加到XTAL1,而XTAL2悬空。内部方式时,时钟发生器对振荡脉冲二分频,如晶振为12MHz,时钟频率就为6MHz。晶振的频率最高可以达到33MHz(C5x为24MHzC5x为24MHz)。电容取30pF10pF。单片机程序指令的执行是以振荡器的振荡来驱动的。在MCS-51架构中,每12个振荡器周期组成一个指令周期(或称机器周期)。单片机执行指令的时间是以指令周期为单位的。不同指令的执行时间可能是不同的,一条指令的执行时间最短为一个指令周期。在MCS-51架构中,每12个振荡器周期组成一个指令周期(或称机器周期)。单片机执行
16、指令的时间是以指令周期为单位的。不同指令的执行时间可能是不同的,一条指令的执行时间最短为一个指令周期。因此,单片机所接的振荡器频率越高,它执行指令的速度就越快。型号同样为AT89S52的芯片,在其后面还有频率编号,有24MHz和33MHz等可选。读者在购买和选用时要注意了。如AT89S52 24PC就是最高振荡频率为24MHz,40P6封装的普通商用芯片。单片机芯片后缀的详细含义可见相应单片机数据手册的Ordering Information。3、复位 RST 9 在振荡器运行时,有两个机器周期(24个振荡周期)以上的高电平出现在此引脚时,将使单片机复位,只要这个引脚保持高电平,单片机便一直处
17、于复位状态。复位后P0P3口均置1,引脚表现为高电平,程序计数器和特殊功能寄存器SFR全部清零。当复位引脚由高电平变为低电平时,芯片从ROM的00H处开始运行程序。复位操作不会对内部RAM有所影响。常用的复位电路如图2.4所示。当单片机上电时,由于电容的作用,RST引脚会处于短暂的高电平状态,直到电容充电到一定程度时,RST引脚的电平会被8.2K的电阻拉低,单片机开始运行程序。图中的按键为手动复位按键,当按下复位按键后,RST引脚会被1K的电阻上拉至高电平,单片机复位,按键松开后,RST恢复低电平,单片机重新从程序存储器的00H处运行程序。手动复位按键在单片机的最小系统中并不是必须的,但对单片
18、机的复位控制会方便些。图2.3 外接晶体引脚 51 单片机 C 语言编程入门Easy 51 Kit Pro 配套学习资料 中国科学技术大学业余无线电协会 5 4、输入输出引脚(1)P0端口P0.0P0.7 P0是一个8位漏极开路型双向I/O端口,端口置1(对端口写1)时作高阻抗输入端端口置1(对端口写1)时作高阻抗输入端。作为输出口时能驱动8个TTL。P0端口要外接上拉电阻。P0端口要外接上拉电阻。(2)P1端口P1.0P1.7 P1是一个带有内部上拉电阻的8位双向I/0端口。输出时可驱动4个TTL。端口置1时,内部上拉电阻将端口拉到高电平,作输入用端口置1时,内部上拉电阻将端口拉到高电平,作
19、输入用。对内部Flash程序存储器编程时,接收低8位地址信息。除此之外P1端口还用于一些专门功能,具体见表2.1。P1 引脚 兼用功能 P1.0 T2(外部计数器)、时钟输出(C51、S51无此功能)(C51、S51无此功能)P1.1 T2EX(定时器2捕捉和重载触发及方向控制)(C51、S51无此功能)(C51、S51无此功能)P1.5 MOSI(用于在线编程)(C51、C52无此功能)(C51、C52无此功能)P1.6 MISO(用于在线编程)(C51、C52无此功能)(C51、C52无此功能)P1.7 SCK(用于在线编程)(C51、C52无此功能)(C51、C52无此功能)(3)P2端
20、口P2.0P2.7 P2是一个带有内部上拉电阻的8位双向I/0端口。输出时可驱动4个TTL。端口置1时,内部上拉电阻将端口拉到高电平,作输入用端口置1时,内部上拉电阻将端口拉到高电平,作输入用。对内部Flash程序存储器编程时,接收高8位地址和控制信息。在访问外部程序和16位外部数据存储器时,P2口送出高8位地址。而在访问8位地址的外部数据存储器时其引脚上的内容在此期间不会改变。(4)P3端口P3.0P3.7 P2是一个带有内部上拉电阻的8位双向I/0端口。输出时可驱动4个TTL。端口置1时,内部上拉电阻将端口拉到高电平,作输入用端口置1时,内部上拉电阻将端口拉到高电平,作输入用。对内部Fla
21、sh程序存储器编程时,接控制信息。除此之外P3端口还用于一些专门功能,具体见表2.2。P3 引脚 兼用功能 P3.0 串行通信输入(RXD)P3.1 串行通信输出(TXD)P3.2 外部中断0(INT0)P3.3 外部中断1(INT1)P3.4 定时器0输入(T0)P3.5 定时器1输入(T1)P3.6 外部数据存储器写选通WR P3.7 外部数据存储器写选通RD 图2.4 常用复位电路 表2.2 P3 端口引脚兼用功能表 表2.1 P1 端口引脚兼用功能表 读51 单片机 C 语言编程入门Easy 51 Kit Pro 配套学习资料 5、其它的控制或复用引脚(1)ALE/-PROG 30 访
22、问外部存储器时,ALE(地址锁存允许)的输出用于锁存地址的低位字节。即使不访问外部存储器,ALE端仍以不变的频率输出脉冲信号(此频率是振荡器频率的1/6)。在访问外部数据存储器时,出现一个ALE脉冲。对Flash存储器编程时,这个引脚用于输入编程脉冲PROG。(2)PSEN 29 该引脚是外部程序存储器的选通信号输出端。当S52由外部程序存储器取指令或常数时,每个机器周期输出2个脉冲即两次有效。但访问外部数据存储器时,将不会有脉冲输出。(3)-EA/Vpp 31 外部访问允许端。当该引脚访问外部程序存储器时,应输入低电平。要使S52只访问外部程序存储器(地址为0000H-FFFFH),这时该引
23、脚必须保持低电平。当使用内部的程序存储器时,此引脚应与Vcc相连。当使用内部的程序存储器时,此引脚应与Vcc相连。对Flash存储器编程时,用于施加Vpp编程电压。C2051 的引脚功能与 C51 相仿,在此不另外介绍了,仅给出 C2051 的引脚图,如图 2.2所示。2.3 Easy 51 Kit Pro 简介 Easy 51 Kit Pro 是中国科大业余无线电协会继 Easy 51 Kit 之后设计的一块 51 单片机学习板,供单片机初学者使用。Easy 51 Kit Pro 包括了四位的数码 LED 显示输出、两个按键输入、一个 34 扫描式键盘和外接 93C46 EEPROM 芯片等
24、。利用这块学习板,初学者可以学习 51 单片机各模块的编程,熟悉单片机程序的特点,也可以试着写一些功能比较完整的程序(如闹钟、秒表等)。如果初学者能够掌握本资料中给出的各个例子,就可以独立开发单片机程序了。Easy 51 Kit Pro 由两块电路板组成。其中大的电路板为 MCS-51 最小系统板,小的电路板为学习板(学习板中没有单片机)。采用两块电路板的原因是考虑到当初学者入门后学习板部分的电路可能已经没有很大的用处,而一块设计完善的最小系统板可能在日后仍能派上用场。在设计上,Easy 51 Kit Pro 支持 USB 接口供电,采用一体化设计,学习板可以直接插在最小系统板上面,无须数据线
25、连接,两块电路板可共用同一电源。如果单片机采用AT89S51 或 AT89S52,那么整个 Easy 51 Kit Pro 与并口 ISP 下载线的总成本大约为 50 元,再加上一根双公头的 A 型 USB 线,就可以轻松学习 MCS-51 单片机了。2.4 Easy 51 Kit Pro电路功能分析 现在我们来分析一下Easy 51 Kit Pro的电路。Easy 51 Kit Pro的电路见附图。最小系统板包含了51单片机的最小系统、I/O线外接插座以及可断开的232电平转换芯片及9针串口等。C5x、S5x的最小系统如图2.5。这个最小系统在前面已有详细介绍,在这里就不罗嗦了。标记为“TX
26、”和“RX”的跳线可以用跳线帽把MAX232与单片机的串口断开或接通。接通时可以与电脑的串口直接通信,断开时则MAX232与单片机无任何电气上的信号连接。中国科学技术大学业余无线电协会 651 单片机 C 语言编程入门Easy 51 Kit Pro 配套学习资料 图2.5 MCS-51单片机最小系统 在学习板中的电路我们将会配合后面的例子逐步进行分析。中国科学技术大学业余无线电协会 751 单片机 C 语言编程入门Easy 51 Kit Pro 配套学习资料 中国科学技术大学业余无线电协会 83 MCS-51单片机的C语言编程 3.1 汇编语言 在学习51单片机的C语言编程之前,我们先来了解一
27、下汇编语言。使用汇编语言可以对单片机进行最直接的控制。每执行一条汇编语句,单片机就会执行一条指令。每执行一条汇编语句,单片机就会执行一条指令。下面是一些汇编语句的例子:LD AX,#0CCC2H ADD AX,CX 利用汇编语言对单片机编程,所编写的代码效率很高,但用汇编语言写程序尤其是较大型的程序十分费时,程序的移植也存在问题。所以现在多用C语言对单片机进行编程,再在必要的地方用汇编语言实现。本资料介绍的是单片机的C语言编程。尽管汇编语言在单片机程序开发中有着其固有的缺点,但对单片机的指令系统以及汇编语言有一定的了解,对编写出高质量的单片机C程序是很有帮助的对单片机的指令系统以及汇编语言有一
28、定的了解,对编写出高质量的单片机C程序是很有帮助的。3.2 建立你的第一个C项目 使用C语言肯定要使用到C编译器,以便把写好的C程序编译为机器码,这样单片机才能执行编写好的程序。Keil uVision2是众多单片机应用开发软件中优秀的软件之一,下面我们用Keil uVision2建立一个小程序项目。首先是运行Keil软件。运行几秒后,出现如图3.1的屏幕。接着按下面的步骤建立第一个项目:(1)点击Project菜单,选择弹出的下拉式菜单中的“New Project”,如图3.2。接着弹出一个标准Windows文件对话窗口,如图3.3。在“文件名”中输入你的第一个C程序项目名称,这里我们用“t
29、est”。“保存”后的文件扩展名为uv2,这是Keil uVision2项目文件扩展名,以后我们可以直接点击此文件以打开先前做的项目。图3.1 启动时的屏幕 51 单片机 C 语言编程入门Easy 51 Kit Pro 配套学习资料 图3.2 New Project菜单 图3.3 文件窗口 (2)选择所要使用的单片机,这里我们选择Atmel公司的AT89S52。此时屏幕如图3.4所示。完成上面步骤后,我们就可以编写程序了。中国科学技术大学业余无线电协会 951 单片机 C 语言编程入门Easy 51 Kit Pro 配套学习资料 中国科学技术大学业余无线电协会 10 (3)首先我们要在项目中创
30、建新的程序文件或加入旧程序文件。如果你没有现成的程序,那么就要新建一个程序文件。在这里我们以一个C程序为例介绍如何新建一个C程序和如何加到项目中。点击图3.5中1的新建文件的快捷按钮,在2中出现一个新的文字编辑窗口,这个操作也可以通过菜单“File”“New”或快捷键Ctrl+N来实现。现在可以编写程序了,光标已出现在文本编辑窗口中,等待我们的输入。下面是一段程序:#include#include void main(void)SCON=0 x50;/串口方式1,允许接收 TMOD=0 x20;/定时器1 定时方式2 TCON=0 x40;/设定时器1 开始计数 TH1=0 xE8;/22.1
31、184MHz 2400 波特率 TL1=0 xE8;TI=1;TR1=1;/启动定时器 while(1)printf(Hello World!n);/显示Hello World 值得注意的是,Keil的文本编辑器对中文的支持欠佳,所以读者在写程序时,可以考虑用英文对程序代码进行注释。本书中的代码多用中文注释仅是为了使读者阅读方便。值得注意的是,Keil的文本编辑器对中文的支持欠佳,所以读者在写程序时,可以考虑用英文对程序代码进行注释。本书中的代码多用中文注释仅是为了使读者阅读方便。(4)点击图3.5中的3保存新建的程序,也可以用菜单“File”“Save”或快捷键Ctrl+S进行保存。因是新文
32、件所以保存时会弹出类似图3.3的文件操作窗口,我们把第一个程序命名为“test1.c”,保存在项目所在的目录中,这时你会发现程序单词有了不同的颜色,说图3.4 选取芯片 51 单片机 C 语言编程入门Easy 51 Kit Pro 配套学习资料 中国科学技术大学业余无线电协会 11明Keil的C语法检查生效了。如图3.6鼠标在屏幕左边的“Source Group 1”文件夹图标上右击弹出菜单,在这里可以做在项目中增加减少文件等操作。我们选“Add File to Group Source Group 1”弹出文件窗口,选择刚刚保存的文件,按“ADD”按钮,关闭文件窗,程序文件已加到项目中了。这
33、时在“Source Group 1”文件夹图标左边出现了一个小“+”号,说明文件组中有了文件,点击它可以展开查看。(5)C程序文件已被我们加到了项目中了,下面就剩下编译运行了。这个项目我们只是用做学习新建程序项目和编译运行仿真的基本方法,所以使用软件默认的编译设置,它不会生成用于芯片烧写的hex文件。我们先来看图3.7,图中1、2、3都是编译按钮,不同的是1是用于编译单个文件。2是编译当前项目,如果先前编译过一次之后文件没有作过编辑改动,图3.5 新建程序文件 图3.6 把文件加入到项目中 51 单片机 C 语言编程入门Easy 51 Kit Pro 配套学习资料 中国科学技术大学业余无线电协
34、会 12这时再点击是不会再次重新编译的。3是重新编译,每点击一次均会再次编译链接一次,不管程序是否有改动。在3右边的是停止编译按钮,只有点击了前三个中的任一个,停止按钮才会生效。5是这三个按钮在菜单中相应的命令,效果和按钮是一样的。这个项目只有一个文件,你按1、2、3中的任一个都可以编译。在4中可以看到编译的错误信息和使用的系统资源情况等,以后我们要查错就靠它了。6是有一个小放大镜的按钮,这就是开启/关闭调试模式的按钮,它也在菜单“Debug”“Start/Stop Debug Session”中,快捷键为Ctrl+F5。(6)进入调试模式,软件窗口样式大致如图3.8所示。图中1为运行,当程序
35、处于停止状态时才有效,2为停止,程序处于运行状态时才有效。3是复位,模拟芯片的复位,程序回到最开头处执行。按4我们可以打开5中的串行调试窗口,这个窗口我们可以看到从51芯片的串行口输入输出的字符,这里的第一个项目也正是在这里看运行结果。这些在菜单中也有,这里不再一一介绍。首先按4打开串行调试窗口,再按运行键,这时就可以看到串行调试窗口中不断的打印“Hello World!”。这样就完成了第一个C项目。最后我们要停止程序运行回到文件编辑模式中,就要先按停止按钮再按开启/关闭调试模式按钮。然后我们就可以进行关闭Keil等相关操作了。到此为止,我们初步学习了一些Keil uVision2的项目文件创
36、建、图3.7 编译程序 51 单片机 C 语言编程入门Easy 51 Kit Pro 配套学习资料 中国科学技术大学业余无线电协会 13编译、运行和软件仿真的基本操作方法。3.3 生成hex文件 在开始学习C语言的主要内容时,我们先来看看如何用Keil uVision2来编译生成用于烧写芯片的hex文件。Hex文件格式是Intel公司提出的用来保存单片机或其他处理器的目标程序代码的文件格式。一般的编程器都支持这种格式。我们先来打开刚做的第一个项目,打开它的所在目录,找到test.Uv2的文件就可以打开先前的项目了。然后右击图3.9中的1项目文件夹,弹出项目功能菜单,选“Options for
37、TargetTarget1”,弹出项目选项设置窗口,同样先选中项目文件夹图标,这时在Project菜单中也有一样的菜单可选。打开项目选项窗口,转到“Output”选项页,如图3.10所示,图中1是选择编译输出的路径,2是设置编译输出生成的文件名,3则是决定是否要创建hex文件,选中它就可以输出hex文件到指定的路径中。现在我们重新编译一次,很快在编译信息窗口中就显示hex文件创建到指定的路径中了,如图3.11。这样我们就可用自己的编程器所附带的软件去读取并烧到芯片了。图3.8 调试运行程序 51 单片机 C 语言编程入门Easy 51 Kit Pro 配套学习资料 图3.9 项目功能菜单 图3
38、.10 项目选项窗口 中国科学技术大学业余无线电协会 1451 单片机 C 语言编程入门Easy 51 Kit Pro 配套学习资料 中国科学技术大学业余无线电协会 15 3.4 Keil C语言 相信读者们对标准C语言(ANSI C)已经十分熟悉。Keil中的C语言与ANSI C语言略有变化,下面对Keil C语言的介绍将着重介绍Keil C与ANSI C不同的地方。3.4.1 数据类型 3.4.1 数据类型 表3.1中列出了Keil uVision2 C51编译器所支持的数据类型。在标准C语言中基本的数据类型为char、int、short、long、float和double,而在C51编译
39、器中int和short相同,float和double相同,这里就不列出说明了。下面来看看它们的具体定义:数据类型 长 度 值域 unsigned char 单字节 0255 signed char 单字节-128+127 unsigned int 双字节 065535 signed int 双字节-32768+32767 unsigned long 四字节 04294967295 signed long 四字节-2147483648+2147483647 float 四字节 1.175494E-383.402823E+38 *13 字节 对象的地址 bit 位 0 或1 sfr 单字节 025
40、5 sfr16 双字节 065535 sbit 位 0 或1 1、char 字符类型 char类型的长度是一个字节,通常用于定义处理字符数据的变量或常量。分无符号字符类型unsigned char和有符号字符类型signed char,默认值为signed char类型。unsigned char类型用字节中所有的位来表示数值,所可以表达的数值范围是0255。signed char类型用字节中最高位字节表示数据的符号,“0”表示正数,“1”表示负数,负数用补码表示(正数的补码与原码相同,负二进制数的补码等于它的绝对值按位取反后加1)。所能表示的数值范围是-128+127。unsigned ch
41、ar常用于处理ASCII字符或用于处理小于或等于255 表3.1 KEIL uVision2 C51 编译器所支持的数据类型 图3.11 编译信息窗口 51 单片机 C 语言编程入门Easy 51 Kit Pro 配套学习资料 的整型数。在51单片机程序中,unsigned char是最常用的数据类型unsigned char是最常用的数据类型。2、int 整型 int整型长度为两个字节,用于存放一个双字节数据。分有符号int整型数signed int和无符号整型数unsigned int,默认值为signed int类型。signed int表示的数值范围是-32768+32767,字节中最
42、高位表示数据的符号,“0”表示正数,“1”表示负数。unsigned int表示的数值范围是065535。3、long 长整型 long长整型长度为四个字节,用于存放一个四字节数据。分有符号long长整型signed long和无符号长整型unsigned long,默认值为signed long类型。signed int表示的数值范围是-2147483648+2147483647,字节中最高位表示数据的符号,“0”表示正数,“1”表示负数。unsigned long表示的数值范围是04294967295。4、float 浮点型 float浮点型在十进制中具有7位有效数字,是符合IEEE-75
43、4标准的单精度浮点型数据,占用四个字节。5、*指针型 指针型本身就是一个变量,在这个变量中存放的指向另一个数据的地址。这个指针变量要占据一定的内存单元,对不同的处理器长度也不尽相同,在C51中它的长度一般为13个字节。6、bit 位标量 bit位标量是C51编译器的一种扩充数据类型bit位标量是C51编译器的一种扩充数据类型,利用它可定义一个位标量,但不能定义位指针,也不能定义位数组不能定义位指针,也不能定义位数组。它的值是一个二进制位,不是0就是1,类似一些高级语言中Boolean类型中的True和False。7、sfr 特殊功能寄存器 sfr也是一种扩充数据类型,占用一个内存单元,值域为0
44、255。利用它可以访问51单片机内部的所有特殊功能寄存器利用它可以访问51单片机内部的所有特殊功能寄存器。如用sfr P1=0 x90 这一句定P1为P1端口在片内的寄存器,在后面的语句中我们用P1=255(对P1 端口的所有引脚置高电平)之类的语句来操作特殊功能寄存器。8、sfr16 16 位特殊功能寄存器 sfr16占用两个内存单元,值域为065535。sfr16和sfr一样用于操作特殊功能寄存器,所不同的是它用于操作占两个字节的寄存器,如定时器T0和T1。9、sbit 可寻址位 sbit同样是C51中的一种扩充数据类型sbit同样是C51中的一种扩充数据类型,利用它可以访问芯片内部RAM
45、中的可寻址位或特殊功能寄存器中的可寻址位。如先前我们定义了 sfr P1=0 x90;/因P1 端口的寄存器是可位寻址的,所以我们可以定义 sbit P1_1=P11;/P1_1 为P1 中的P1.1 引脚 同样我们可以用P1.1的地址去写,如sbit P1_1=0 x91;中国科学技术大学业余无线电协会 1651 单片机 C 语言编程入门Easy 51 Kit Pro 配套学习资料 这样我们在以后的程序语句中就可以用P1_1来对P1.1引脚进行读写操作了。通常这些可以直接使用系统提供的预处理文件,里面已定义好各特殊功能寄存器的简单名字,直接引用可以省去一点时间。当然你也可以自己写自己的定义文
46、件,用你认为好记的名字。3.4.2 常量 3.4.2 常量 常量是在程序运行过程中不能改变值的量。变量的定义可以使用所有C51编译器支持的数据类型,而常量的数据类型只有整型、浮点型、字符型、字符串型和位标量。常量的数据类型说明是这样的:1、整型常量可以表示为十进制如123,0,-89等。十六进制则以0 x开头如0 x34,-0 x3B等。长整型就在数字后面加字母L,如104L,034L,0 xF340等。2、浮点型常量可分为十进制和指数表示形式。十进制由数字和小数点组成,如0.888,3345.345,0.0等,整数或小数部分为0,可以省略但必须有小数点。指数表示形式为数字.数字e数字,中的内
47、容为可选项,其中内容根据具体情况可有可无,但其余部分必须有,如125e3,7e9,-3.0e-3。3、字符型常量是单引号内的字符,如a,d等,不可以显示的控制字符,可以在该字符前面加一个反斜杠“”组成专用转义字符。常用转义字符表请见表3.2。4、字符串型常量由双引号内的字符组成,如“test”,“OK”等。当引号内的没有字符时,为空字符串。在使用特殊字符时同样要使用转义字符如双引号。在C中字符串常量是作为字符类型数组来处理的,在存储字符串时系统会在字符串尾部加上o转义字符以作为该字符串的结束符。字符串常量“A”和字符常量A是不同的,前者在存储时多占用一个字节的字间。5、位标量,它的值是一个二进
48、制。转义字符 含义 ASCII 码(16/10 进制)o 空字符(NULL)00H/0 n 换行符(LF)0AH/10 r 回车符(CR)0DH/13 t 水平制表符(HT)09H/9 b 退格符(BS)08H/8 f 换页符(FF)0CH/12 单引号 27H/39 双引号 22H/34 反斜杠 5CH/92 表3.2 常用转义字符表 常量可用在不必改变值的场合,如固定的数据表,字库等。常量的定义方式有几种,下面来加以说明。#define FALSE 0 x0;/用预定义语句可以定义常量#define TRUE 0 x1;/这里定义False 为0,True 为1/在程序中用到False 编
49、译时自动用0 替换,同理True 替换为1 unsigned int code a=100;/这一句用code 把a 定义在程序存储器中并赋值 const unsigned int a=100;/这一句用const关键字把a定义在RAM中并赋值 常量的合理使用可以提高程序的可读性、可维护性。常量的合理使用可以提高程序的可读性、可维护性。因此,一个非小型的高质量的单片机C程序必定会用到常量。上面介绍了定义常量的三种方法:宏定义、用code关键字定义中国科学技术大学业余无线电协会 1751 单片机 C 语言编程入门Easy 51 Kit Pro 配套学习资料 以及用const关键字定义。通过宏定义
50、的常量并不占用单片机的任何存储空间,而只是告诉编译器在编译时把标识符替换一下,这在资源受限的单片机程序中显得非常有用。用code关键字定义的常量放在单片机的程序存储器中;用const关键字定义的常量放在单片机的RAM中,要占用单片机的变量存储空间。单片机的程序存储器空间毕竟要比RAM大得多(S51、C51只有128字节的RAM空间,S52、C52只有256字节的RAM空间),所以当要定义比较大的常量数组时,用code关键字定义常量要比用const关键字定义合理一些。3.5 单片机 I/O 输入输出(I/O)是单片机的最基本功能。C51、C52、S51、S52 共有 4 个 I/O 端口,合共