基于8086的压力检测器设计(Proteus8仿真)

news2025/7/20 13:03:51

一、实验名称

基于 proteus 设计压力检测计

二、实验目的

 深刻理解并掌握基于 8086 处理器的系统工程的工作原理和流程;
 深刻理解并掌握 8086 处理器的工作原理、引脚功能;
 深刻理解并掌握压力传感器件 MPX4115 的工作原理、引脚功能;
 深刻理解并掌握模数转换器 ADC0808 的工作原理、引脚功能;
 深刻理解并掌握可编程并行接口 8255A 的工作原理、引脚功能;
 深刻理解并掌握中断控制器 8259A 的工作原理、引脚功能;
 深刻理解并掌握用于地址锁存的 74LS373 的工作原理、引脚功能;
 深刻理解并掌握译码器 74154 的工作原理、引脚功能;
 深刻理解并掌握七段显示译码器 4511 的工作原理、引脚功能;
 深刻理解并掌握状态指示灯的工作原理、引脚功能;
 深刻理解并掌握二极管显示器 7SEA-MPX4-CC 的工作原理、引脚功能;

三、实验设计

本工程的设计内容是压力检测计,以8086CPU为处理器,利用8255A、8259A、ADC0808、74LS373、74154、MPX4115、4511、状态指示灯和7SEA-MPX4-CC协调工作完成任务。实现功能:采集压力传感器模拟电压信号,并输出在7SEA-MPX4-CC数码管上,设置压力阈值,正常工作,压力过低,压力过高三种状态分别显示在状态指示灯上。工程流程:首先,向8086中写入中断向量,并且初始化8259与8255,然后CPU调用8255PC0引脚启动ADC0808,压力传感器件输出模拟电压传送到模数转换器ADC0808转化为二进制数;然后,将二进制数传送到8255的A端口进行锁存,并向8259申请中断;接着,CPU处理完中断程序后,将更新后的模拟值输出到8255的B端口和C端口,B端口的数据配合4511输出到压力显示器,C端口的数据输出到状态指示灯,循环上述过程,工作流程如图1。
在这里插入图片描述
在这里插入图片描述
如图2为压力检测器总体设计图,以 8086 为处理器,利用用于地址锁存的 74LS373、译码器 74154、可编程并行 接口 8255A、中断控制器 8259A、压力传感器件 MPX4115、模数转换器 ADC0808、七段显示译码器 4511、状态指示灯、四个共阴极二极管显示器 7SEA- MPX4-CC。测量得到的压力值可以在数码管精准显示。 当压力值处于正常值范围内时,绿色指示灯亮。 当压力值大于正常值最大值时,红色指示灯亮。 当压力值小于正常值最小值时,黄色指示灯亮。本次实验的芯片及其功能如下:

  1. 8086 为处理器:用于协调各芯片协同工作,完成选通可编程并行接口 8255A、中断控制器 8259A、处理中断服务程序等任务
  2. 利用用于地址锁存的 74LS373: 两片 74LS373 的 D0~D7 用于接收 CPU 的地址信号; Q0~Q7 用于输出该芯片锁存后的结果。
  3. 译码器 74154:该芯片是 4-16 译码器,但是在此系统中,只用到了两个输出口; IOY0 用于选通 8255A,IOY1 用于选通 8259。
  4. 可编程并行 接口 8255A:在本系统中,8255A 通过 74154 的 IOY0 引脚信号选通; A 口用来接收数字信号; D0~D7 实现数据线和地址线的复用,传递和接受 CPU 处理前后的数据; B 口输出 CPU 传输来的处理之后的数据,并将输出; C 口用来输出控制信息; PC0 用于管理模数转换器 ADC0808 的启动; PC1~PC3 用来管理状态指示灯的三种指示情况。
  5. 中断控制器 8259A:在本系统中,8259A 通过 74154 的 IOY1 引脚信号选通;通过 IR0 引脚接收模数转换器 ADC0808 的 EOC 中断源,并对此中断进行 管理;AD 是地址线与数据线复用,通过 AD 将中断类型码传递给 CPU;INTR 用于向 CPU 提出中断请求;INTA 用于接收 CPU 的信号。
  6. 压力传感器件 MPX4115:在本系统中作为一个模拟的传感器、能够感受压力;压力通过此装置传入该工程系统。MPX4115 的量程下限为 25kPa,在 00kPa、输入电压为 5V 时,此时的模 拟电压输出为+0.2579V;MPX4115 的量程上限为 110kPa,在 100kPa、输入电压为 5V 时,模拟电 压输出为+4.0920V。
  7. 模数转换器 ADC0808:该装置由 8255A 的 PC0 引脚信号启动;通过 IN0 接收压力传感器的模拟信号,并将其转化为数字信号;将数字信号通过 OUT1~OUT8 传输到 8255A 的 A 口的 PA0~PA7; 在 EOC 引脚输出一个中断源给 8259A;3 位地址输入线 ADDA、ADDB、ADDC 的值设置为 000,硬件上将它们 接地即可;时钟频率不高于 640KHZ,采用 10kHz 即可
  8. 七段显示译码器 4511:4-7 译码器,输出每个七段数码管的控制信号给共阴极二极管显示器;
  9. 状态指示灯:接收 8255A 的输出信号 PC1、PC2、PC3,及时用 LED 的亮灯情况反馈所测量的压力值是否在正常量程内。
  10. 四个共阴极二极管显示器 7SEA- MPX4-CC:实时显示所测压力的数值;通过 QA~QG 控制七段数码管的信号,通过 L1~L4 选择指定的七段数码管。

