南通大学电气工程学院微机原理课程设计报告书硬件课题压力测控系统(显示电压值)班级电082 学号 ********** 姓名张涛指导教师日期 2011-6-30一、对压力传感器的信号进行检测1.1 设计目的1.巩固和加深课堂所学知识;2.学习掌握一般的硬件的设计方法和查阅、运用资料的能力;3.通过压力测控系统仿真系统设计与制作,深入了解与掌握数模转换,数码管显示的方法,熟悉proteus软件操作。
1.2 设计内容和要求对压力传感器的信号进行检测。
当压力低于30pa时,黄灯闪烁;当压力高于150pa时,红灯闪烁,闪烁周期为1秒。
(功能实现☆)(基本功能实现并在数码管显示压力值,格式为P=XXX,★)(前面2功能实现,并可手动设定压力临界值★★)。
由于我水平有限,只针对基本功能及数码管显示功能进行设计。
1.3 设计原理压力测试系统主要由压力传感器、A/D转换、显示及报警模块组成。
压力传感器将外部压力信号转换为电压信号,经由ADC0809转化为数字信号进行处理,软件中对数字量进行判断,并作相应的跳转,由8255实现正常显示或由8253实现灯闪烁、鸣笛报警。
各个芯片由8086来进行整体的控制。
1.3.1AD转换器的选择ADC0809是逐次比进行的8路8位A/D转换器。
芯片内有一个8路模拟开关,一个比较器,一个带有树状模拟开关的256R分压器和一个逐次逼近寄存器。
树状开关盒256R分压器组成一个基本D/A转换器,D/A转换器的输入与输出模拟量进行比较,确定转换结果。
一次A/D转换需要8次比较确定。
ADC0809的技术指标如下:◆单极性8路输入电压,范围为0~5V;◆分辨率:8位◆转换速度:128us(在CLK为500KHZ时)1.3.2 8255的主要性能8255A是Intel公司的微处理器配套的通用课编程并行接口芯片,是有40个引脚的双列直插式组件,其基本功能如下:8255A接口芯片有3个8位并行输入/输出端口,可利用编程方法设置3个端口是作为输入端口还是作为输出端口;8255A能适应CPU与IO接口之间的多种数据传送方式的要求。
如无条件传送,查询方式传送,中断方式传送。
与此相对应,8255A设置了方式0,方式1和方式2。
8255A的C口比较特殊,除作为数据口之外,在工作方式1和方式2下,它的部分信号被分配作为专用的联络应答信号。
8255A的内部结构分为四个部分:数据总线缓冲器,读/控制逻辑,A组和B组控制电路。
◆数据总线缓冲器它是一个双向三态的8位缓冲器,与CPU系统数据总线相连。
输入数据,输出数据,控制命令字都是通过数据总线缓冲器进行传送的。
◆读/写控制逻辑读/写控制逻辑接受来自CPU地址总线信号和控制信号,并发出命令到俩个控制组(A组和B组)。
它控制把CPU发出的控制命令或输出的数据送到相应的端口,或者把外设的状态或输入的数据从相应的端口送到CPU。
◆A组和B组控制A,B和C3个端口的工作方式是CPU通过向控制寄存器写A组和B组方式控制字来设定的。
端口A和端口C的高四位(PC7-PC4)构成A组,由A组控制部件对他进行控制;端口B和端口C的低四位(PC3-PC0)构成B组,由B 组控制部件对他进行控制。
1.4 程序流程图与程序代码1.4.1流程图:1.4.2程序代码:IOAPT EQU 0800HIOBPT EQU 0802HIOCPT EQU 0804HIODPT EQU 0806H ;8255控制口ADCPT EQU 0902H ;0809通道1TCON0 EQU 0500HTCON1 EQU 0502HTCON2 EQU 0504H ;8253通道TCON4 EQU 0506H ;8253控制口CODE SEGMENTASSUME CS:CODEORG 1000HSTART:MOV DX,IODPTMOV AL,10000000B ;ABC三口均设为输出 OUT DX,ALMOV DX,TCON4MOV AL,00110111BOUT DX,ALMOV DX,TCON0 ;通道0,赋初值MOV Al,50HOUT DX,AlMOV Al,01HOUT DX,AlMOV DX,TCON4MOV AL,01110111BOUT DX,ALMOV DX,TCON1 ;通道1,赋初值MOV Al,50HOUT DX,AlMOV Al,01HOUT DX,AlMOV DX,TCON4MOV AL,10110111BMOV DX,TCON2 ;通道2,赋初值MOV Al,02HOUT DX,AlMOV Al,00HOUT DX,Al;********************AD转换******************************* ADCON1:MOV AX,00 ;8086写引脚有效,启动ADMOV DX,ADCPTOUT DX,ALMOV CX,0500HDELAY:LOOP DELAY ;延时,等待转换结束GETDATA:MOV DX,ADCPTIN AL,DX ;读取A/D转化值CMP AL,30JAE AA1CALL LESS30 ;小于30,跳至红灯闪烁报警JMP ADCON1AA1:CMP AL,150JBE CHULICALL LARGE150 ;大于150,跳至蓝灯闪烁报警JMP ADCON1CHULI:CALL CONVERCALL DISPLAYJMP ADCON1;********************AD转换*******************************CONVER PROC ;分别提取数字量个、十、百放暂存区AAMMOV BUF,ALAAMMOV BUF+1,ALMOV BUF+2,AHRETCONVER ENDP;**************三位数码管的静态显示*********************** DISPLAY PROCDISPAGAIN1:LEA SI,TABMOV BL,BUFMOV BH,0MOV AL,[BX][SI]MOV DX,IOCPT ;取个位段码OUT DX,AL ;C口输出,显示个位LEA SI,TABMOV BL,BUF+1MOV BH,0MOV AL,[BX][SI] ;取十位段码MOV DX,IOBPTOUT DX,AL ;B口输出,显示十位LEA SI,TABMOV BL,BUF+2MOV BH,0MOV AL,[BX][SI] ;取百位段码MOV DX,IOAPTOUT DX,AL ;A口输出,显示百位RETDISPLAY ENDP;**************三位数码管的静态显示***********************;************压力小于30,红灯闪烁报警********************* LESS30 PROCMOV DX,IOAPTMOV AL,00HOUT DX,ALMOV DX,IOBPTMOV AL,80HOUT DX,ALMOV DX,IOCPT ;发声报警MOV AL,80HOUT DX,ALRETLESS30 ENDP;*************压力小于30,红灯闪烁报警********************;*************压力大于150,蓝灯闪烁报警******************* LARGE150 PROCMOV DX,IOAPTMOV AL,80HOUT DX,ALMOV DX,IOBPTMOV AL,00HOUT DX,ALMOV DX,IOCPT ;发声报警MOV AL,80HOUT DX,ALRETLARGE150 ENDP;*************压力大于150,蓝灯闪烁报警*******************TAB DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,3FH,06H,5BH,4FH,66H,6DH BUF DB 0,0,0 ;定义缓冲区,预存数据CODE ENDSEND START1.5 程序调试情况(该部分记录测试数据、调试结果及调试过程中遇到的主要问题和解决办法。
)1.5.1硬件电路各模块截图如下:⑴端口地址产生模块⑵数模转化模块⑶ 8255输出数码管显示模块⑷ 8253闪烁、鸣笛报警模块1.5.2 调试过程中遇到的主要问题和解决办法⑴仿真过程中,不能连续采集仿真运行中,通过调节滑动变阻器阻值,改变模拟信号时,系统并不能做出相应的显示或报警,只有重启仿真方可实现刷新。
解决办法:利用debug下8086\Source Code 单步运行调试程序后,将程序中返回点由获取AD转化改至AD转化启动处,进而实现实时刷新。
⑵ 8253通道不能正确实现方波输出起初,首先对8253各通道写控制字,门控信号接高电平,保持长通,需要输出方波时,再于对应子程序内对通道赋初值,调试结果显示,这种做法是不可取的。
解决办法:正确方法应该先赋初值,写控制,门控信号保持低电平,待需要输出方波时,对门控信号施加高电平即可。
但问题又出来了,对门控信号施加高电平前,输出口一直是高电平,这就导致报警灯不报警时,也是点亮状态。
查阅微机原理课本,得知8253通道的输出信号自写入控制字起便转为高电平,我考虑在8253输出口添加一个与门,即当门控信号与输出信号同为高时,才去点亮报警灯及发声器件,到此,闪烁问题全部解决。
⑶当压力超出30~~150范围,需要报警时,程序里只调用闪烁报警模块,而不调用数码管显示模块。
调试发现,此时数码管仍有残余的数字显示解决办法:在报警程序段内添加对8255数码管输出口清零代码,可实现只报警不显示。
三、设计总结与体会这次设计虽然仅有短短几天时间,我主动把握住课余闲暇时间,从熟悉流程、搭试硬件、编程到调试成功,真正做到了独立设计,遇到问题独立思考及追求功能优化。
事实上,我们很轻易做到熟识某个芯片的功能,引脚名称。
但实际运用起来,并不那么顺利,每个芯片都有它的应用规则,真正掌握其规则,才能在万变的设计工作中灵活应用。
我的另一点深刻的感触是,解决问题,一定要寻根究源,找出问题的根本所在。
就比如面对8253控制LED闪烁问题,身边同学多认为是硬件问题,事实不是这样的,而答案就在我们曾经的微机原理课本中。
花了整整一天的时间,才把这个问题解决掉,回过头来想想,这本该是能顺理成章解决掉的问题,之所以花了这么多时间才解决掉,关键还在于对芯片应用规则的掌握不够牢固。
由此可知,基础知识是多么的重要。
再一点深刻的感触是,一个好的算法可以使代码变得大为简洁。
把数字量显示到数码管之前要先对数值处理,提取出个、十、百位。
我习惯上用累除10取余的方法,代码赘长。