文章目录[隐藏]
一、整体框架
目标为利用8086系统的知识设计压力计。首先使用8255的三个通道完成对ADC采样值的输入、对数码管显示值的控制以及对状态指示灯的控制。ADC采样选用了ADC0808芯片,进行模拟值转换为8位数字值。利用8259中断芯片进行ADC采样值的读取工作。针对压力计的任务选用了MPX4115压力传感器将设定压力值转换成模拟电压。此外还采用了数码管译码器和四位共阴极数码管进行数值的显示,最后还设置了三个状态指示灯,用以查看工作状态。最终实现对以上各芯片与外设的硬件连接和软件设计,完成实时将压力传感器的压力值在数码管上显示的功能。
二、系统设计
2.1 设计思路
本设计采用8086最小系统作为控制系统,74LS373作地址锁存器,74154作为地址译码器产生芯片片选信号。
首先选用MPX4115压力传感器输出电压信号,用Proteus产生10kHz信号作为ADC0808的时钟信号,利用8255芯片C口输出触发信号开启ADC0808进行电压模数转换。再利用ADC0808的转换结束信号EOC作为中断输入发送给8253中断芯片,开启采样中断服务函数。在中断服务函数中,利用8255芯片A口获取ADC0808转换完成的数字信号。最后在程序中将此信号经一系列处理,从8255的B口经4511数码管译码器发送给4位共阴极数码管,进行压力值显示。
此外,8255芯片的C口输出端连接了红、黄、绿三个发光二极管,作为系统状态指示灯,分别代表达到测量值达量程上限、测量值达量程下限以及测量值在量程内,系统正常工作三种状态。
2.2 8086控制电路设计
8086CPU共40条引脚,按其功能分可分为地址总线、数据总线、控制总线以及其它。由于当前设计8086CPU工作于最小模式,故其
M
N
/
M
X
‾
\ MN/\overline{MX}
MN/MX引脚需接+5V决定其工作模式。
2.3 地址总线电路设计
由于8086CPU的地址/数据总线是分时复用的,在总线周期的前一部分时间CPU送出地址信号,在总线周期的后半部分CPU送出数据信号,故需要使用74LS373芯片将CPU送出的地址信号进行锁存,这样在总线周期的后半部分地址和数据才能同时出现在系统的地址总线和数据总线上。
另外,由于在所设计系统中由8086CPU产生全部控制信号控制所有芯片,故需要利用一个三八译码器74LS138将8086CPU送出的地址数据转换成一个片选信号,确保控制对象的准确性。
2.4 ADC0808采样电路设计
2.4.1 ADC0808工作方式
ADC0808 是含8 位A/D 转换器、8 路多路开关,以及与微型计算机兼容的控制逻辑的CMOS组件,其转换方法为逐次逼近型。ADC0808的精度为 1/2LSB。在AD 转换器内部有一个高阻抗斩波稳定比较器,一个带模拟开关树组的256 电阻分压器,以及一个逐次通近型寄存器。8 路的模拟开关的通断由地址锁存器和译码器控制,可以在8 个通道中任意访问一个单边的模拟信号。
ADC0808芯片有28条引脚,各引脚功能如下:
IN0-IN7:8路模拟量输入端。
OUT1-OUT8:8位数字量输出端。
ALE:地址锁存允许信号,输入,高电平有效。
START: A/D转换启动脉冲输入端,输入一个正脉冲(至少100ns宽)使其启动(脉冲上升沿使0809复位,下降沿启动A/D转换)。
EOC: A/D转换结束信号,输出,当A/D转换结束时,此端输出一个高电平(转换期间一直为低电平)。
OE:数据输出允许信号,输入,高电平有效。当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量。
CLK:时钟脉冲输入端。要求时钟频率不高于640KHZ。
VREF+和VREF-:参考电压输入端
ADDA、ADDB、ADDC:3位地址输入线,用于选通8路模拟输入中的一路,通道选择按下表选择
通道选择 | ADD A | ADD B | ADD C |
---|---|---|---|
IN0 | 0 | 0 | 0 |
IN1 | 1 | 0 | 0 |
IN2 | 0 | 1 | 0 |
IN3 | 1 | 1 | 0 |
IN4 | 0 | 0 | 1 |
IN5 | 1 | 0 | 1 |
IN6 | 0 | 1 | 1 |
IN7 | 1 | 1 | 1 |
2.4.2 ADC0808硬件电路设计
本设计只需检测单个压力信号的大小,故只采用ADC0808的IN0引脚作为模拟量输入端口,因此将3位地址输入线ADDA、ADDB、ADDC的值设置为000,硬件上将它们接地即可。时钟频率不高于640KHZ,采用10kHz即可。
关于参考电压的选取,需要检测MPX4115压力传感器的模拟电压输出和给定压强的大小。MPX4115的量程下限为15kPa,在标准5V电压的输入下,此时的模拟电压输出为+0.2579V,MPX4115的量程上限为115kPa,考虑到ADC0808的输出为8位数字量,为了减小非线性误差,同时方便软件处理,我选取了100kPa作为本系统的量程上限,原因是8位数字能表示的范围为255,此时的量程为85kPa,数值为255的三分之一。在100kPa、输入电压为5V 时,模拟电压输出为+4.0920V。因此将+0.2579V和+4.0920V作为ADC0808的参考电压,这样能得到较准确且易处理的数字量输出,在程序设计上可以很方便地设置为1kPa的分辨率。
最后,我将启动脉冲输入端START和地址锁存允许端ALE连接起来,利用8255芯片C口PC0与地的或非给ADC0808输入开启信号。并将数字量输出端OUT1-OUT8连接8255芯片A口进行输出。原理图如下
2.5 8259中断控制电路设计
2.5.1 工作方式
8259可编程中断控制器可用于管理8086系列微机系统的外部中断请求,实现优先权的排队、提供终端类型码、屏蔽中断输入等功能,单片8259可以管理8级中断。
IR0接ADC的A/D转换结束信号端EOC作为中断请求信号,每当ADC转换完成,则给给8259发出中断请求信号,并在中断服务函数中接收ADC数字量输出。
2.5.2 8259程序设计
8259初始化命令字ICW1用于规定8259的连接方式(单片或级联)和中断源请求信号的有效形式(电平触发或边沿触发),其格式如图11。由于在该系统中只有七个中断,连接方式选择单片使用,且令触发方式选择边沿触发,需要设置ICW4(对8086CPU而言必须设置ICW4),故初始化命令字ICW1为00010011(13H)。
8259初始化命令字ICW2用于设置中断类型码基值,其格式如图12所示,设0级中断源IR0所对应的中断类型码为80H,故初始化命令字ICW2为10000000(80H)。
8259初始化命令字ICW3用于表明8259级联方式,由于该系统8259单片使用,故无需设置。
8259初始化命令字ICW4只有当IC4=1时才需要设置,对8086系统而言,ICW4是必须设置的初始化命令字,该命令字用于规定8259的工作方式、终端优先顺序和中断结束方式等,其格式如图13所示。由于系统采用8086CPU,故D0=1。令8259工作于一般全嵌套方式(事实上最后只用到了一个中断),非缓冲方式,非自动EOI,故初始化命令字ICW4为00000001(01H)。
OCW1对应的就是8259A中的IMR,置 IMR = 0000,0000B
地址定义:
#define ICW1 0100H
#define ICW2 0104H
#define ICW3 0104H
#define ICW4 0104H
#define OCW1 0104H
#define OCW2 0100H
#define OCW3 0100H
初始化程序
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 00001000B 中断类型号为80H,A0=1
outp(ICW4, 01H); // ICW4 00000001B
outp(OCW1, 00H); // OCW1 置 IMR = 0000,0000B
}
2.6 数码管与指示灯电路设计
2.6.1 工作原理
首先此设计需要用到三个数码管输出,因此我采用了四通道十进制共阴极数码管,即单个数码管的所有LED阴极连接在一起,通过循环选通输出的方式对不同数码管进行输出,如下图。
此外为了方便设计,我采用了4511数码管译码器进行十进制值的译码并输入数码管,如下图所示。
此外我设计了三个状态指示灯,进行系统的状态显示,如下图所示。
以上几个外设中,数码管由8255的B口输出进行控制,指示灯由8255的C口输出进行控制。
2.6.2 代码设计
首先我封装了一个单个数码管选定显示函数LED_out(),只需输入数码管的位置与所需输入的十进制数字即可进行输出。再封装了一个四位数码管显示与状态指示灯控制函数LED_set(),仅需输入十六进制的ADC采样值便可得到10进制的数码管显示以及状态指示灯的显示,代码如下。
void LED_out(char addr, char num)
{
char temp = LED_NUM[num]*16 + LED_ADDR[addr-1];
//num = num * 16 + addr;
__asm
{
MOV DX,MY8255_B
MOV AL,temp
OUT DX,AL
}
}
void LED_set(unsigned int data)
{
data /= 3;
data += 15;
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] == 1)&&(data_num[3] == 5))
{
outp(MY8255_C,08H);
}
else
{
outp(MY8255_C,04H);
}
delayms(10);
}
}
三、整体设计
3.1系统结构图
3.2 程序流程图
四、功能介绍
通过调节MPX4115压力传感器的仿真值,即可在数码管上得到压强的大小。例如此时压力计输入为20kPa,数码管则显示20kPa的值。此外可通过状态指示灯得知系统此时运行状态是否正常。此时系统工作状态为正常。
附完整工程、源代码及展示文件,点击下方链接获取
基于8086处理器的压力计仿真
写在后面
本文章旨在总结备份、方便以后查询,由于是个人总结,如有不对,欢迎指正;另外,内容大部分来自网络、书籍、和各类手册,如若侵权请告知,马上删帖致歉。
版权声明:本文为CSDN博主「流风若离」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xb1461949780/article/details/122287407
一、整体框架
目标为利用8086系统的知识设计压力计。首先使用8255的三个通道完成对ADC采样值的输入、对数码管显示值的控制以及对状态指示灯的控制。ADC采样选用了ADC0808芯片,进行模拟值转换为8位数字值。利用8259中断芯片进行ADC采样值的读取工作。针对压力计的任务选用了MPX4115压力传感器将设定压力值转换成模拟电压。此外还采用了数码管译码器和四位共阴极数码管进行数值的显示,最后还设置了三个状态指示灯,用以查看工作状态。最终实现对以上各芯片与外设的硬件连接和软件设计,完成实时将压力传感器的压力值在数码管上显示的功能。
二、系统设计
2.1 设计思路
本设计采用8086最小系统作为控制系统,74LS373作地址锁存器,74154作为地址译码器产生芯片片选信号。
首先选用MPX4115压力传感器输出电压信号,用Proteus产生10kHz信号作为ADC0808的时钟信号,利用8255芯片C口输出触发信号开启ADC0808进行电压模数转换。再利用ADC0808的转换结束信号EOC作为中断输入发送给8253中断芯片,开启采样中断服务函数。在中断服务函数中,利用8255芯片A口获取ADC0808转换完成的数字信号。最后在程序中将此信号经一系列处理,从8255的B口经4511数码管译码器发送给4位共阴极数码管,进行压力值显示。
此外,8255芯片的C口输出端连接了红、黄、绿三个发光二极管,作为系统状态指示灯,分别代表达到测量值达量程上限、测量值达量程下限以及测量值在量程内,系统正常工作三种状态。
2.2 8086控制电路设计
8086CPU共40条引脚,按其功能分可分为地址总线、数据总线、控制总线以及其它。由于当前设计8086CPU工作于最小模式,故其
M
N
/
M
X
‾
\ MN/\overline{MX}
MN/MX引脚需接+5V决定其工作模式。
2.3 地址总线电路设计
由于8086CPU的地址/数据总线是分时复用的,在总线周期的前一部分时间CPU送出地址信号,在总线周期的后半部分CPU送出数据信号,故需要使用74LS373芯片将CPU送出的地址信号进行锁存,这样在总线周期的后半部分地址和数据才能同时出现在系统的地址总线和数据总线上。
另外,由于在所设计系统中由8086CPU产生全部控制信号控制所有芯片,故需要利用一个三八译码器74LS138将8086CPU送出的地址数据转换成一个片选信号,确保控制对象的准确性。
2.4 ADC0808采样电路设计
2.4.1 ADC0808工作方式
ADC0808 是含8 位A/D 转换器、8 路多路开关,以及与微型计算机兼容的控制逻辑的CMOS组件,其转换方法为逐次逼近型。ADC0808的精度为 1/2LSB。在AD 转换器内部有一个高阻抗斩波稳定比较器,一个带模拟开关树组的256 电阻分压器,以及一个逐次通近型寄存器。8 路的模拟开关的通断由地址锁存器和译码器控制,可以在8 个通道中任意访问一个单边的模拟信号。
ADC0808芯片有28条引脚,各引脚功能如下:
IN0-IN7:8路模拟量输入端。
OUT1-OUT8:8位数字量输出端。
ALE:地址锁存允许信号,输入,高电平有效。
START: A/D转换启动脉冲输入端,输入一个正脉冲(至少100ns宽)使其启动(脉冲上升沿使0809复位,下降沿启动A/D转换)。
EOC: A/D转换结束信号,输出,当A/D转换结束时,此端输出一个高电平(转换期间一直为低电平)。
OE:数据输出允许信号,输入,高电平有效。当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量。
CLK:时钟脉冲输入端。要求时钟频率不高于640KHZ。
VREF+和VREF-:参考电压输入端
ADDA、ADDB、ADDC:3位地址输入线,用于选通8路模拟输入中的一路,通道选择按下表选择
通道选择 | ADD A | ADD B | ADD C |
---|---|---|---|
IN0 | 0 | 0 | 0 |
IN1 | 1 | 0 | 0 |
IN2 | 0 | 1 | 0 |
IN3 | 1 | 1 | 0 |
IN4 | 0 | 0 | 1 |
IN5 | 1 | 0 | 1 |
IN6 | 0 | 1 | 1 |
IN7 | 1 | 1 | 1 |
2.4.2 ADC0808硬件电路设计
本设计只需检测单个压力信号的大小,故只采用ADC0808的IN0引脚作为模拟量输入端口,因此将3位地址输入线ADDA、ADDB、ADDC的值设置为000,硬件上将它们接地即可。时钟频率不高于640KHZ,采用10kHz即可。
关于参考电压的选取,需要检测MPX4115压力传感器的模拟电压输出和给定压强的大小。MPX4115的量程下限为15kPa,在标准5V电压的输入下,此时的模拟电压输出为+0.2579V,MPX4115的量程上限为115kPa,考虑到ADC0808的输出为8位数字量,为了减小非线性误差,同时方便软件处理,我选取了100kPa作为本系统的量程上限,原因是8位数字能表示的范围为255,此时的量程为85kPa,数值为255的三分之一。在100kPa、输入电压为5V 时,模拟电压输出为+4.0920V。因此将+0.2579V和+4.0920V作为ADC0808的参考电压,这样能得到较准确且易处理的数字量输出,在程序设计上可以很方便地设置为1kPa的分辨率。
最后,我将启动脉冲输入端START和地址锁存允许端ALE连接起来,利用8255芯片C口PC0与地的或非给ADC0808输入开启信号。并将数字量输出端OUT1-OUT8连接8255芯片A口进行输出。原理图如下
2.5 8259中断控制电路设计
2.5.1 工作方式
8259可编程中断控制器可用于管理8086系列微机系统的外部中断请求,实现优先权的排队、提供终端类型码、屏蔽中断输入等功能,单片8259可以管理8级中断。
IR0接ADC的A/D转换结束信号端EOC作为中断请求信号,每当ADC转换完成,则给给8259发出中断请求信号,并在中断服务函数中接收ADC数字量输出。
2.5.2 8259程序设计
8259初始化命令字ICW1用于规定8259的连接方式(单片或级联)和中断源请求信号的有效形式(电平触发或边沿触发),其格式如图11。由于在该系统中只有七个中断,连接方式选择单片使用,且令触发方式选择边沿触发,需要设置ICW4(对8086CPU而言必须设置ICW4),故初始化命令字ICW1为00010011(13H)。
8259初始化命令字ICW2用于设置中断类型码基值,其格式如图12所示,设0级中断源IR0所对应的中断类型码为80H,故初始化命令字ICW2为10000000(80H)。
8259初始化命令字ICW3用于表明8259级联方式,由于该系统8259单片使用,故无需设置。
8259初始化命令字ICW4只有当IC4=1时才需要设置,对8086系统而言,ICW4是必须设置的初始化命令字,该命令字用于规定8259的工作方式、终端优先顺序和中断结束方式等,其格式如图13所示。由于系统采用8086CPU,故D0=1。令8259工作于一般全嵌套方式(事实上最后只用到了一个中断),非缓冲方式,非自动EOI,故初始化命令字ICW4为00000001(01H)。
OCW1对应的就是8259A中的IMR,置 IMR = 0000,0000B
地址定义:
#define ICW1 0100H
#define ICW2 0104H
#define ICW3 0104H
#define ICW4 0104H
#define OCW1 0104H
#define OCW2 0100H
#define OCW3 0100H
初始化程序
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 00001000B 中断类型号为80H,A0=1
outp(ICW4, 01H); // ICW4 00000001B
outp(OCW1, 00H); // OCW1 置 IMR = 0000,0000B
}
2.6 数码管与指示灯电路设计
2.6.1 工作原理
首先此设计需要用到三个数码管输出,因此我采用了四通道十进制共阴极数码管,即单个数码管的所有LED阴极连接在一起,通过循环选通输出的方式对不同数码管进行输出,如下图。
此外为了方便设计,我采用了4511数码管译码器进行十进制值的译码并输入数码管,如下图所示。
此外我设计了三个状态指示灯,进行系统的状态显示,如下图所示。
以上几个外设中,数码管由8255的B口输出进行控制,指示灯由8255的C口输出进行控制。
2.6.2 代码设计
首先我封装了一个单个数码管选定显示函数LED_out(),只需输入数码管的位置与所需输入的十进制数字即可进行输出。再封装了一个四位数码管显示与状态指示灯控制函数LED_set(),仅需输入十六进制的ADC采样值便可得到10进制的数码管显示以及状态指示灯的显示,代码如下。
void LED_out(char addr, char num)
{
char temp = LED_NUM[num]*16 + LED_ADDR[addr-1];
//num = num * 16 + addr;
__asm
{
MOV DX,MY8255_B
MOV AL,temp
OUT DX,AL
}
}
void LED_set(unsigned int data)
{
data /= 3;
data += 15;
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] == 1)&&(data_num[3] == 5))
{
outp(MY8255_C,08H);
}
else
{
outp(MY8255_C,04H);
}
delayms(10);
}
}
三、整体设计
3.1系统结构图
3.2 程序流程图
四、功能介绍
通过调节MPX4115压力传感器的仿真值,即可在数码管上得到压强的大小。例如此时压力计输入为20kPa,数码管则显示20kPa的值。此外可通过状态指示灯得知系统此时运行状态是否正常。此时系统工作状态为正常。
附完整工程、源代码及展示文件,点击下方链接获取
基于8086处理器的压力计仿真
写在后面
本文章旨在总结备份、方便以后查询,由于是个人总结,如有不对,欢迎指正;另外,内容大部分来自网络、书籍、和各类手册,如若侵权请告知,马上删帖致歉。
版权声明:本文为CSDN博主「流风若离」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xb1461949780/article/details/122287407
暂无评论