標題: 51單片機RAM讀寫實驗程序Proteus仿真 [打印本頁]

作者: Elecman    時間: 2025-5-18 22:47
標題: 51單片機RAM讀寫實驗程序Proteus仿真
一、實驗目的
1、 掌握RAM的讀寫方法;
2、 理解RAM和ROM的作用;
3、 熟練Proteus仿真軟件的使用;
4、 熟練單片機實驗箱的實驗操作。

二、實驗預習要求
1、主要知識點概述:掌握單片機RAM的結構;學會RAM的讀寫。
2、實驗效果說明:將存入的RAM的數(shù)值讀出用數(shù)碼管顯示出來。

三、實驗設備和器件
一臺PC 機  
一套 PROTEUS 仿真軟件
一臺實驗箱  
一臺ISP 下載器
一臺51單片機仿真器 (可選)

四、實驗要求
  1、在 DATA區(qū)定義一個字符變量并寫入數(shù)據(jù),把寫入RAM中的數(shù)據(jù)讀出來并用數(shù)碼管顯示出來。

五、實驗原理
      數(shù)據(jù)存儲器用于存放中間運算結果、數(shù)據(jù)暫存和緩沖、標識位等。80C51系列單片機的片內數(shù)據(jù)存儲器除RAM塊外。還有特殊功能寄存器(SFR)塊。 通過查詢AT89C52的數(shù)據(jù)手冊可以知道:
      AT89C52 有 256 個字節(jié)的內部RAM,80H-FFH 高128 個字節(jié)與特殊功能寄存器(SFR)地址是重疊的,也就是高128字節(jié)的RAM 和特殊功能寄存器的地址是相同的,但物理上它們是分開的。
      當一條指令訪問7FH以上的內部地址單元時,指令中使用的尋址方式是不同的,也即尋址方式?jīng)Q定是訪問高128字節(jié)RAM 還是訪問特殊功能寄存器。如果指令是直接尋址方式則為訪問特殊功能寄存器。

六、原理圖設計
總原理圖:

1.在Proteus 中繪制單片機最小系統(tǒng),包括主控芯片、晶振電路和復位電路。
2. 添加4位共陽數(shù)碼管,段選A-DP利連接到P0口,P0口需要用排阻上拉,位選C0-C1利用標號連接到P2.0-P2.1口。

七、參考程序(含擴展實驗,見附件)
八、實驗思考題
1、將存儲單元擴大到50,然后向RAM中連續(xù)寫入數(shù)據(jù),計算出這些數(shù)的累加和后顯示在數(shù)碼管上。

  1. #include <reg52.h>
  2. #include <intrins.h>

  3. #define uint unsigned int
  4. #define uchar unsigned char

  5. sbit C0 = P2^0;
  6. sbit C1 = P2^1;

  7. code uchar discode[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};

  8. uchar idata ram_value = 68;

  9. void delay_ms(uint ms)
  10. {
  11.    uint i, j;
  12.    for(i = 0; i < ms; i++)
  13.    for(j = 0; j < 120; j++);
  14. }

  15. void main()
  16. {
  17.     uchar ten, one;
  18.    
  19.     ten = ram_value / 10;
  20.     one = ram_value % 10;

  21.     C0 = 0;
  22.     C1 = 0;
  23.     P0 = 0xFF;

  24.     while(1)
  25.                 {
  26.                         P0 = 0xFF;
  27.                         C0 = 1;
  28.                         C1 = 0;
  29.                         P0 = discode[ten];
  30.                         delay_ms(2);

  31.                         P0 = 0xFF;
  32.                         C0 = 0;
  33.                         C1 = 1;
  34.                         P0 = discode[one];
  35.                         delay_ms(2);
  36.     }
  37. }
復制代碼
  1. #include <reg52.h>

  2. #define uchar unsigned char
  3. #define uint unsigned int
  4.        
  5. uchar code seg[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};

  6. void delay(uint t)
  7. {
  8.         while(t--);
  9. }

  10. void main()
  11. {
  12.         uchar idata buffer[50]; //RAM expand to 50
  13.         uint sum = 0;
  14.         uchar i, digits[4];


  15.         for(i = 0; i <=50; i++)
  16.         {
  17.                 buffer[i] = i;
  18.         }

  19.         for(i = 0; i <=50; i++)
  20.         {
  21.                 sum += buffer[i];
  22.         }

  23.         digits[0] = sum / 1000;
  24.         digits[1] = (sum / 100) % 10;
  25.         digits[2] = (sum / 10) % 10;
  26.         digits[3] = sum % 10;
  27.        
  28.         P2=0xaa;
  29.        
  30.         while(1)
  31.         {
  32.                
  33.                 P0=seg[digits[0]];
  34.                 P2=0x01;
  35.                 delay(5);
  36.                 P2=0x0;
  37.                 P0=0xff;
  38.                
  39.                 P0=seg[digits[1]];
  40.                 P2=0x02;
  41.                 delay(5);
  42.                 P2=0x0;
  43.                 P0=0xff;
  44.                
  45.                 P0=seg[digits[2]];
  46.                 P2=0x04;
  47.                 delay(5);
  48.                 P2=0x0;
  49.                 P0=0xff;
  50.                
  51.                 P0=seg[digits[3]];
  52.                 P2=0x08;
  53.                 delay(5);
  54.                 P2=0x0;
  55.                 P0=0xff;

  56.         }
  57. }
復制代碼




以上2個文件程序下載:
Proteus仿真:無





歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1