四、实验结果

在这里插入图片描述
如图3-图6分别为压力过小,压力正常,压力过大,超过量程的结果,压力正常时,闪烁绿灯,压力过小时,闪烁黄灯,压力过大时,闪烁红灯。

五、分析与讨论

本次实验让我熟悉了8086CPU处理器,8255A、8259A、ADC0808、74LS373、74154、MPX4115、4511、状态指示灯和7SEA-MPX4-CC等原件的工作方式和原理。将他们真正联系起来,而不是一个个单独的个体。本次实验我们编码采用的是C语言和汇编语言,以前从未使用过 C 语言和汇编语言混合使用的操作,通过编程也进一步加深了我们对整个系统和每个芯片的工作原理的细节,包括写中断向量表、定义中断服务程序、各种控制字的设计等等。在设计过程中,也遇到了很多困难,比如器件之间的连接不准确,软件使用不太熟悉,编码过程报错,通过查阅资料和同学帮助,这些问题都成功得到了解决。本次设计实验不仅让我将掌握器件的原理,更重要的是将器件通过代码联系起来,书本学习的理论知识赋予了实践。最后,我认为学好微机接口应该做到理论实际相结合。不能一味只看书,轻视具体编程体验,撇开实际空谈理论,最终一无所获;也不能完全脱离理论,在实验原理一知半解的情况下就动手连接电路然后敲上相应代码,好比囫囵吞枣。微机接口课以及微机接口课程设计有着独有的特点,初学者要处理好理论与实际、硬件与软件等的关系。既要掌握书上的基本原理,又要运用所学的汇编语言以及C语言去获得相应的编程体验。最后,感谢高老师这学期以来的教导。

代码

#define	IOY0	0000H		//片选IOY0对应的端口始地址 0000 0000 0000 0000
#define	IOY1	0100H		//片选IOY1对应的端口始地址 0000 0001 0000 0000

#define MY8255_A	IOY0		//8255的A口地址  //0000 0000 0000 0000
#define MY8255_B	IOY0+01H*4	//8255的B口地址  //0000 0000 0000 0100 
#define MY8255_C	IOY0+02H*4	//8255的C口地址  //0000 0000 0000 1000
#define MY8255_MODE	IOY0+03H*4	//8255的控制寄存器地址//0000 0000 0000 1100
 
#define   ICW1     0100H //0000 0001 0000 0000  偶地址 
#define   ICW2     0104H //0000 0001 0000 0100  奇地址 
#define   ICW3     0104H //0000 0001 0000 0100  奇地址 
#define   ICW4     0104H //0000 0001 0000 0100  奇地址 
#define   OCW1     0104H //0000 0001 0000 0100  奇地址 
#define   OCW2     0100H //0000 0001 0000 0000  偶地址 
#define   OCW3     0100H //0000 0001 0000 0000  偶地址 

