一、实验目的
1、 掌握RAM的读写方法;
2、 理解RAM和ROM的作用;
3、 熟练Proteus仿真软件的使用;
4、 熟练单片机实验箱的实验操作。
二、实验预习要求
1、主要知识点概述:掌握单片机RAM的结构;学会RAM的读写。
2、实验效果说明:将存入的RAM的数值读出用数码管显示出来。
三、实验设备和器件
一台PC 机
一套 PROTEUS 仿真软件
一台实验箱
一台ISP 下载器
一台51单片机仿真器 (可选)
四、实验要求
1、在 DATA区定义一个字符变量并写入数据,把写入RAM中的数据读出来并用数码管显示出来。
五、实验原理
数据存储器用于存放中间运算结果、数据暂存和缓冲、标识位等。80C51系列单片机的片内数据存储器除RAM块外。还有特殊功能寄存器(SFR)块。 通过查询AT89C52的数据手册可以知道:
AT89C52 有 256 个字节的内部RAM,80H-FFH 高128 个字节与特殊功能寄存器(SFR)地址是重叠的,也就是高128字节的RAM 和特殊功能寄存器的地址是相同的,但物理上它们是分开的。
当一条指令访问7FH以上的内部地址单元时,指令中使用的寻址方式是不同的,也即寻址方式决定是访问高128字节RAM 还是访问特殊功能寄存器。如果指令是直接寻址方式则为访问特殊功能寄存器。
六、原理图设计
总原理图:
1.在Proteus 中绘制单片机最小系统,包括主控芯片、晶振电路和复位电路。
2. 添加4位共阳数码管,段选A-DP利连接到P0口,P0口需要用排阻上拉,位选C0-C1利用标号连接到P2.0-P2.1口。
七、参考程序(含扩展实验,见附件)
八、实验思考题
1、将存储单元扩大到50,然后向RAM中连续写入数据,计算出这些数的累加和后显示在数码管上。
- #include <reg52.h>
- #include <intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit C0 = P2^0;
- sbit C1 = P2^1;
- code uchar discode[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
- uchar idata ram_value = 68;
- void delay_ms(uint ms)
- {
- uint i, j;
- for(i = 0; i < ms; i++)
- for(j = 0; j < 120; j++);
- }
- void main()
- {
- uchar ten, one;
-
- ten = ram_value / 10;
- one = ram_value % 10;
- C0 = 0;
- C1 = 0;
- P0 = 0xFF;
- while(1)
- {
- P0 = 0xFF;
- C0 = 1;
- C1 = 0;
- P0 = discode[ten];
- delay_ms(2);
- P0 = 0xFF;
- C0 = 0;
- C1 = 1;
- P0 = discode[one];
- delay_ms(2);
- }
- }
复制代码- #include <reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
-
- uchar code seg[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};
- void delay(uint t)
- {
- while(t--);
- }
- void main()
- {
- uchar idata buffer[50]; //RAM expand to 50
- uint sum = 0;
- uchar i, digits[4];
- for(i = 0; i <=50; i++)
- {
- buffer[i] = i;
- }
- for(i = 0; i <=50; i++)
- {
- sum += buffer[i];
- }
- digits[0] = sum / 1000;
- digits[1] = (sum / 100) % 10;
- digits[2] = (sum / 10) % 10;
- digits[3] = sum % 10;
-
- P2=0xaa;
-
- while(1)
- {
-
- P0=seg[digits[0]];
- P2=0x01;
- delay(5);
- P2=0x0;
- P0=0xff;
-
- P0=seg[digits[1]];
- P2=0x02;
- delay(5);
- P2=0x0;
- P0=0xff;
-
- P0=seg[digits[2]];
- P2=0x04;
- delay(5);
- P2=0x0;
- P0=0xff;
-
- P0=seg[digits[3]];
- P2=0x08;
- delay(5);
- P2=0x0;
- P0=0xff;
- }
- }
复制代码
以上2个文件程序下载:
Proteus仿真:无
|