找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

帖子
查看: 7045|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

CPU模型機(jī)的Proteus仿真設(shè)計(jì) 附單片機(jī)源碼與各部分原理圖說明

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:408699 發(fā)表于 2018-10-12 18:08 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
CPU模型機(jī)的設(shè)計(jì)Proteus仿真附件包含DSN電路圖和各部分單元的文檔說明

首先打開NEWest.DSN。在AT89C51器件上雙擊,在Program File: 路徑選中該文件夾中的new.hex文件。然后可以按仿真開始按鈕。大概經(jīng)過5~10秒程序?qū)懭胪戤叀H缓髮⒁恍╅_關(guān)撥回。即將SW15,SW18,SW10,SW9撥至右邊。SW14撥至上邊。和U41連接的LOGICSTATE撥為0,和U45連接的LOGICSTATE撥至1。然后可以按動(dòng)START上的LOGICSTATE。整個(gè)系統(tǒng)開始運(yùn)行。

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


此文檔為模型計(jì)算機(jī)的電路說明文檔。共分為四個(gè)部分。具體如下:

第一部分:ALU,PC及I/O部分

1.PC(74LS161)
圖  X-1
圖X-2


2.存儲(chǔ)器(6116)


3.寄存器(74LS374)




4.ALU(74LS181)






5.I/O部分



第二部分:微控制部分


1.控制臺(tái)轉(zhuǎn)移


2.地址轉(zhuǎn)移




3.微地址輸入



4.微命令輸入
5.微控制輸出
              U38,U39,U40為3個(gè)3-8譯碼器,E1,E2,E3為1,0,0。輸入端為A,B,C字段,譯碼的情況如下:

第三部分:自動(dòng)輸入
本系統(tǒng)若使用開關(guān)撥代碼及微程序,則由于數(shù)據(jù)量較多且容易撥錯(cuò),致使調(diào)試效率低下。因此用一個(gè)AT89C51來自動(dòng)寫入代碼及微程序,省卻撥動(dòng)開關(guān)的時(shí)間。下面是具體電路及寫入51的代碼,經(jīng)驗(yàn)證可正確寫入及讀出。
  • AT89C51部分

2.微程序存儲(chǔ)寫入部分


3.存儲(chǔ)器寫入部分