char LED_ADDR[4] = {14,13,11,7}; //选择数码管1,2,3,4 
char LED_NUM[10] = {0,1,2,3,4,5,6,7,8,9};  //数码管显示数字 
unsigned int ADC_DATA = 0; //电压值 
unsigned int data_num[4];  //十进制数 
void Init_8255();
void Init_8259();
void InterruputConfig(void);
void LED_out(char addr, char num);
void LED_set(unsigned int data);
void ADC_begin(void);
unsigned int PRESS_GET();
void delayms(unsigned int j);

//输出函数,向装载地址输出数据
void outp(unsigned int addr, char data)
 { __asm
    { mov dx, addr
      mov al, data
      out dx, al
    }
 }
 
//输入函数,从装载地址获取数据
char inp(unsigned int addr)
 { char result;
   __asm
    { mov dx, addr
      in al, dx
      mov result, al
    }
   return result;
 }
 
//8255初始化 
void Init_8255()
 {
    __asm
    {
       MOV DX,MY8255_MODE
       MOV AL,98H		//工作方式0,A口输入,B口输出,C口输出
       OUT DX,AL
    }
 }
 
//8259初始化      
void Init_8259(void)
 {
    //icw初始化命令字 ICW1(入偶地址A0=0) 和 ICW2 (入奇地址A0=1)
    outp(ICW1, 13H);		// ICW1  00010011B  D3=0边沿触发, D1=1单片, D0=0 有 ICW4 ,A0=0
    outp(ICW2, 80H);		// ICW2  10000000B  中断类型号为80H,A0=1
    outp(ICW4, 01H);            // ICW4  00000001B 
    outp(OCW1, 00H);            // OCW1  置 IMR = 0000,0000B   
 }

//中断服务函数: 从8255A端口读的压力值,更新ADC_DATA 
void Interrupt0(void)
 {
    _asm
    {
       CLI
       PUSH AX
       PUSH BX
       PUSH CX
    } 
    ADC_DATA = PRESS_GET(); //ADC_DATA存的是从8255A端口读的压力值 
    _asm
    {
       MOV DX,OCW2		//OCW2
       MOV AL,20H		//发出EOI命令,值ISR 0号中断为0 
       OUT DX,AL
       POP DX
       POP CX
       POP AX 
       STI
    }
}

//中断配置函数,装载中断向量       
void InterruputConfig(void)
 {
   _asm
   {
      //80号,装中断向量表(保存中断服务程序的入口地址到中断向量表中)
      MOV AX,0
      MOV ES,AX
      MOV SI,80H*4 //设置中断向量 中断类型号80H
      MOV AX,OFFSET Interrupt0 //OFFSET获取偏移地址 
      MOV ES:[SI],AX // IP
      MOV AX,SEG Interrupt0 //SEG获取段地址 
      MOV ES:[SI+2],AX // CS
   }
}

//输出数码管 
void LED_out(char addr, char num)
 {
    char temp = LED_NUM[num]*16 + LED_ADDR[addr-1]; //左移4位加上位置 
    __asm
    {
       MOV DX,MY8255_B
       MOV AL,temp
       OUT DX,AL
    }
 }
 
//设置数码管和警报器 
 void LED_set(unsigned int data)
 {
    data /= 3;
    data += 25;
    data_num[3] = data%10;		//获得十进制数个位值
    data /= 10;
    data_num[2] = data%10;		//获得十进制数十位值
    data /= 10;
    data_num[1] = data;			//获得十进制数百位值
    data_num[0] = 0;
    
    for(int i = 0; i < 3; i++)  //输出个位,十位,百位 
    {
       LED_out(i+2,data_num[i+1]); //输出数码管 
        
       if((data_num[1] == 1)) //输出报警器 
       {
	  outp(MY8255_C,02H);
       }
       else if((data_num[2] == 2))
       {
	  outp(MY8255_C,08H);
       }
       else
       {
	  outp(MY8255_C,04H);
       }
       delayms(10);
    }

 }

//8255C PC0从1->0 开启ADC0808 
void ADC_begin(void)
 {
    outp(MY8255_C,1);
    delayms(5);
    outp(MY8255_C,0);
 }
  
