资源描述
目 录
一、前言 2
二、总体设计方案 3
2.1 方案论证 3
2.2 方案比较及选择 4
三、单元模块设计 6
3.1 电压调节电路 6
3.2 LM317标准电路 6
3.3 数码管显示电路 7
3.4 ST89C52最小系统 8
四、实验程序 10
4.1 延时模块 10
4.2 键盘扫描 10
4.3 数码管显示程序 11
4.4 利用按键调节输出电压值程序 12
五、硬件调试 16
六、心得体会 17
七、参考文献 18
八、附录 19
一、前言
随着现代科技的不断进步,高质量的生活无疑是人们追求的目标之一,如今这个世界已近进入数字化的时代。数字化的产品也层出不穷,它已经深深的融入人们的日常生活、工作和学习当中。它所给人带来的方便也是不可否定的,而且它让我们的生活更加简单,所以人们对数字化的电子产品要求与需要都不断提高。要为现代人工作、科研、生活、提供更好的更方便的设施就需要一切向着数字化控制,智能化控制方向发展。
其中基于单片机的电子计算器就是一个典型的例子,它是以单片机为控制核心的智能仪器并且在各行各业中应用越来越广泛。基于单片机控制的电子计算器具有体积小、功能强、精确度高等优点。
二、总体设计方案
2.1 方案论证
方案一:
此方案采用8051、4X4键盘、74LS373、6264、液晶显示器LCD1602组成。其中74LS373是地址锁存器,它实质是一个是带三态缓冲输出的8D触发器,在单片机系统中为了扩展外部存储器,通常需要一块74ls373芯片。6264是8K*8位静态随机存储器芯片,采用CMOS工艺制造,单一+5V供电,额定功耗200mW,典型存取时间200ns,28线双列直插式封装.方框图如图1所示。
6264
74LS373
8051
Lcd1602
4X6键盘
图1 原理方框图
方案二:
此方案采用4X4键盘、STC89C52、数码管组成。在该方案中我们利用A\DC0832将模拟信号转化为数字信号并与数码管相连将相应的电压值显示出来。方框图如图2所示。
STC89C52
4X4键盘
数码管
图2 原理方框图
方案三:
此方案采用PS2键盘、STC89C52、LCD1602组成。方案三利用PS2键盘作为数字以及符号的输入,并通过单片机来控运算的过程,计算的过程以及结果由LCD1602显示出来。方框图如图3所示。
STC89C52
PS2键盘
LCD1602
图3 原理方框图
2.2 方案比较及选择
方案一由于用了4X6键盘所以外加了地址锁存器,6264采用的是5V的电源。电路连接比较复杂。因而不采用一方案。
方案二虽然可以利用4X4键盘来实现电路中必要数字符号的的输入,从而来达到计算的目的,且实验电路简单,但数码管的显示功能不强,显示的数字位数有限。因此不宜选择方案二。
方案三,电路原理简单,成本低,方案简单易行,固选用方案三。
三、单元模块设计
3.1 液晶显示电路
1602可以显示2行、每行显示16个ASCII字符,并且可以自定义图形,只需要写入相对应字符的ASCII码就可以显示,使用上相对数码管更能显示丰富的信息,我们主要通过1602的显示程序来学习一下如何看时序图。
下面是1602各引脚的功能,具体不同厂家生产的引脚可能不一样,大家使用前要注意看厂家提供的资料。
图一
D0~D7端为8位数据口,进行数据传送,而RS、R/W、E端则配合可以做出不同的操作,对1602进行操作主要有四种,如下:
1、读状态,输入:RS=L,RW=H,E=H。输出:D0~D7=状态字
2、写指令,输入:RS=L,RW=L,D0~D7=指令,E=高脉冲。输出:无
3、读数据,输入:RS=H,RW=H,E=H。输出:D0~D7=数据
4、写数据,输入:RS=H,RW=L,D0~D7=数据,E=高脉冲。输出:无
从以上可以看出,如果想对1602进行何种操作,只要按其相对应的操作规程来做即可。
虽然以上有四种操作,但实际上归类起来只有二种,一种读一种写。好了,我们接着看看,进行读与写时时序图:
这张图初学者看起来可能有点晕,其实我们只要关注的地方是中间的Valid Data即有效数据区,我们进行读或写,无非都是想进行数据的传送,在时序图中,为了看起来更清楚些,我们画上两根红色,大家注意这个位置各个引脚的状态,先看读操作时序。
在进行读操作的时候,RW置于1,RS则根据读的内容(状态或数据)置为1或0,注意看图中的A和B两根红线,在A位置,E置为1,经过td时间后,可以在数据口读到正确的数据,由于td的时间极短(ns级),我们的单片机操作一般是us级,所以可以不考虑这个时间差,在将E置为1之后,就可以紧跟着指令去读取数据,在读到数据后,再将E置为0,经过THD2时间后,数据口上的数据失效。
在进行写操作的时候,RW要置为0,RS根据写的内容不同(指令或数据)置为1或0,同时,大家注意C和D两根红线,我们在将E置为1之前,要先将数据送到数据口上,然后,在C位置,将E置为1,经过tPW延时后,再将E置为0,在这个时间段内必须保证数据口上的数据稳定不变,为有效的数据。同理,由于tPW这些延时相对较短(ns级),所以在单片里也不必考虑延时问题。
我们下面来看看,程序上如何做到。我们看下面两个子程序,Read1602()用于读取1602的状态(读数据比较少用,这里不写了,大家自己改改就可以),并且将状态判断也写在这个子函数里面。Write1602()用于写入数据到1602里面,写指令、数据共用一个函数。大家对照图二的时序图看看是否一致。
为了防止读忙状态里陷入死循环,在Read1602()函数里加入一个循环变量i,在读状态时,数据线最高位是由1602内部拉为低电平的(表示空闲),当器件发生问题或者1602没有接好时,程序就会在这里等待,所以,加入一定时间限制是有必要的。
以上是两个基本的函数,在使用1602之前,必须对其进行初始化操作,初始化过程是往1602固定写入一定的指令,里面包括指定使用模式、清屏等等,各种指令的含义我们在课程后附上详细说明,来看下面的程序(mDelay函数和以前课程一样)。
有了以上三个函数,我们就可以把1602控制起来了。在1602上,分为二行,每行有16个字符位置,如何来在我们需要的位置上显示出对应的字符呢?我们先来看看这两行对应的地址是什么。
上图是1602显示RAM缓冲区对应的地址,要在对应的位置显示出字符,首先要写入一个设置数据地址的指令码(80H+地址),然后紧跟着写入要显示的数据即可。应用我们上面的Write1602()指令,执行下面二条指令。
写指令:Write1602(0x80+地址,0)
写数据:Write1602(字符ASCII码,1)
为了更直观的应用,我们编写下面两个函数,使用起来就更方便了。
WrByte1602()用于在固定位置写入一个字符,一次只能写一个,WrString1602()则是用来整行写入字符串的,一次只能写一行,字符串需要先定义好。
这样,我们基本上就掌握了1602的控制显示了,另外还有自定义图形的应用,一些扩展指令的使用,大家可以看看详细的技术资料,自己尝试,这里不再逐一说明。
这一课程到此结束,这课没有提供完整的程序,只有几个子函数,相信大家经过这么多课的学习,自己编写一下应该不难了,大家实际试试,作为课后作业。
3.2 ST89C52最小系统
STC89C52系列单片机是宏晶科技推出的新一代超强抗干扰/高速/低功耗的单片机,指令代码完全兼容传统8052单片机,12时钟/其周期和6时钟/机器周期可任意选择,最新的D版本内部集成MAX810专用复位电路。选用STC85C52单片机的理由:降低成本,提升性能,原有程序直接使用,硬件无须改动,所以此次试验选择此款单片机。STC89C52芯片引脚图如图7所示。
图7 STC89C52芯片引脚图
四、实验程序
4.1 延时模块
该延时函数利用两个for循环来实现。
void delay(uint n)
{
uchar m;
for(;n>0;n--)
for(m=0;m<100;m++)
{;}
}
////送液晶屏显示子程序/////
void display(uchar C)
{
switch(C)
{
case 0:
clear();
break;
case 1:
prodis();
alldata[cursor]=0;
wrdata('0');
break;
case 2: /*********显示等号结果*********/
prodis();
wrdata('='); /////////////////
kind=kind+10;
position2=cursor;
datajs();
remove0();
data3dis();
break;
case 3:
prodis();
kind=kind+1; /////////加法运算, kind=1
position1=cursor;
wrdata('+');
break;
case 4:
prodis();
alldata[cursor]=1;
wrdata('1');
break;
case 5:
prodis();
alldata[cursor]=2;
wrdata('2');
break;
case 6:
prodis();
alldata[cursor]=3;
wrdata('3');
break;
case 7:
prodis();
kind=kind+2; ////////////减法运算, kind=5
position1=cursor;
wrdata('-');
break;
case 8:
prodis();
alldata[cursor]=4;
wrdata('4');
break;
case 9:
prodis();
alldata[cursor]=5;
wrdata('5');
break;
case 10:
prodis();
alldata[cursor]=6;
wrdata('6');
break;
case 11:
prodis();
kind=kind+3; /////////////乘法运算, kind=25
position1=cursor;
wrdata('*');
break;
case 12:
prodis();
alldata[cursor]=7;
wrdata('7');
break;
case 13:
prodis();
alldata[cursor]=8;
wrdata('8');
break;
case 14:
prodis();
alldata[cursor]=9;
wrdata('9');
break;
case 15:
prodis();
kind=kind+4; ///////////////除法运算, kind=125
position1=cursor;
wrdata('/');
break;
default:
break;
}
}
五、软硬件调试
六、心得体会
首先感谢学院领导给予我们比赛的机会,让我们能够利用空余的时间认识自我,充实自已,完善自我!其次特别感谢李涛老师,还有各位师兄的耐心指导。通过本次培训我们真的获益良多!
在本次设计过程中,我们对单片机都有了初步的了解、认识与应用。总的来说,这次课程设计让我受益匪浅,我深切体会到综合设计的重要性,它使我们能将所学知识系统化,掌握它们的用途和使用方法,并且联系理论和实践,更有助于我们吸收知识;并且综合设计能充分体现一个人的自学能力、发现问题、思考问题以及解决问题的综合能力,更重要的是让我们体会到了团队合作的重要性。这次综合设计的过程中,在摸索该如何设计电路使之实现所需功能的环节,特别有趣,培养了我们的设计思维,增加了实际操作能力,在让我们体会到了设计电路的艰辛的同时,更让我体会到成功的喜悦和快乐。
七、参考文献
[1]. 童诗白,华成英。模拟电子技术基础.北京:高等教育出版社,2003
[2]. 阎石.数字电子技术基础。北京:高等教育出版社,1983
[3]. 高峰编.单片微型计算机原理与接口技术.北京:科学出版社,2003
八、附录
展开阅读全文