4.代碼部分
具體代碼如下:
  1. #include "reg51.h"

  2. sbit OE =P2^7;                            //控制微控器里三個(gè)6116(RAM)的輸出
  3. sbit WE =P2^6;                            //控制微控器里三個(gè)6116(RAM)的寫入
  4. sbit CS2=P2^5;                            //控制微控器里三個(gè)6116(RAM)的片選
  5. sbit CS1=P2^4;
  6. sbit CS0=P2^3;
  7. sbit t=P2^2;                                          //給微地址寄存器寫入地址提供時(shí)序信號(hào)
  8. sbit WE_RAM=P2^1;                            //為主存儲(chǔ)器提供寫允許信號(hào)
  9. sbit LDRAM=P2^0;              //給主存儲(chǔ)器寫入地址或數(shù)據(jù)的74LS245的允許信號(hào)
  10. sbit tr=P1^7;                                          //為主存儲(chǔ)器提供地址的74LS273的時(shí)序信號(hào)

  11. #define n 100                                          //用于提供延時(shí)的變量
  12. void delay(void)                            //延時(shí)功能函數(shù)
  13. {
  14.               char i,j;
  15.               for(i=0;i<n;i++)
  16.                             for(j=0;j<n;j++)
  17.                             {}
  18. }
  19. void init(void)                                          //初始化函數(shù)
  20. {
  21.               OE=1;
  22.               WE=1;
  23.               CS2=1;
  24.               CS1=1;
  25.               CS0=1;
  26.               WE_RAM=1;
  27.               LDRAM=1;
  28.               t=0;
  29. }
  30. void main(void)
  31. {
  32.               char c2[25]= {0x01,0x01,0x00,0x00,0x00,0x01,0x95,0x00,0x00,0x01,0x01,
  33.                             0x01,0x01,0x02,0x00,0x00,0x01,0x01,0x00,0x01,0x00,0x07,0x00,0x07,0x06};
  34.               //微程序的高八位數(shù)據(jù)
  35.               char c1[25]= {0x81,0xed,0xc0,0xe0,0xb0,0xa2,0x9a,0xe0,0x10,0xed,0xed,
  36.                             0xed,0xed,0x82,0xe0,0xa0,0xed,0xed,0xa0,0x80,0x20,0x0a,0xd1,0x0a,0x8a};
  37.               //微程序的中八位數(shù)據(jù)
  38.               char c0[25]= {0x10,0x82,0x48,0x04,0x05,0x06,0x01,0x0d,0x01,0x83,0x87,
  39.                             0x8e,0x96,0x01,0x0f,0x15,0x92,0x94,0x17,0x01,0x18,0x01,0x81,0x10,0x11};
  40.               //微程序的低八位數(shù)據(jù)

  41.               char ram[11]={0x00,0x10,0x0a,0x20,0x0b,0x30,0x0b,0x40,0x00,0x00,0x01};
  42.               //主存儲(chǔ)器里的數(shù)據(jù)及指令
  43.               char i;

  44.               init();
  45.               WE=0;
  46.               for(i=0;i<=24;i++)
  47.               {
  48.                             P1=i;                            //P1口用來提供微程序地址
  49.                             t=!t;                                          //微地址寄存器的時(shí)序信號(hào)

  50.                             P0=c2[i];                            //P0口用來提供微程序,先提供高八位程序
  51.                             CS2=0;                            //選中高八位的存儲(chǔ)器
  52.                             delay();                            //延時(shí)
  53.                             CS2=1;                            //片選無效

  54.                             P0=c1[i];
  55.                             CS1=0;                            //選中中八位存儲(chǔ)器
  56.                             delay();
  57.                             CS1=1;                            //片選無效

  58.                             P0=c0[i];
  59.                             CS0=0;                            //選中低八位存儲(chǔ)器
  60.                             delay();
  61.                             CS0=1;                            //片選無效
  62.                             t=!t;                                         
  63.               }

  64.               WE=1;
  65.               CS2=0;
  66.               CS1=0;
  67.               CS0=0;
  68.               OE=0;

  69.               P0=0x00;                                          //置微地址為0x00

  70.               for(i=0;i<25;i++)              //顯示微程序數(shù)據(jù),用來檢查是否輸入有誤
  71.               {
  72.                             P1=i;
  73.                             t=!t;

  74.                             t=!t;
  75.                             delay();
  76.               }

  77.               P1=0x01;
  78.               t=!t;
  79.               t=!t;
  80.               delay();
  81.             
  82.               LDRAM=0;
  83.               tr=0;
  84.               for(i=0;i<11;i++)
  85.               {
  86.                             P3=i;                            //提供主存儲(chǔ)器地址

  87.                             tr=!tr;
  88.                             tr=!tr;                            //將地址寫入地址寄存器
  89.                             P3=ram[i];              //提供主存儲(chǔ)器數(shù)據(jù)或指令

  90.                             WE_RAM=0;              //主存儲(chǔ)器寫有效
  91.                             delay();
  92.                             WE_RAM=1;            

  93.               }
  94.               P3=0x00;
  95.               tr=!tr;
  96.               tr=!tr;

  97.               LDRAM=1;
  98.               while(1){}
  99. }
復(fù)制代碼

此代碼在Keil μVersion2中編譯為*.hex文件,然后加載到Proteus中的AT89C51,便可運(yùn)行。



第四部分:時(shí)序及控制



下圖為時(shí)序的部分控制電路:


單步執(zhí)行與連續(xù)執(zhí)行的開關(guān)定義,如圖


全部資料51hei下載地址:
模型機(jī).rar (1.03 MB, 下載次數(shù): 86)
參考設(shè)計(jì):http://www.torrancerestoration.com/bbs/dpj-181762-1.html

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:818420 發(fā)表于 2020-9-14 15:11 | 只看該作者
樓主您好,我想問一下你的操作說明文檔里寫的START是指哪里呀
回復(fù)

使用道具 舉報(bào)

板凳
ID:818420 發(fā)表于 2020-9-14 15:37 | 只看該作者
樓主您好,請(qǐng)問在仿真電路圖上按你的寫得操作說明操作,沒有反應(yīng)可能是因?yàn)槭裁窗?/td>
回復(fù)

使用道具 舉報(bào)

地板
ID:838911 發(fā)表于 2021-6-12 15:14 | 只看該作者
呆桃呀呀呀呀 發(fā)表于 2020-9-14 15:37
樓主您好,請(qǐng)問在仿真電路圖上按你的寫得操作說明操作,沒有反應(yīng)可能是因?yàn)槭裁窗?/blockquote>

需要把LED的阻值調(diào)低,太高了電流過不去
回復(fù)

使用道具 舉報(bào)

5#
ID:1034690 發(fā)表于 2022-6-14 18:04 | 只看該作者
只有a.hex,哪來的new.hex
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表