实验指导书【实验项目】实验一:单片微机软件实验【实验设备】Keil μvision4软件、计算机【实验目的】1、熟悉Keil μvision4操作环境2、掌握单片机C51编程技巧3、掌握单片机存储器读写等基本操作【实验内容及步骤】一、实验内容1:存储块清零1. 实验目的(1)掌握存储器读写方法。
(2)了解存储器的块操作方法。
(3)掌握内存数据的观察方法。
2. 实验原理(1)数据存储类型在讨论C51的数据类型时,必须同时提到它的存储类型,以及它与51单片机存储结构的关系,因为C51定义的任何数据类型必须以一定的方式定位在51单片机的某一存储区中,否则没有任何实际意义。
内部数据存储区可分为3个不同的数据存储类型:DATA、IDATA和BDATA。
DATA区寻址是最快的,应该把经常使用的变量放在DATA区,但是其存储空间有限,DATA区除了包含程序变量外,还包括了堆栈和寄存器组。
DATA区声明中的存储类型标识符为data,声明方法为:Unsigned int data uint_ id[8];BDATA区是DATA中的位寻址区,在这个区中声明变量就可进行位寻址。
BDATA区声明中的数据类型标识符为bdata,声明方法:Unsigned int bdata status_byte;IDATA区使用寄存器作为指针来进行间接寻址,常用来存放使用比较频繁的变量。
与外部存储器寻址相比,它的指令执行周期和代码长度相对较短。
IDATA区声明中的存储类型标识符为idata,声明方法:Unsigned int data uint_ id[8];访问片外数据存储区比访问片内存储区慢,因为片外数据存储区是通过数据指针加载地址来间接寻址访问的。
C51提供两种不同的数据存储类型xdata和pdata来访问片外数据存储区。
PDATA区只有256字节,仅指定256字节的外部数据存储区。
但XDATA区最多可达64KB,对应的xdata存储类型标识符可以指定外部数据区64KB内的任何地址。
声明方法:Unsigned int pdata uint_ id[8];Char xdata inp_ string[16];程序存储区只能读不能写,可能在51单片机的内部或者外部,或者内外部都有,由单片机的硬件决定,C51提供了code存储类型来访问程序存储区。
声明方法:Unsigned char code a[]={0x00,0x01,0x02,0x03,0x04,0x05};(2)数据查看方法通过本实验,学生可以了解单片机读写存储器的读写方法,同时也可以了解单片机编程,调试方法。
如何将存储块的内容置成某固定值(如填充为0ffh),请大家完成此操作。
在仿真程序编译后:点击按钮,在点击如下图按钮后,下方会出现Address工具栏,在Address栏中输入的地址,其中D表示数据的位于DATA区,0x20表示所要显示的内存块的起始地址。
通过改变表中地址内容,查看地址单元中的内容是否被改变。
这三个按钮可以复位CPU运行程序,暂停程序。
查看不同数据存储区域的方法:DATA区——D:8位地址XDATA区——X:16位地址CODE区——C:16位地址IDATA区——I:8位地址3. 参考程序数据块清零参考程序。
#include <reg51.h>unsigned char xdata Buffer[256] _at_ 0x3000;void main(){unsigned int index;unsigned char xdata *ptr;ptr=&Buffer;for(index=0;index<=255;index++){*ptr++=0;}}4. 程序框图数据块清零寄存器如图1-1 (a),寄存器操作流程如图1-1 (b)。
图1-1 (a)数据块清零流程图,(b)寄存器操作流程图5. 实验报告要求(1)按照给出的参考程序,指定存储器中某块的起始地址和长度,并能将其内容清零。
参照实验原理中的“数据查看方法”,验证程序执行结果,截图保存,并解释程序实现的功能。
(2)根据流程图1-1(b),在程序模板中填入以下语句对应的程序。
(附程序模板)a. 在累加器A中写入立即数25H,向片内RAM的30H单元写入立即数78H;b. 将片内RAM中30H单元的数据内容复制到工作寄存器R3中;c. 向寄存器DPTR中写入立即数F637H;d. 将DPTR寄存器的内容的低8位传给片内RAM的35H单元;e. 将DPTR寄存器中的高8位传送给片内RAM的36单元。
程序模板:#include <reg51.h>unsigned char data *iRAM=0x00; //片内RAM区定义unsigned char data *R=0x00; //寄存器R定义void main(){}(3)实验总结与思考:观察CPU带电复位后内存单元中的数据变化情况。
二、实验内容2:二进制到BCD转换1. 实验目的(1)掌握简单的数值转换方法。
(2)基本了解数值的各种表达方法。
2. 实验内容(1)编程实现将二进制码转换成BCD码。
(2)编程实现两个字节的BCD转换码换成二进制码。
3. 实验原理计算机中的数值有各种表达方式,这是计算机的基础。
掌握各种数制之间的转换是一种基本功。
(1)十进制数我们熟悉的十进制数有两个主要特点:① 10个不同的数字符号:0、1、2、 (9)②低位向高位进、借位的规律是“逢十进一”“借一当十”的原则进行计数。
例如,1234.45=1×103+2×102+3×101+4×100+4×10−1+5×10−2,其中的10被称为十进制的基数,103、102、101、100、10−1、10−2成为各数位的权。
(2)二进制数在二进制数中只有两个不同的数码:0和1,进位规律是“逢二进一”“借一当二”的计数原则进行计数。
二进制数用B结尾表示。
例如,二进制数1101 1011.01可以表示为(11011011.01)2= 1×27+1×26+0×25+1×24+1×23+0×22+1×21+1×20+0×2−1+1×2−2。
(3)十六进制数在十六进制数中有0、1、2、…、A、B、C、D、E、F共16个不同的数码,采用“逢十六进一”“借一当十六”的计数原则进行计数。
十六进制数用H结尾表示。
如十六进制数(4E9.27)H =4×162+14×161+9×160+2×16−1+7×16−2。
(4)二-十进制BCD码(Binary-Code Decimal)二-十进制BCD码是指每位十进制数用4位二进制数编码表示。
由于4位二进制数可以表示16种状态,可丢弃最后6种状态,而选用0000~1001来表示0~9十个数符。
这种编码又叫8421码,如表1-1所示。
(5)keil软件中变量查看方法利用keil软件中的watch窗口可以查看程序中变量、数组等的运行后的取值,如下图点开按钮在右下角弹出的watch1窗口中输入变量名(如“c”),在value下查看变量具体状态:4. 程序框图二进制码转换成所示。
图1-25. 参考程序void main(){unsigned char Result[3];unsigned char Number;Number=0x7b;Result[0]=________; //取出百位对应数字Result[1]=________; //取出十位对应数字Result[2]=________; //取出个位对应数字 }6. 实验报告要求(1)根据注释信息补充上述参考程序,实现将二进制码转换BCD码。
(2)运行参考程序并在利用实验原理中的(5),在“Watch1”窗口中查看变量具体值,并截图保存。
(3)设计将两个字节的BCD码转换成二进制码的流程图。
(4)总结二进制与BCD码之间转换的基本思想。
三、实验内容3:BCD码到ASCII码转换1. 实验目的(1)了解BCD码和ASCII值的区别。
(2)了解如何将BCD值转换成ASCII值。
(3)了解如何查表进行数值转换及快速运算。
2. 实验内容本实验主要让学生了解数值和BCD码和ASCII码的区别,利用查表功能快速地进行数值转换。
进一步了解数值的各种表达方式。
(1)编程实现将给定的一个BCD码转换成ASCII码。
(2)编程实现将给定的一个ASCII码转换成BCD码。
3. 实验原理计算机使用最多、最普遍的是ASCII(American Standard Code For Information Interchange)字符编码,即美国信息交换标准代码,如下表所示。
图1-3 7位ASCII代码表ASCII码的每个字符用7位二进制数表示,其排列次序为d6d5d4d3d2d1d0,d6为高位,d0为低位。
而一个字符在计算机内实际用8位表示。
正常情况下,最高位d7为“0”。
7位二进制数共有128种编码组合,可表示128个字符,其中数字10个、大小写英文字母52个、其他字符32个和控制字符34个。
要确定某个字符的ASCII码,在表中可查到他的位置,然后确定它所在的位置相应的列和行,最后根据列确定高位码(d6d5d4),根据行确定低位码(d3d2d1d0),把高位码与低位码合在一起就是该字符的ASCII码。
例如,数字9的ASCII码为00111001B,即十六进制为39H;字符A的ASCII为01000001,即十六进制为41H等。
数字0~9的ASCII码为30H~39H,大写英文字母A~Z的ASCII 码为41H~5AH,小写英文字母a~z的ASCII码为61H~7AH。
ASCII码主要用于微机与外设的通信,当微机接受键盘信息、微机输出到打印机、显示器等信息都是以ASCII码形式进行数据传输。
4. 程序框图将给定的一个BCD1-4所示。
图5. 参考程序#include <reg51.h>//将变量Number拆成2个ASCII码,并存入Result数组//定义数字对应的ASCII码表: 0~9, a~funsigned char codeASCIITable[16]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, 0x38,0x39,0x61,0x62,0x63,0x64,0x65,0x66};void main(){unsigned char Result[2];unsigned char Number;Number=26;Result[0]=ASCIITable[Number/16]; //高四位Result[1]=ASCIITable[Number&0xf]; //低四位}6. 实验报告要求(1)运行上述参考程序,并在“Watch1”窗口中查看变量结果并截图保存。