//从8255A端口读取压力值(二进制表示) 
unsigned int PRESS_GET()
 {
    unsigned int temp = 0;
    __asm
    {
       MOV AH,0H
       MOV DX,MY8255_A
       IN  AL,DX
       MOV temp,AX
    }
    return temp;
 }

//延时函数 
void delayms(unsigned int j)
 {
    unsigned char i;
    for(; j>0; j--)
    { 
       i = 120;
       while(i--) {;}
    }
 }
 
 void main(void)
 {
    _asm
    { 
        cli
     }
    InterruputConfig();//写中断向量 
    Init_8259(); 
    _asm
    { 
        sti
    }
    Init_8255();
    while (1)
    {
       ADC_begin();
       LED_set(ADC_DATA);
    }
 }
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/35870.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++:函数指针进阶:看完还不用std::function来捶我

1&#xff1a;函数指针的背景 我们先简单聊一下函数指针的背景&#xff0c;具体使用请参考我的这篇博客 C &#xff1a;函数&#xff1a; 函数指针_hongwen_yul的博客-CSDN博客 假设现在有这样一段代码&#xff1a;C/C中可以使用指针指向一段代码&#xff0c;这个指针就叫函…

【季报分析】百度2022年Q3:逆势而上

11月22日&#xff0c;百度&#xff08;09888.HK&#xff09;发布了2022年第三季度的业绩报告&#xff0c;尽管面对疫情不断侵扰、外部环境压力带来的诸多挑战&#xff0c;百度在Q3依然取得了相当不错的财务数据&#xff0c;尤其是在自动驾驶、智能硬件方面的表现尤为突出&#…

【Linux】缓冲区

目录&#x1f308;前言&#x1f337;1、缓冲区&#x1f361;1.1、缓冲区的理解&#x1f362;1.2、缓冲区在哪里&#xff1f;&#x1f363;1.3、缓冲区的刷新策略&#x1f363;1.4、模拟实现C库函数&#x1f338;2、标准输出流与错误流的区别&#x1f364;2.1、概念&#x1f365…

微客云升级会员制度

会员制度 会员制度是一种人与人或组织与组织之间进行沟通的媒介&#xff0c;它是由某个组织发起并在该组织的管理运作下&#xff0c;吸引客户自愿加入&#xff0c;目的是定期与会员联系&#xff0c;为他们提供具有较高感知价值的利益包。 Part 1 会员制度 建立长期稳定的客…

Python测试框架之Pytest基础入门

Pytest简介 Pytest is a mature full-featured Python testing tool that helps you write better programs.The pytest framework makes it easy to write small tests, yet scales to support complex functional testing for applications and libraries. 通过官方网站介绍…

Vue子组件传自定义事件给父组件

我们知道组件之间是不能够进行通信的&#xff0c;都是相互独立的&#xff0c;你用不了我的状态和方法&#xff0c;我也用不了你的&#xff0c;那如何实现通信呢&#xff0c;可以间接实现&#xff1b; 实现父组件和子组件的通信&#xff1a; 子组件想用父组件的状态需要父组件…

Apache ShardingSphere(二) 基本使用

文章目录二 ShardingSphere JDBC 基本使用2.1 ShardingSphere JDBC 水平分表2.1.1 案例入门2.1.2 解读配置文件2.1.3 其他测试2.1.4 延伸问题2.2 ShardingSphere JDBC 水平分库2.2.1 案例入门2.2.2 解读配置文件2.1.3 其他测试2.3 ShardingSphere JDBC 广播表2.3.1 基本案例入门…

矩阵链相乘(动态规划)

【问题描述】给定n个矩阵M1,M2...MnM_1,M_2...M_nM1​,M2​...Mn​&#xff0c;他们的维数分别是r1∗c1,r2∗c2...rn∗cnr_1*c_1,r_2*c_2...r_n*c_nr1​∗c1​,r2​∗c2​...rn​∗cn​&#xff0c;要求使用【动态规划】的策略求解矩阵连乘的最优计算代价(总乘法次数最少)。题目…

Docker 学习视频集 bilibili

1.什么是Docker_哔哩哔哩_bilibili 2.Docker的安装_哔哩哔哩_bilibili 3.镜像、容器和仓库_哔哩哔哩_bilibili 4.在容器中部署一个应用_哔哩哔哩_bilibili 5.将容器保存成镜像成片_哔哩哔哩_bilibili 6.使用Dockerfile构建镜像1_哔哩哔哩_bilibili 7.导入导出镜像_哔哩哔…

