找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2440|回复: 1
打印 上一主题 下一主题
收起左侧

CPU模型机的Proteus仿真设计 附单片机源码与各部分原理图说明

[复制链接]
跳转到指定楼层
楼主
CPU模型机的设计Proteus仿真附件包含DSN电路图和各部分单元的文档说明

首先打开NEWest.DSN。在AT89C51器件上双击,在Program File: 路径选中该文件夹中的new.hex文件。然后可以按仿真开始按钮。大概经过5~10秒程序写入完毕。然后将一些开关拨回。即将SW15,SW18,SW10,SW9拨至右边。SW14拨至上边。和U41连接的LOGICSTATE拨为0,和U45连接的LOGICSTATE拨至1。然后可以按动START上的LOGICSTATE。整个系统开始运行。

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


此文档为模型计算机的电路说明文档。共分为四个部分。具体如下:

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

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


2.存储器(6116)


3.寄存器(74LS374)




4.ALU(74LS181)






5.I/O部分



第二部分:微控制部分


1.控制台转移


2.地址转移




3.微地址输入



4.微命令输入
5.微控制输出
              U38,U39,U40为3个3-8译码器,E1,E2,E3为1,0,0。输入端为A,B,C字段,译码的情况如下:

第三部分:自动输入
本系统若使用开关拨代码及微程序,则由于数据量较多且容易拨错,致使调试效率低下。因此用一个AT89C51来自动写入代码及微程序,省却拨动开关的时间。下面是具体电路及写入51的代码,经验证可正确写入及读出。
  • AT89C51部分

2.微程序存储写入部分


3.存储器写入部分

4.代码部分
具体代码如下:
  1. #include "reg51.h"

  2. sbit OE =P2^7;                            //控制微控器里三个6116(RAM)的输出
  3. sbit WE =P2^6;                            //控制微控器里三个6116(RAM)的写入
  4. sbit CS2=P2^5;                            //控制微控器里三个6116(RAM)的片选
  5. sbit CS1=P2^4;
  6. sbit CS0=P2^3;
  7. sbit t=P2^2;                                          //给微地址寄存器写入地址提供时序信号
  8. sbit WE_RAM=P2^1;                            //为主存储器提供写允许信号
  9. sbit LDRAM=P2^0;              //给主存储器写入地址或数据的74LS245的允许信号
  10. sbit tr=P1^7;                                          //为主存储器提供地址的74LS273的时序信号

  11. #define n 100                                          //用于提供延时的变量
  12. void delay(void)                            //延时功能函数
  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)                                          //初始化函数
  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.               //微程序的高八位数据
  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.               //微程序的中八位数据
  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.               //微程序的低八位数据

  41.               char ram[11]={0x00,0x10,0x0a,0x20,0x0b,0x30,0x0b,0x40,0x00,0x00,0x01};
  42.               //主存储器里的数据及指令
  43.               char i;

  44.               init();
  45.               WE=0;
  46.               for(i=0;i<=24;i++)
  47.               {
  48.                             P1=i;                            //P1口用来提供微程序地址
  49.                             t=!t;                                          //微地址寄存器的时序信号

  50.                             P0=c2[i];                            //P0口用来提供微程序,先提供高八位程序
  51.                             CS2=0;                            //选中高八位的存储器
  52.                             delay();                            //延时
  53.                             CS2=1;                            //片选无效

  54.                             P0=c1[i];
  55.                             CS1=0;                            //选中中八位存储器
  56.                             delay();
  57.                             CS1=1;                            //片选无效

  58.                             P0=c0[i];
  59.                             CS0=0;                            //选中低八位存储器
  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++)              //显示微程序数据,用来检查是否输入有误
  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;                            //提供主存储器地址

  87.                             tr=!tr;
  88.                             tr=!tr;                            //将地址写入地址寄存器
  89.                             P3=ram[i];              //提供主存储器数据或指令

  90.                             WE_RAM=0;              //主存储器写有效
  91.                             delay();
  92.                             WE_RAM=1;            

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

  97.               LDRAM=1;
  98.               while(1){}
  99. }
复制代码

此代码在Keil μVersion2中编译为*.hex文件,然后加载到Proteus中的AT89C51,便可运行。



第四部分:时序及控制



下图为时序的部分控制电路:


单步执行与连续执行的开关定义,如图


全部资料51hei下载地址:
模型机.rar (1.03 MB, 下载次数: 35)
参考设计:http://www.51hei.com/bbs/dpj-181762-1.html

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享分享 分享淘帖 顶 踩
回复

使用道具 举报

沙发
呆桃呀呀呀呀 发表于 2020-9-14 15:11 | 只看该作者
楼主您好,我想问一下你的操作说明文档里写的START是指哪里呀
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表