1、#define uint unsigned int#define addo (5.0/255.0) uchar code table=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90; /字符码 uchar ad4; uint i,j,flag,k; bit flag1; uint ge4,shif4,baif4,qianf4,ad14; sbit start=P36; /ADC0808工作触发 sbit oe=P11; /ADC0808输出使能 sbit eoc=P30; /ADC0808转换结束信号 sbit adda=P15; /采集信号
2、地址选择 sbit addb=P16; sbit addc=P17; sbit ale=P14; /0808地址锁存 sbit abc=P34; /字符码锁存器锁存控制端 sbit led1=P35; /led片选码锁存器锁存控制端 sbit oe1=P12; /led片选码锁存器使能 sbit speak=P33; /蜂鸣器控制 sbit oe2=P31; /字符码锁存器使能/延时1微秒程序 void delay(int t1) unsigned int i; for(i=0;i=3) flag=1; if(flag=0) else if(flag1=1) speak=1; /显示程序 vo
3、id disp1(int k) abc=0; oe1=0; /oe低电平有效 led1=1; /led显示器锁存透明 P0=0x01; /送入片选码 led1=0; oe2=0; /led显示器锁存片选码 abc=1; /字符码锁存器透明 P0=(tablegek)-128; /显示个位和小数点 /字符码锁存 delay(30); /以下程序内容类似 P0=0x02; P0=table(uint)(shifk); /显示十分位 P0=0x04; P0=table(uint)(baifk); /显示百分位 P0=0x08; P0=table(uint)(qianfk); /显示千分位 P0=0x
4、20; P0=tablek; /显示第几路 oe1=1; void main() /主程序 initT0(); while(1) signalacq(); /信号采集 bd(); warning(); /电压高于或等于3V时产生报警i+) for(k=0;k=5;k+) for(j=0;j oe2=1; delay(10000); k=k+1; oe2=0;程序介绍:我们的程序主要包括端口定义、延时、中断、信号采集、采集信号转换、报警、显示等模块组成。端口定义模块注释比较清楚不再赘述,中断初始化、延时和中断程序比较简单,这里详细介绍一下信号采集和转换、报警以及显示模块。为实现信号采集,我们先将
5、锁存器的输出使能关闭,使之停止输出,然后进入循环采集,使输出使能关闭。直至等到采集结束才允许输出,并把数据通过P2口赋到adi数组中,用以信号数据转化。ADC0808芯片工作参考电压我们选择的是+5V。我们能采集的数据是0到255的数,每一单位代表5.0/255.0V。要转化成电压值需要计算,乘以adi就得到电压值。我们要用显示器循环显示采集信号,则需要将信号转化为显示数据,所以我们先得到数据的每一位的值。计算个位、十分位、百分位和千分位,为显示做准备。显示时我们需要循环显示4路信号,并且扫描显示。这样我们就进入循环,先允许锁存器输出的信号进入。先送片选后送段选,显示个位和小数点,然后锁存一次
6、。再允许进入,送片选和段选,显示十分位,再锁存,如此循环显示百分位、千分位和第几路。报警程序也比较简单,flag1为报警总开关。初始化中断时,也将flag1置一。通过判断那一路信号电压高于或等于3V将报警次开关flag置一,使之产生报警信号。当要使报警关闭报警关闭,按下按键产生中断执行中断程序,将flag1取反,并使报警关闭,再次按下按键时,报警状态再次打开。以上是我们的几个程序模块,主程序是这样运行的:先初始化中断,然后进入无限循环,采集信号,信号数据转换,判断是否报警,在进入显示循环扫描显示4路信号。其中判断哪一路信号大于或等于3V并使这一路电压量显示闪烁。然后循环显示。这就是我们程序的大
7、体介绍。仿真设计该设计主要由以下几个部分组成:A/D转换(ADC0808)、单片机89C52、锁存器74HC573和数码管显示器。我们的设计思路是先利用ADC0808转换,将四路模拟信号通过单片机的P2口存入,在单片机中经过程序计算,得到显示所用的电压数据量。电压量由P0输出显示信号输入到两个锁存器中。两个锁存器分别锁存位码和段码。经过锁存和扫描输出,在显示器上显示出电压值和第几路信号。同时在单片机上接入报警装置,当电阻增大到一定值时,自动报警,按下停止报警开关,报警停止。下面详细介绍一下电路的各个部分:A/D转换(ADC0808)将滑动变阻器的电压信号输入到IN0IN3口,数字信号从OUT口
8、输出,用ADDA、ADDB、ADDC控制采集那路信号。A/D转换启动脉冲输入端,输入一个正脉冲(至少100ns宽)使其启动(脉冲上升沿使0809复位,下降沿启动A/D转换)。 START端口在输出下降沿脉冲时,ADC0808触发开始进行AD转换,当转换完成时EOC变成高电平,检测EOC变高后拉高OE,使转换后的8位二进制数从P2口读入储存。将存储的8位二进制数进行转化得到实际电压量的个位,十分位,百分位,千分位。A/D转换(ADC0808) ADC0808的OUT口输出的数字信号,输入到单片机89C52的P2口,通过把P2口得到的数据进行计算后得到需要显示的电压量。处理后的数据信号通过P0口显
9、示在数码管上。单片机89C5274HC573介绍:OE为使能端。LE为锁存控制端:当LE为高时,这些器件的锁存对于数据是透明的。当变低时,数据会被锁存。我们通过扫描显示输出四路信号。显示的基本思路是:首先关闭输出段选码的锁存器(ABCLATCH),打开输出位选码的锁存器(LED1LATCH) 给P0口赋值选择输出位,然后LE变低使位选保持。然后打开ABCLATCH,送入段选码。循环扫描显示。可以通过重复循环来实现显示滞留。 锁存器74HC573(段选)锁存器74HC573(片选)上面是P1口的上拉电阻。下面是显示器,前四位显示数据,和最后一位显示第几路。从两个锁存器中先后输出到片选和段选,扫描
10、显示四路信号的电压值。在显示时,我们还加入了提示功能,就是当有哪路信号高于或等于3V时,进行闪烁显示用以提示。 上拉电阻和数码管显示器全图运行结果在仿真时点击运行,会观察到显示器循环显示四路的电压值,显示器的前四位是电压值,其中第一位后有小数点,所以是X.XXX,然后最后一位显示的是第几路信号。显示结果如下图:还有如果上面哪路显示超过3,显示此数时会闪烁显示。用于提示报警的是哪路超值。除数码管的显示外,运行结果中还有报警环节。当调节电阻时,如果两电阻其中一个的阻值大于3,那么报警装置就会自动报警。若手动按下控制报警的按钮,可以关闭报警。设计中遇到的问题及解决办法1.我开始进行仿真时发现无法进行
11、正常信号采集,发现ADC0808的输出端是高的(显示为红色)。进行反复调试也不能正常,偶然间将采集电压所需的滑动变阻器上的并联电阻去掉后发现信号采集变得正常。原因分析:刚开始在加入滑动变阻器时无意中并联两个电阻而没有在意,结果影响了信号采集,两个电阻的命名上存在重复,使仿真出现问题。得到的教训是进行仿真时要做到布线明确,并且把多余的线去掉,使线路图明了便于分析。2.一开始我们想通过利用8255芯片进行并口的扩展,把8255的D口和P2口连在一起进行扩展,为了消除信号采集所造成时干扰,而在8255前加入锁存器,但是经过多次调试时仍然不能实现正常的输入输出控制,无法从PA,PB,PC口正常输出。耗
12、费很多时间后仍然没有将问题解决,最后我们放弃使用8255进行并口扩展,而改用在一个显示器上进行循环显示。3.显示器显示电压量的顺序是错误的,顺序相差一个。我们经过检查程序发现我们在信号采集时A/D转换启动脉冲和信号地址锁存的顺序反了。然后进行修改,排除了错误。网上有对芯片的大致介绍,但对于顺序则没有详细介绍,要想详细了解芯片工作原理,看来最好要看芯片的说明书。4.显示问题一直困扰我们,在扫描显示时,经常出现不准确的显示或者错误显示的情况,但是有时是正确的,我们请教几个同学,他们认为是Protues本身扫描问题。但我们觉得是程序有的地方不合理。我们从锁存和显示的地方开始查找,最后我们发现当对显示
13、所需的两个锁存器在其不工作时,使其使能为高电平不让其工作,再运行时发现以前的问题没有了。 5.蜂鸣器不响。上网查询之后发现所用蜂鸣器需要是有源蜂鸣器(有源为有振荡源),而且蜂鸣器的属性中operating voltage不应该是默认的12V,应该将其改成2V或更低,将其改为1V后问题解决。可以改进的地方一、 我们最开始的想法是利用8255芯片进行并口扩展,以实现增加led显示器的片数来显示采集电压,但在实际仿真中,当8255芯片和74HC573锁存器配合使用时出现PA,PB,PC口无法正常输出,估计可能是8255和锁存器共同工作时会锁存不公作时产生的高阻态对8255产生影响或者其他没能发现的原
14、因,虽然在这方面已经耗费很多时间但仍未解决问题,因此放弃这种方式,而利用2个锁存器和led显示器循环显示。如果时间充足的话,还可以考虑8255并口扩展。二、 循环显示多路电压量,会造成采样和显示时间上的延迟。三、设置报警电位是在写程序时就确定的,无法再固化硬件后在进行更改,可以设置键盘按键进行报警电位的修改。但由于并口数量的限制以及扩展并口实现上的一些问题未能实现,如果时间充分的话,应该可以改善。四、在主程序中,还存在不足,比如:在程序运行后,若出现报警,按报警停止开关会结束报警。但再按开关,报警会在下一轮显示第一路信号时重新开启个人体会 总体来说,我们这次的课程设计选题不是很难,也是想通过这
15、次的课程设计来真正深化对单片机编程设计的认识和对所学知识的运用。到目前我们至少都基本掌握了单片机设计的方法,能自己设计编程仿真和运行,这也是我们所期望的。在单片机设计时我们遇到了一些问题,现在看来好像没那么复杂,但至少在刚开始做的时候让我们感到非常烦心。有时候因为花很长时间连一个小问题都解决不了而感到非常郁闷。但这也多少让我们学会在进行设计时,要做到头脑清醒,学会分析问题,而且要遇到问题时不要慌乱,有步骤的处理。这次课程设计给我很深刻的一个体会是在做任何事情的时候都要有一个良好的习惯。刚开始做课程设计的时候,我们原本想着先把仿真线路图给连好,并且写好程序的大概内容,想着在调试的时候再做修改。由
16、于所用芯片很多(一个ADC0808,三个74HC573锁存器,一个8255a芯片,还有一个六位led数码管显示器),有些引脚和定义是混乱的,在实际运行时存在很多问题,分析都是困难的。在对ADC0808芯片和8255芯片还不了解的情况下就乱连线,使后面的调试异常艰难。幸好是两个人共同完成设计,能互相弥补各自的不足,相互学习。在经过重新深入学习和讨论之后,最终解决了一个个问题。虽然最后也没能实现8255并口的扩展,但基本功能还是实现了。我感到单片机设计是一个综合的将所学知识具体运用的过程,既要准确的知识理解,也需要总结实践经验,只有不断积累才能有更大的收获。很遗憾我们没能去具体做出事物,我觉得制作实物的过程是一个对硬件更深入理解运用的过程,可能会发现很多仿真时没有出现的问题需要解决。制作出实物才是真正的运用,希望在以后有时间有机会能够真正做出一个真正的实物设计。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1