vscode配合gitee同步云设置

更换开发设备后&#xff0c;新安装的vscode软件&#xff0c;是没有原先的配置的&#xff0c;诸如快捷键&#xff0c;快捷代码段生成、安装的各个插件&#xff0c;插件的配置等都木大了&#xff0c;开发起来会很别扭&#xff0c;网上最多的就是去安装一个叫做Settings Sync的插件…

springcloud五大核心部件

springcloud五大核心部件 一、springcloud介绍 springcloud是微服务的集大成者&#xff0c;将一系列的组件进行了整合。基于springboot构建 &#xff0c;可以快速配置常用模块并构建庞大的分布式系统。 二、具体业务分析 我们举一个例子来进行业务场景分析 假设现在开发一…

Websocket学习

参考&#xff1a;http://www.mydlq.club/article/86/ 这里写目录标题一、WebSocket 简介二、WebSocket 特点三、为什么需要 WebSocket四、WebSocket 连接流程五、WebSocket 使用场景六、使用案例1.提醒客户端有新订单2.客户端交互一、WebSocket 简介 WebSocket 是一种基于 TCP…

为什么越来越多的企业在会议室使用无线流媒体网关?

1&#xff0c;用户已有华为&#xff0c;MAXHUB等投屏功能设备&#xff0c;不需要这个设备了。但是市面上大部分投屏设备的使用存在以下问题&#xff1a; 操作麻烦&#xff0c;我们发射器是直接触摸投屏&#xff0c;安全性低&#xff0c;需要驱动软件。 2&#xff0c;市场上有很…

实现矩阵连乘积(动态规划)

目录 实现矩阵连乘积 题目 问题分析 算法分析 时间复杂度 代码实现 执行结果 动态规划 基本思想 举例 个人主页&#xff1a;天寒雨落的博客_CSDN博客-初学者入门C语言,python,数据库领域博主 &#x1f4ac; 热门专栏&#xff1a;初学者入门C语言_天寒雨落的博客-CSDN…

【SVM分类】基于鸽群算法优化支持向量机SVM实现分类附matlab的代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

arduino 复习题

名词解释 中断 计算机运行过程中&#xff0c;出现某些意外情况需主机干预时&#xff0c;机器能自动停止正在运行的程序并转入处理新情况的程序&#xff0c;处理完毕后又返回原被暂停的程序继续运行 中断服务程序 用于 CPU 处理中断的程序 中断源 引起中断的原因&#xff0c;或…

【JVS低代码平台】如何实现与外部系统/内部代码直接对接?

JVS是开放性的低代码开发平台&#xff0c;为开发团队预留了多种对接的方式。我这里列举集中对接的模式。 用户对接&#xff08;统一登录/单点跳转&#xff09; 在日常的企业需求中&#xff0c;常常有这种情况。企业内部考勤打开都是通过钉钉或者企微的&#xff0c;那么希望我们…

Grasp Detection论文、代码汇总

文章目录2022End-to-end Trainable Deep Neural Network for Robotic Grasp Detection and Semantic Segmentation from RGB2019Antipodal Robotic Grasping using Generative Residual Convolutional Neural Network2022 End-to-end Trainable Deep Neural Network for Robot…

现代PCB生产工艺——加成法、减成法与半加成法

继续为朋友们分享关于PCB生产工艺的知识。 现代PCB生产工艺&#xff0c;目前主要分为&#xff1a;加成法、减成法与半加成法。 其具体定义如下&#xff1a; 加成法&#xff1a; 通过网印或曝光形成图形&#xff0c;经钻孔、沉铜、转移层压等工艺加工&#xff0c;直接将导电图形…

Pycharm开发环境下创建python运行的虚拟环境(自动执行安装依赖包)

问题&#xff1a;基于Django开发的后台程序涉及到很多依赖的开发包&#xff0c;将该项目迁移到其它电脑环境下运行需要搭建环境&#xff0c;由于项目中有requirement.txt&#xff0c;该文件内包含了运行该项目所需的依赖&#xff1b;最简便的方式是执行命令自动安装requirement…