本题的设计关键,在于理解好这3类汇编语言指令。此题参考源程序如下:这里要注意,片内ROM的5OH单元的数据,可以通过Kei1软件在进入调试状态以后事先设定好。例如,本题可以在存储器的窗口中输入命令c:0x50然后回车,在显示出来的存储单元中找到片内ROM的50H单元,该单元通常默认的值为00,用右键点击00后就会出现一个菜单,选择菜单的最后一项“更新存储器的值”,点击鼠标左键(如图3.2所示),在弹出的对话框中(如图3.3所示),输入题目中要求在片内ROM的50H单元中存放的数值27H,然后点击确定,这时片内ROM的50H单元的值就设定好了(如图3.4所示)。XA地址::0x50nnnnnn00000 : 0x0050:十进制000C: 0x0055:无符号有符号30C : 0x005A:0Ascii码存储器人存储器浮点R/W行:10列:1双精型更新存储器C:0x0050图1.2准备修改片内ROM的50H单元中的数值在C:0x0050输入字节输入项目条:例如:1,2,a,"Texas,-1,-227H0确定C取消图1.3修改片内ROM的50H单元中的数值K地址:e:0x502700000000C : 0x0050 :0000000000 : 0x0055 :0000000000C : 0x005A :存储器存储器#2人存储器#3人存储器#4数字行:10列:19R/W图1.4修改后片内ROM的50H单元中的数值为27H2.分支结构的汇编语言程序设计请完成如图3.5所示的符号函数功能设计。假定已知数据X,存放在片内RAM的50H单元(X的范围是一128~+127),通过符号函数表达式得到的结果Y,存放在片内RAM的51H7
7 本题的设计关键,在于理解好这 3 类汇编语言指令。此题参考源程序如下: 这里要注意,片内 ROM 的 50H 单元的数据,可以通过 Keil 软件在进入调试状态以后事 先设定好。例如,本题可以在存储器的窗口中输入命令 c:0x50 然后回车,在显示出来的存 储单元中找到片内 ROM 的 50H 单元,该单元通常默认的值为 00,用右键点击 00 后就会出现 一个菜单,选择菜单的最后一项“更新存储器的值”,点击鼠标左键(如图 3.2 所示),在弹 出的对话框中(如图 3.3 所示),输入题目中要求在片内 ROM 的 50H 单元中存放的数值 27H, 然后点击确定,这时片内 ROM 的 50H 单元的值就设定好了(如图 3.4 所示)。 图 1.2 准备修改片内 ROM 的 50H 单元中的数值 图 1.3 修改片内 ROM 的 50H 单元中的数值 图 1.4 修改后片内 ROM 的 50H 单元中的数值为 27H 2. 分支结构的汇编语言程序设计 请完成如图 3.5 所示的符号函数功能设计。假定已知数据 X,存放在片内 RAM 的 50H 单 元(X 的范围是-128~+127),通过符号函数表达式得到的结果 Y,存放在片内 RAM 的 51H
单元,请使用汇编语言的分支结构,根据图3.6所示的软件流程图编写程序。注意:在Kei1软件中,负数使用补码表示,一1的补码是OFFH。具体调试要求:(1)在KeilμVision2集成开发环境中,查询累加器A、程序计数器PC、通用寄存器ROR7以及程序状态字寄存器PSW各个标志位的数据。(2)在Kei1μVision2集成开发环境中,查询片内RAM的50H和51H中的数据。(3)使用单步调试的方式来执行不同分支的程序。在调试过程中,配合观察寄存器和存储器器窗口,检验程序的运行结果是否正确。(4)连续执行程序,配合观察寄存器和存储器的窗口,检验运行结果是否正确。当Y>01,y0,当X=0(-128≤X≤127)-1,当X<0图1.5符号函数的表达式【实验提示】:通常,符号函数仅仅是一个数学问题,但许多实际的单片机应用问题可以使用它作为数学模型。例如:关于产品的分类、包装、质量的鉴定都可以应用符号函数。如:成品打印“1”,半成品打印“0”,废品打印“-1”等等。这里可以使用JZ、JNB、SJMP等控制转移类指令,进行合理的搭配组合,从而完成多分支结构的程序设计,但要注意分支结构的执行顺序以及分支结果的保存,不要顺序混乱和结果丢失。另外,还要注意KeilμVision2集成开发环境中,负数使用补码来进行表示,调试过程中要特别留心。开始A-XX与O相比较YesX=0?INo+YesX<0?No★Y-OFFHY+1Y-0结束图1.6汇编语言程序实现符号函数的软件流程图3.选做题8
8 单元,请使用汇编语言的分支结构,根据图 3.6 所示的软件流程图编写程序。注意:在 Keil 软件中,负数使用补码表示,-1 的补码是 0FFH。具体调试要求: (1)在 Keil μVision2 集成开发环境中,查询累加器 A、程序计数器 PC、通用寄存器 R0~R7 以及程序状态字寄存器 PSW 各个标志位的数据。 (2)在 Keil μVision2 集成开发环境中,查询片内 RAM 的 50H 和 51H 中的数据。 (3)使用单步调试的方式来执行不同分支的程序。在调试过程中,配合观察寄存器和存 储器器窗口,检验程序的运行结果是否正确。 (4)连续执行程序,配合观察寄存器和存储器的窗口,检验运行结果是否正确。 图 1.5 符号函数的表达式 【实验提示】: 通常,符号函数仅仅是一个数学问题,但许多实际的单片机应用问题可以使用它作为数 学模型。例如:关于产品的分类、包装、质量的鉴定都可以应用符号函数。如:成品打印“1”, 半成品打印“0”,废品打印“-1”等等。这里可以使用 JZ、JNB、SJMP 等控制转移类指令, 进行合理的搭配组合,从而完成多分支结构的程序设计,但要注意分支结构的执行顺序以及 分支结果的保存,不要顺序混乱和结果丢失。另外,还要注意 Keil μVision2 集成开发环 境中,负数使用补码来进行表示,调试过程中要特别留心。 图 1.6 汇编语言程序实现符号函数的软件流程图 3. 选做题
在片内RAM的3OH开始的单元中存放5个2位十六进制数,编程将它们转换成ASCII码,并存放在40H开始的单元中。六。实验报告1.通过本次实验,总结汇编语言的顺序及分支结构程序的设计方法和注意事项。2.写出汇编程序的源代码,给每行语句加上详细的注释,并画出程序的流程图。3.掌握Keil软件如何进行程序的分支以及给存储单元进行赋值操作。4.叙述程序调试过程中遇到的困难以及解决方法,写出本次实验的收获和心得体会。七、实验和考核内容1.每人一组,独立完成。学会使用KeilμVision2集成开发环境之汇编语言的编程与调试,进行汇编语言源程序的设计、编译,掌握源程序编译出错提示信息的含义并加以改正,掌握目标代码的单步调试、测试数据的选择,了解运行结果是否反映程序的正确性。2.完成实验任务1(顺序结构的汇编语言程序设计),结果正确,给60分(百分制)。3.完成实验任务2(分支结构的汇编语言程序设计),结果正确,加20分。4.完成实验任务3(选做题),结果正确,加20分。9
9 在片内 RAM 的 30H 开始的单元中存放 5 个 2 位十六进制数,编程将它们转换成 ASCII 码, 并存放在 40H 开始的单元中。 六. 实验报告 1. 通过本次实验,总结汇编语言的顺序及分支结构程序的设计方法和注意事项。 2. 写出汇编程序的源代码,给每行语句加上详细的注释,并画出程序的流程图。 3. 掌握 Keil 软件如何进行程序的分支以及给存储单元进行赋值操作。 4. 叙述程序调试过程中遇到的困难以及解决方法,写出本次实验的收获和心得体会。 七、实验和考核内容 1. 每人一组,独立完成。学会使用 Keil μVision2 集成开发环境之汇编语言的编程与 调试,进行汇编语言源程序的设计、编译,掌握源程序编译出错提示信息的含义并加以改正, 掌握目标代码的单步调试、测试数据的选择,了解运行结果是否反映程序的正确性。 2. 完成实验任务 1(顺序结构的汇编语言程序设计),结果正确,给 60 分(百分制)。 3. 完成实验任务 2(分支结构的汇编语言程序设计),结果正确,加 20 分。 4. 完成实验任务 3(选做题),结果正确,加 20 分
实验二MCS-51单片机C语言编程练习一。实验目的1.掌握单片机KeilμVision2集成开发环境的使用方法。2.掌握使用C51语言进行顺序、分支、循环结构的程序设计方法。3.能够使用C51语言,独立设计出具有一定综合性的单片机应用程序,并与汇编语言的相应程序进行比较,加深理解。4.对应用问题能抽象出数学模型,绘制软件程序的流程图,并能用C51语言实现。二.预习与思考1.预习理论教材中“C51语言程序设计”的相关内容,掌握C51程序设计的基本方法、思路以及设计规范。2.预习理论教材中“C51程序设计”的相关例程。3.掌握单片机C51语言的调试方法,体会与标准C语言的异同。4.思考如何使用C51语言,对顺序、分支、循环结构的单片机应用程序进行设计,重点体会C51语言特有的设计方法与思想。三.实验原理1.单片机的C51语言简介通常,将一些能够对MCS一51系列单片机进行硬件操作的C语言统称为C51语言。在众多的C51语言中,功能最强、最受用户欢迎的是德国KEIL公司的KeilC51语言。单片机应用系统的程序设计,既可以采用汇编语言,也可以采用C51语言,两者各具特色。其中,汇编语言是一种用助记符来代表机器语言的符号语言。因为它最接近机器语言,所以汇编语言对单片机的操作直接、简捷,编写的程序紧凑、执行效率较高。但是,不同种类的单片机其汇编语言存在一定的差异。在一种单片机上开发的应用程序,通常不能直接应用到另一种单片机芯片上,如果进行程序的移植,难度也比较大。与此同时,汇编语言开发的程序可读性较差,不容易理解,特别是当单片机应用系统的规模比较大时,汇编语言的编程工作量非常大,从而影响应用系统的开发效率。相对而言,C51语言恰好可以克服汇编语言的一些缺欠。例如,C51语言可读性好、可移植性高,与自然语言比较接近,并且相同功能的程序使用C51语句的数量要远小于汇编语句。通常,C51语言的入门学习相对于汇编语言更容易,而且在C51语言的程序中还可以嵌套汇编语言,从而满足对执行效率或操作的一些特殊要求。因此在单片机应用系统的开发过程中,C51语言逐渐成为了主要的编程语言。2.单片机C51语言的数据类型C51语言的数据类型,既有与ANSIC语言通用的数据类型,也有自已所特有的数据类型。C51语言的具体数据类型见表5-1所示。从表中可以看出C51语言增加了bit、sfr、sfr16、sbit四种新的数据类型,分别用手定义2进制变量、特殊功能寄存器变量、16位特殊功能寄存器变量以及特殊功能位。另外,C51语言还有自己特有的变量存储类型以及存储模式,这里就不一一详述,具体可以参考理论教材的相关内容。10
10 实验二 MCS-51 单片机 C 语言编程练习 一. 实验目的 1. 掌握单片机 Keil μVision2 集成开发环境的使用方法。 2. 掌握使用 C51 语言进行顺序、分支、循环结构的程序设计方法。 3. 能够使用 C51 语言,独立设计出具有一定综合性的单片机应用程序,并与汇编语言 的相应程序进行比较,加深理解。 4. 对应用问题能抽象出数学模型,绘制软件程序的流程图,并能用 C51 语言实现。 二.预习与思考 1. 预习理论教材中“C51 语言程序设计”的相关内容,掌握 C51 程序设计的基本方法、 思路以及设计规范。 2. 预习理论教材中“C51 程序设计”的相关例程。 3. 掌握单片机 C51 语言的调试方法,体会与标准 C 语言的异同。 4. 思考如何使用 C51 语言,对顺序、分支、循环结构的单片机应用程序进行设计,重 点体会 C51 语言特有的设计方法与思想。 三. 实验原理 1. 单片机的 C51 语言简介 通常,将一些能够对 MCS—51 系列单片机进行硬件操作的 C 语言统称为 C51 语言。在 众多的 C51 语言中,功能最强、最受用户欢迎的是德国 KEIL 公司的 Keil C51 语言。单片 机应用系统的程序设计,既可以采用汇编语言,也可以采用 C51 语言,两者各具特色。其中, 汇编语言是一种用助记符来代表机器语言的符号语言。因为它最接近机器语言,所以汇编语 言对单片机的操作直接、简捷,编写的程序紧凑、执行效率较高。但是,不同种类的单片机 其汇编语言存在一定的差异。在一种单片机上开发的应用程序,通常不能直接应用到另一种 单片机芯片上,如果进行程序的移植,难度也比较大。与此同时,汇编语言开发的程序可读 性较差,不容易理解,特别是当单片机应用系统的规模比较大时,汇编语言的编程工作量非 常大,从而影响应用系统的开发效率。 相对而言,C51 语言恰好可以克服汇编语言的一些缺欠。例如,C51 语言可读性好、可 移植性高,与自然语言比较接近,并且相同功能的程序使用 C51 语句的数量要远小于汇编语 句。通常,C51 语言的入门学习相对于汇编语言更容易,而且在 C51 语言的程序中还可以嵌 套汇编语言,从而满足对执行效率或操作的一些特殊要求。因此在单片机应用系统的开发过 程中,C51 语言逐渐成为了主要的编程语言。 2. 单片机 C51 语言的数据类型 C51 语言的数据类型,既有与 ANSI C 语言通用的数据类型,也有自己所特有的数据类 型。C51 语言的具体数据类型见表 5-1 所示。从表中可以看出 C51 语言增加了 bit、sfr、sfr16、 sbit 四种新的数据类型,分别用于定义 2 进制变量、特殊功能寄存器变量、16 位特殊功能 寄存器变量以及特殊功能位。另外,C51 语言还有自己特有的变量存储类型以及存储模式, 这里就不一一详述,具体可以参考理论教材的相关内容
表2-1C51语言所支持的数据类型长度值域数据类型名称单字节unsigned char无符号字符型0~255单字节signed char有符号字符型128~+127unsigned int无符号整型双字节0~65535signed int有符号整型双字节32768~+32767四字节unsigned long无符号长整型0~4294967295signed long有符号长整型四字节2147483648~+2147483647float浮点型四字节±1.175494E—38~±3.402823E+38bit位位标量0或1sfr单字节特殊功能寄存器0~255sfr 1616位特殊功能寄存器双字节0~65535sbit特殊功能位位0或13.C51语言对单片机的SFR以及存储器的访问C51语言除了具有特殊的数据类型、存储类型以及存储模式外,C51语言还可以对SFR以及片内或片外的存储器单元进行直接访问。这里的SFR是指MCS-51单片机的特殊功能寄存器。8051单片机的SFR一共有21个,具体见表5-2所示。从表中可以看到,这么多的特殊功能寄存器,如果每一个都用数据类型sfr定义一遍再使用,就显得比较麻烦。那么如何不用定义,还能在C51语言中随时使用这21个特殊功能寄存器呢?方法也很简单,只要在每个C51程序中包含头文件<reg51.h>或者<reg52.h>或者<AT89X51.h>或者<AT89X52.h>中的任意一个,就可以在C51程序中任意使用这21个特殊功能寄存器。因为在这些头文件中已经将相应的特殊功能寄存器用数据类型sfr定义好了,所以当C51程序包含了上述的头文件以后就可以直接用SFR了,而不必再重新一个一个的来定义这些寄存器了。例如,给特殊功能寄存器P3口赋值为Oxff,程序可以这样编写:#include<reg51.h>//包含21个特殊功能寄存器地址定义的头文件voidmain()1P3=0xff;//给P3口赋值为0xff11另外,C51语言还可以直接访问片内或片外的存储单元,这时需要在程序中包含绝对地址访问头文件<absacc.h>。这个头文件使得C51语言对存储器单元的访问变得更加简便,在<absacc.h>头文件中提供了一些对存储单元进行访问的宏定义,具体如下:(1)CBYTE[data]:该宏定义代表对单片机的片内ROM单元进行访问。(2)DBYTE[data]:该宏定义代表对单片机的片内RAM单元进行读写操作。(3)XBYTE[data]:该宏定义代表对单片机的片外RAM单元进行读写操作。11
11 表 2-1 C51 语言所支持的数据类型 3. C51 语言对单片机的 SFR 以及存储器的访问 C51 语言除了具有特殊的数据类型、存储类型以及存储模式外,C51 语言还可以对 SFR 以及片内或片外的存储器单元进行直接访问。这里的 SFR 是指 MCS-51 单片机的特殊功能寄 存器。8051 单片机的 SFR 一共有 21 个,具体见表 5-2 所示。从表中可以看到,这么多的特 殊功能寄存器,如果每一个都用数据类型 sfr 定义一遍再使用,就显得比较麻烦。那么如何 不用定义,还能在 C51 语言中随时使用这 21 个特殊功能寄存器呢?方法也很简单,只要在 每个 C51 程序中包含头文件<reg51.h>或者<reg52.h>或者<AT89X51.h>或者<AT89X52.h>中 的任意一个,就可以在 C51 程序中任意使用这 21 个特殊功能寄存器。因为在这些头文件中 已经将相应的特殊功能寄存器用数据类型 sfr 定义好了,所以当 C51 程序包含了上述的头文 件以后就可以直接用 SFR 了,而不必再重新一个一个的来定义这些寄存器了。例如,给特殊 功能寄存器 P3 口赋值为 0xff,程序可以这样编写: //- #include <reg51.h> //包含 21 个特殊功能寄存器地址定义的头文件 void main( ) { P3=0xff; //给 P3 口赋值为 0xff } //- 另外,C51 语言还可以直接访问片内或片外的存储单元,这时需要在程序中包含绝对地 址访问头文件<absacc.h>。这个头文件使得 C51 语言对存储器单元的访问变得更加简便,在 <absacc.h>头文件中提供了一些对存储单元进行访问的宏定义,具体如下: (1)CBYTE[data]:该宏定义代表对单片机的片内 ROM 单元进行访问。 (2)DBYTE[data]:该宏定义代表对单片机的片内 RAM 单元进行读写操作。 (3)XBYTE[data]:该宏定义代表对单片机的片外 RAM 单元进行读写操作