在这里举一个例子:例如要从单片机片内ROM的3OH单元中读出数据,给片内RAM的5OH单元,然后再从片内RAM的50H单元将该数据写入到片外RAM的ABCDH单元中。相应的C51语言程序可以这样编写:1#include<absacc.h>1/包含绝对地址访问头文件CBYTE[0x30]#define//定义片内ROM的30H单元a#definebDBYTE[0x50]//定义片内RAM的50H单元#defineXBYTE[OxABCD]//定义片外RAM的ABCDH单元cvoid main()(b=a:c =b; }//各个存储单元间相互赋值表2-28051单片机的特殊功能寄存器符号地址注释符号地址注释POIP0x80并口PO0xD8中断优先控制寄存器P10x870x90并口PIPCON波特率选择寄存器P2OxAO并口P2SCON串行口控制器0x98P30xBOSBUF并口P30x99串行数据缓冲器PSW0xDOTCON0x88程序状态字定时器控制寄存器ACCOxEO累加器TMOD0x89定时器方式选择寄存器BOxFOTLO乘除法寄存器0x8A定时器0低8位SPTL10x81堆栈指针0x8B定时器0高8位DPL0x82THO0x8C数据指针低8位定时器1低8位DPH0x83THI数据指针高8位0x8D定时器1高8位IE0xA8中断允许控制寄存器4.C51语言对特殊功能位的访问C51语言除了可以对特殊功能寄存器进行整体访问以外,还可以对特殊功能寄存器的各个二进制位进行访问。通常把特殊功能寄存器中的各个二进制位,称为特殊功能位。C51语言若想对这些特殊功能位进行操作,事先要完成两步工作:第一步,先将特殊功能位所在的特殊功能寄存器进行定义或者在程序中直接包括已经定义了特殊功能寄存器的头文件,例如reg51.h,建议直接包含头文件:第二步,使用C51语言特有的数据类型sbit定义特殊功能位,然后用户的C51程序就可以对这些特殊功能位进行操作了。在这里举一个例子:例如要对单片机特殊功能寄存器P1口的两个特殊功能位进行赋值操作,使P1.1=0,而P1.6=1。相应的C51语言程序可以这样编写:#include<reg5l.h>//包含21个特殊功能寄存器地址定义的头文件sbita = P1'1;//定义P1口的特殊功能位P1.1为asbitb = P1'6;//定义P1口的特殊功能位P1.6为b12
12 在这里举一个例子:例如要从单片机片内 ROM 的 30H 单元中读出数据,给片内 RAM 的 50H 单元,然后再从片内 RAM 的 50H 单元将该数据写入到片外 RAM 的 ABCDH 单元中。相应的 C51 语言程序可以这样编写: //- #include <absacc.h> //包含绝对地址访问头文件 #define a CBYTE[0x30] //定义片内 ROM 的 30H 单元 #define b DBYTE[0x50] //定义片内 RAM 的 50H 单元 #define c XBYTE[0xABCD] //定义片外 RAM 的 ABCDH 单元 void main( ) { b = a; c = b; } //各个存储单元间相互赋值 //- 表 2-2 8051 单片机的特殊功能寄存器 4. C51 语言对特殊功能位的访问 C51 语言除了可以对特殊功能寄存器进行整体访问以外,还可以对特殊功能寄存器的各 个二进制位进行访问。通常把特殊功能寄存器中的各个二进制位,称为特殊功能位。C51 语 言若想对这些特殊功能位进行操作,事先要完成两步工作:第一步,先将特殊功能位所在的 特殊功能寄存器进行定义或者在程序中直接包括已经定义了特殊功能寄存器的头文件,例如 reg51.h,建议直接包含头文件;第二步,使用 C51 语言特有的数据类型 sbit 定义特殊功能 位,然后用户的 C51 程序就可以对这些特殊功能位进行操作了。在这里举一个例子:例如要 对单片机特殊功能寄存器 P1 口的两个特殊功能位进行赋值操作,使 P1.1=0,而 P1.6=1。相 应的 C51 语言程序可以这样编写: //- #include <reg51.h> //包含 21 个特殊功能寄存器地址定义的头文件 sbit a = P1^1; //定义 P1 口的特殊功能位 P1.1 为 a sbit b = P1^6; //定义 P1 口的特殊功能位 P1.6 为 b
void main()mea=0://给特殊功能位P1.1赋值为0b=1;//给特殊功能位P1.6赋值为111/四.实验设备和器件1.PC机一台,操作系统为WindowsXP,内存256MB以上,硬盘10GB以上。2.KeilμVision2集成开发环境。五.实验内容1..顺序结构的C51语言程序设计给特殊功能寄存器和特殊功能位赋值。请使用C51语言,给单片机的P2口赋值为0x00,并使P3口的特殊功能位P3.2=0,P3.3=0,P3.6=0,要求在Kei1软件中仿真P2口和P3口的功能,并看到实际的调试结果。具体调试要求:(1)在KeilμVision2环境中,掌握查看各并行口数据的方法。(2)在KeilμVision2环境中,如何对并行口的各个二进制位进行赋值和观察。(3)使用单步调试的方式来执行程序。在调试过程中,配合观察并口寄存器的窗口,检验程序的运行结果是否正确。(4)连续执行程序,在执行的过程中,配合观察并口寄存器窗口,检验程序运行结果。【实验提示】:此题主要使用C51语言,对特殊功能寄存器以及特殊功能位进行赋值。如何在Kei1软件中仿真调试4个并行I/0口,是此题要掌握的一个重要知识点,它将会对以后单片机硬件部分的软件仿真打下基础。此题的参考程序代码如下:T21.C程序//文件名称:T21.c//程序功能:给特殊功能寄存器以及特殊功能位赋值。//编制时间:2010年1月1/-#include<reg51.h>//包含定义51单片机寄存器的头文件sbita=P3°2;//定义P3口引脚P3.2sbitb=P3°3;//定义P3口引脚P3.3sbitc=P3°6;//定义P3口引脚P3.6voidmain()//主函数P2=0x00;//给P2口赋值为00a=0;b=0: c=0://P3.2、P3.3、P3.6引脚赋值为011/T21.C程序结束13
13 void main( ) { a = 0; //给特殊功能位 P1.1 赋值为 0 b = 1; //给特殊功能位 P1.6 赋值为 1 } //- 四. 实验设备和器件 1. PC 机一台,操作系统为 Windows XP,内存 256MB 以上,硬盘 10GB 以上。 2. Keil μVision2 集成开发环境。 五. 实验内容 1. 顺序结构的 C51 语言程序设计 给特殊功能寄存器和特殊功能位赋值。请使用 C51 语言,给单片机的 P2 口赋值为 0x00, 并使 P3 口的特殊功能位 P3.2=0,P3.3=0,P3.6=0,要求在 Keil 软件中仿真 P2 口和 P3 口 的功能,并看到实际的调试结果。具体调试要求: (1)在 Keil μVision2 环境中,掌握查看各并行口数据的方法。 (2)在 Keil μVision2 环境中,如何对并行口的各个二进制位进行赋值和观察。 (3)使用单步调试的方式来执行程序。在调试过程中,配合观察并口寄存器的窗口,检 验程序的运行结果是否正确。 (4)连续执行程序,在执行的过程中,配合观察并口寄存器窗口,检验程序运行结果。 【实验提示】: 此题主要使用 C51 语言,对特殊功能寄存器以及特殊功能位进行赋值。如何在 Keil 软 件中仿真调试 4 个并行 I/O 口,是此题要掌握的一个重要知识点,它将会对以后单片机硬件 部分的软件仿真打下基础。此题的参考程序代码如下: //-T21.C 程序- //文件名称:T21.c //程序功能:给特殊功能寄存器以及特殊功能位赋值。 //编制时间:2010 年 1 月 //- #include <reg51.h> //包含定义 51 单片机寄存器的头文件 sbit a=P3^2; //定义 P3 口引脚 P3.2 sbit b=P3^3; //定义 P3 口引脚 P3.3 sbit c=P3^6; //定义 P3 口引脚 P3.6 void main( ) //主函数 { P2=0x00; //给 P2 口赋值为 00 a=0; b=0; c=0; //P3.2、P3.3、P3.6 引脚赋值为 0 } //- T21.C 程序结束-
在这里,对如何使用Kei1软件仿真调试PO~P3四个并行I/O口进行简要的介绍。当在Kei1环境中把程序编写完毕以后,并编译为0个错误0个警告时,点击“调试菜单下的“开始/停止调试选项”,这时进入到调试环境。若想观察POP3这四个并行口的软件仿真结果,首先需要将这四个并行口打开,可以点击“外围设备菜单下的“I/0-Ports选项”,该选项会指示出Port0~Port3也就是单片机的PO口~P3口,具体如图5.1所示。由于本题只使用P2和P3口,因此用左键点击Port2和Port3就会显示P2和P3口的当前状态,如图5.2所示。从图中可以看出,P2和P3口的初始默认值都为0xff。这里有个小技巧,每个并行口都有8个特殊功能位,例如P2口的8位是P2.0~P2.7,它们在图中用小方格依次从右向左排列,其中最右侧的小方格代表P2.0,最左侧的小方格代表P2.7,8个二进制位的值就是整个P2口的值,而每个二进制位的值可以通过它们各自小方格的状态看到。当小方格的下面画的是“对号”时,代表相应的二进制位为1,由于4个并行口初始状态时,8个小方格都是“对号”,所以每个并口的初始值都是Oxff:当相应二进制位下的小方格状态为“空白”时,那么这个小方格对应的二进制位就是0,如果8个小方格的状态都为空白,则整个并口的值为00。当从图5.2中看到P2和P3口的初始状态都为0xff时,接下来可以按快捷键F10来单步执行程序,边按F10快捷键时,要边看P2和P3口的状态是否按照程序的设计要求进行了相应的改变。一直按F10键,直到程序单步执行完毕,这时执行的结果如图5.3所示。从图中可以看出,P2口的8个小方格都是“空白”状态,因此P2口的值为0x00,而从下面的P3口也可以看到P3.2、P3.3以及P3.6的小方格状态都是空白的,所以它们的值是0,其他各个二进制位的状态是1。综上所述,从图5.3中可以看出此时P2=0x00,P3.2=0,P3.3=0,P3.6=0,满足题目的要求。至此,已经将Kei1软件下如何仿真四个并行口的方法介绍完毕,希望大家多练习,全面掌握。WP0P3-uVision2[E:keiliUv2lpOplp2p3.c]自E文件 E编辑 Y视图工程D调试R外围设备工具 SVCS 窗口H帮助RSTC复位CPU品电脑中日Interrupt?SEm00I/0-PortsPort Q#include<reg5]SerialPort 1sbita=P3^2;、TimerPort2Port3sbitb=P3^3:sbitC=P3^6;void main()P2=0x00;a=0;b=0c=0;图2.1并行口PO~P3在Keil软件中的打开方式14
14 在这里,对如何使用 Keil 软件仿真调试 P0~P3 四个并行 I/O 口进行简要的介绍。当在 Keil 环境中把程序编写完毕以后,并编译为 0 个错误 0 个警告时,点击“调试菜单下的‘开 始/停止调试’选项”,这时进入到调试环境。若想观察 P0~P3 这四个并行口的软件仿真结 果,首先需要将这四个并行口打开,可以点击“外围设备菜单下的‘I/O-Ports’选项”,该 选项会指示出 Port 0~Port 3 也就是单片机的 P0 口~P3 口,具体如图 5.1 所示。由于本 题只使用 P2 和 P3 口,因此用左键点击 Port 2 和 Port 3 就会显示 P2 和 P3 口的当前状态, 如图 5.2 所示。从图中可以看出,P2 和 P3 口的初始默认值都为 0xff。这里有个小技巧,每 个并行口都有 8 个特殊功能位,例如 P2 口的 8 位是 P2.0~P2.7,它们在图中用小方格依次 从右向左排列,其中最右侧的小方格代表 P2.0,最左侧的小方格代表 P2.7,8 个二进制位 的值就是整个 P2 口的值,而每个二进制位的值可以通过它们各自小方格的状态看到。当小 方格的下面画的是“对号”时,代表相应的二进制位为 1,由于 4 个并行口初始状态时,8 个小方格都是“对号”,所以每个并口的初始值都是 0xff;当相应二进制位下的小方格状态 为“空白”时,那么这个小方格对应的二进制位就是 0,如果 8 个小方格的状态都为空白, 则整个并口的值为 00。 当从图 5.2 中看到 P2 和 P3 口的初始状态都为 0xff 时,接下来可以按快捷键 F10 来单 步执行程序,边按 F10 快捷键时,要边看 P2 和 P3 口的状态是否按照程序的设计要求进行了 相应的改变。一直按 F10 键,直到程序单步执行完毕,这时执行的结果如图 5.3 所示。从图 中可以看出,P2 口的 8 个小方格都是“空白”状态,因此 P2 口的值为 0x00,而从下面的 P3 口也可以看到 P3.2、P3.3 以及 P3.6 的小方格状态都是空白的,所以它们的值是 0,其他各 个二进制位的状态是 1。综上所述,从图 5.3 中可以看出此时 P2=0x00,P3.2=0,P3.3=0, P3.6=0,满足题目的要求。至此,已经将 Keil 软件下如何仿真四个并行口的方法介绍完毕, 希望大家多练习,全面掌握。 图 2.1 并行口 P0~P3 在 Keil 软件中的打开方式
POP3uVision2-[E:lkeil\UV2\pOplp2p3.ce]目E文件E编辑 Y视图工程 D调试 E外围设备T工具 SVCS 坐窗口 H帮助启子二老东山RST08包网告口力#include<reg51.h>Parallel Port 2Xsbita=P3^2;Port2Bits0sbitb=P3^3;P2:0xFFsbitC=P3^6;"insOxFFvoid main()Parallel Port 3XPort3Bits0P2=0x00:P3:0xFFa=0;b=0;c=0;OxFFins:图2.2并行口P2和P3的初始默认值P0P3-uVision2-[E:tkeiiUV2lpOplp2p3.c】自E文件 编辑视图日 P工程 D调试 R外围设备 I工具 SVCS置窗口 H帮助O智口日C霸萬0国家收口力公白RST包#include<reg51.h>Parallel Port 2Xsbita=P3^2;PortBits1sbitb=P3^3:P2:0x00C=P3^6;sbit0x00void main()Parallel Port 3XL-Port 3Bits0P2=0x00;P3:0xB3Ra=0;b=0;c=0;0xB3PRERLTS办图2.3并行口P2和P3的执行结果图2.分支结构的C51语言程序设计将ASCII码转换成16进制数。已知,一个16进制数的ASCII码,存放在片内RAM的30H单元,请把这个数的16进制表示方式存于片内RAM的31H单元中,软件流程如图5.4所示。具体程序的调试要求如下:15
15 图 2.2 并行口 P2 和 P3 的初始默认值 图 2.3 并行口 P2 和 P3 的执行结果图 2. 分支结构的 C51 语言程序设计 将 ASCII 码转换成 16 进制数。已知,一个 16 进制数的 ASCII 码,存放在片内 RAM 的 30H 单元,请把这个数的 16 进制表示方式存于片内 RAM 的 31H 单元中,软件流程如图 5.4 所示。具体程序的调试要求如下:
(1)在KeiluVision2环境中,掌握查看各并行口数据的方法。(2)在KeiluVision2环境中,如何对并行口的各个二进制位进行赋值和观察。(3)使用单步调试的方式来执行程序。在调试过程中,配合观察并口寄存器的窗口,检验程序的运行结果是否正确。(4)连续执行程序,在执行的过程中,配合观察并口寄存器窗口,检验程序运行结果。【实验提示】:本题主要是对ASCII码与16进制数之间进行转换,同时加强C51语言的分支结构程序设计。对于16进制数中0~9的ASCII码值比16进制数本身大30H,而16进制数中A~F的ASCII码值比16进制数本身大37H,只要掌握好这些对应关系,使用if-else语句这道题目就很容易完成。开始在片内RAM的30H单元设置ASCII码否ASCII码比0x39大?是将ASCII码减0x37将ASCI码减0x30赋给片内RAM的31H单元图2.4ASCII码与16进制数转换的软件流程图3.循环结构的C51语言程序设计片内及片外RAM中的块数据传送。请使用C51语言,将片内RAM的20H~29H单元中的数据,传送给片外RAM的ABCOH~ABC9H单元,软件流程如图2.5所示。具体程序的调试要求如下:(1)在KeilμVision2环境中,打开片内RAM和片外RAM的存储器窗口。(2)在Kei1μVision2环境中,如何给片内RAM的20H~29H单元同时赋值。(3)使用单步调试的方式执行程序,配合观察存储器窗口,检验程序运行结果是否正确。(4)连续执行程序,在执行的过程中,配合观察存储器窗口,检验程序运行结果。【实验提示】:此题主要练习对片内和片外RAM单元的理解,以及如何查询、修改片内外RAM单元中所存储的数据,同时用于加强C51语言的循环结构程序设计。这里需要注意循环变量的16
16 (1)在 Keil μVision2 环境中,掌握查看各并行口数据的方法。 (2)在 Keil μVision2 环境中,如何对并行口的各个二进制位进行赋值和观察。 (3)使用单步调试的方式来执行程序。在调试过程中,配合观察并口寄存器的窗口,检 验程序的运行结果是否正确。 (4)连续执行程序,在执行的过程中,配合观察并口寄存器窗口,检验程序运行结果。 【实验提示】: 本题主要是对 ASCII 码与 16 进制数之间进行转换,同时加强 C51 语言的分支结构程序 设计。对于 16 进制数中 0~9 的 ASCII 码值比 16 进制数本身大 30H,而 16 进制数中 A~F 的 ASCII 码值比 16 进制数本身大 37H,只要掌握好这些对应关系,使用 if-else 语句这道 题目就很容易完成。 图 2.4 ASCII 码与 16 进制数转换的软件流程图 3. 循环结构的 C51 语言程序设计 片内及片外 RAM 中的块数据传送。请使用 C51 语言,将片内 RAM 的 20H~29H 单元中的 数据,传送给片外 RAM 的 ABC0H~ABC9H 单元,软件流程如图 2.5 所示。具体程序的调试要 求如下: (1)在 Keil μVision2 环境中,打开片内 RAM 和片外 RAM 的存储器窗口。 (2)在 Keil μVision2 环境中,如何给片内 RAM 的 20H~29H 单元同时赋值。 (3)使用单步调试的方式执行程序,配合观察存储器窗口,检验程序运行结果是否正确。 (4)连续执行程序,在执行的过程中,配合观察存储器窗口,检验程序运行结果。 【实验提示】: 此题主要练习对片内和片外 RAM 单元的理解,以及如何查询、修改片内外 RAM 单元 中所存储的数据,同时用于加强 C51 语言的循环结构程序设计。这里需要注意循环变量的