现代通信技术.docx
《现代通信技术.docx》由会员分享,可在线阅读,更多相关《现代通信技术.docx(21页珍藏版)》请在冰豆网上搜索。
现代通信技术
.
《现代通信技术》课程设计
简易计算器设计
学院:
专业班级:
姓名:
学号:
小组成员:
指导教师:
完成日期2014年10月
目录
1绪论1
1.1STC89C52单片机简介1
1.2设计的意义2
2设计的任务和要求5
2.1设计思路5
2.2设计目的和要求5
2.2.1设计目的5
2.2.2基本要求5
3硬件设计6
3.1数码管6
3.2按键模块7
3.3硬件电路图设计7
4软件设计9
4.1主程序设计9
4.2计算模块10
5电路安装与调试12
6设计总结13
参考文献14
附录15
1绪论
1.1STC89C52单片机简介
单片机是指一个集成在一块芯片上的完整计算机系统。
尽管他的大部分功能集成在一块小芯片上,但是它具有一个完整计算机所需要的大部分部件:
CPU、内存、内部和外部总线系统,目前大部分还会具有外存。
同时集成诸如通讯接口、定时器,实时时钟等外围设备。
而现在最强大的单片机系统甚至可以将声音、图像、网络、复杂的输入输出系统集成在一块芯片上。
单片机是为了工业控制需要满足而诞生的,是自动控制系统的核心部件,因而也主要用于工业控制、智能化仪器仪表、家用电器中。
它具有体积小,功能多、价格低、使用方便、系统设计灵活等优点,应用领域不断扩大,除了工业控制,智能化仪表,通讯,家用电器外,在智能化高档电子玩具产品中也大量采用单片机芯片作为核心控制部件。
STC89C52是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。
STC89C52使用经典的MCS-51内核,但做了很多的改进使得芯片具有传统51单片机不具备的功能。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
具有以下标准功能:
8k字节Flash,512字节RAM,32位I/O口线,看门狗定时器,内置4KBEEPROM,MAX810复位电路,3个16位定时器/计数器,4个外部中断,一个7向量4级中断结构(兼容传统51的5向量2级中断结构),全双工串行口。
另外STC89C52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
最高运作频率35MHz,6T/12T可选[1]。
STC89C52单片机是一款迷你型的开发板,小巧而不小气,简约而不简单。
它的外观如下图1.1所示:
图1.1STC89C52单片机
1.2设计的意义
当今社会,随着科学技术的不断发展,人们需要计算的地方也越来越多,也越来越繁重。
在科学界,有些科学计算大到百亿千亿或小到小数点后十位,又有些乘方开方、三角函数、N次开方更是令人苦不堪言。
在生活中,有一些人在生意场上更是要进行快速而准确的计算。
因此,计算器是人们一种不错的选择。
此设计是一种基于单片机技术的简易计算器的方案,本次设计所所提出的一种基于单片机技术的简易计算器的方案,采用具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能集成到一块硅片上构成的一个小而完善的计算机系统——单片机,配以C语言编写的执行软件,能更好的解决计算器计算的问题。
随着数字生活的到来,单片机在生活中越显重要,单片机能将大量的逻辑功能集成与一个集成电路中,而C编写的执行软件对数字的操作简单直观。
本文讨论了单片机技术的计算器的构思、设计方案、工作原理,主要系统包括单片机AT89C52、译码器74-138、数据锁存器74HC45、矩阵键盘,LED显示器等。
主要组成部分包括:
键盘输入模块、运算模块、控制模块、显示模块块。
通过键盘输入数值单片机进行运算后送往LED显示器显示。
计算器(calculator;counter)一般是指“电子计算器”,该名词由日文传入中国。
计算器能进行数学运算的手持机器,拥有集成电路芯片,但结构简单,比现代电脑结构简单得多,可以说是第一代的电子计算机(电脑),且功能也较弱,但较为方便与廉价,可广泛运用于商业交易中,是必备的办公用品之一。
计算器一般由运算器、控制器、存储器、键盘、显示器、电源和一些可选外围设备及电子配件通过人工或机器设备组成。
低档计算器的运算器、控制器由数字逻辑电路实现简单的串行运算,其随机存储器只有一、二个单元,供累加存储用。
高档计算器由微处理器和只读存储器实现各种复杂的运算程序,有较多的随机存储单元以存放输入程序和数据。
键盘是计算器的输入部件,一般采用接触式或传感式。
为减小计算器的尺寸,一键常常有多种功能。
显示器是计算器的输出部件,有发光二极管显示器或液晶显示器等。
除显示计算结果外,还常有溢出指示、错误指示等。
计算器电源采用交流转换器或电池,电池可用交流转换器或太阳能转换器再充电。
为节省电能,计算器都采用CMOS工艺制作的大规模集成电路(见互补金属-氧化物-半导体集成电路),并在内部装有定时不操作自动断电电路。
计算器可选用的外围设备有微型打印机、盒式磁带机和磁卡机等。
从某种角度而言,广义的“计算机”概念是包括“电子计算器”的。
电子计算器中也有集成电路,但计算器的功能简便,价格更加便宜,利于携带与稳定性好。
单片机自问世以来,性能不断提高和完善,其资源又能满足很多场合的应用,加之单片机具有集成度高、功能强、速度快、体积小、功耗低、使用方便、性能可靠、价格低廉,其易于产品化、抗干扰能力强、可在各种恶劣环境下可靠的工作等特点。
特别是它强大的面向控制能力,使它在工业控制领域,智能仪表、外设控制、家用电器、机器人、军事装置等方面得到了广泛的应用[2]。
通过此次单片机的课程设计,我们可以进一步认识单片机在控制系统中的重要性。
在完成理论学习和必要的实验后,学生掌握了单片机的基本原理和各种基本功能的应用,但对单片机的硬件实际应用设计和单片机完整的用户程序设计还不清楚,实际动手能力不够,因此对该课程进行一次课程设计是有必要的。
2设计的任务和要求
2.1设计思路
系统开始工作后,先由键盘输入键值,控制模块对键值进行检测录入存储,然后经运算模块运算后送出显示。
其框架图如图2.1所示:
图2.1系统框图
2.2设计目的和要求
2.2.1设计目的
1.加强对单片机和汇编语言的认识,充分掌握和理解设计各部分的工作原理、设计过程、选择芯片器件、模块化编程等多项知识[3]。
2.用单片机模拟实现具体应用,使个人设计能够真正使用。
3.把理论知识与实践相结合,充分发挥个人能力,并在实践中锻炼。
4.提高利用已学知识分析和解决问题的能力。
5.提高实践动手能力。
2.2.2基本要求
1.通过矩阵键盘可输入0-9的数值和控制加、减、乘、除、清零、等于等功能。
2.输入的数值可依次在四位7段LED数码管上显示。
3.可进行0-9999之间的整数的四则运算。
3硬件设计
3.1数码管
LED数码管如图3-1,实际上是由七个发光管组成8字形构成的,加上小数点就是8个。
这些段分别由字母a,b,c,d,e,f,g,dp来表示。
当数码管特定的段加上电压后,这些特定的段就会发亮,以形成我们眼睛看到的2个8数码管字样了。
如:
显示一个“2”字,那么应当是a亮b亮g亮e亮d亮f不亮c不亮dp不亮。
LED数码管有一般亮和超亮等不同之分,也有0.5寸、1寸等不同的尺寸。
小尺寸数码管的显示笔画常用一个发光二极管组成,而大尺寸的数码管由二个或多个发光二极管组成,一般情况下,单个发光二极管的管压降为1.8V左右,电流不超过30mA。
发光二极管的阳极连接到一起连接到电源正极的称为共阳数码管,发光二极管的阴极连接到一起连接到电源负极的称为共阴数码管。
常用LED数码管显示的数字和字符是0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。
图3.1数码管
3.2按键模块
在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式。
在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。
这样,一个端口(如P1口)就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。
由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的,按键的电路设计如下图3.2所示。
图3.2矩阵按键
3.3硬件电路图设计
硬件系统是指构成微机系统的实体和装置,通常由运算器、控制器、存储器、输入接口电路和输入设备、输出接口电路和输出设备等组成。
单片机实质上是一个硬件的芯片,在实际应用中,通常很难直接和被控对象进行电气连接,必须外加各种扩展接口电路、外部设备、被控对象等硬件和软件,才能构成一个单片机应用系统。
本设计选用以STC89C52单片机为主控单元。
显示部分:
采用LED数码管显示。
按键部分,采用4*4键盘。
为了为后期的程序设计做准备,我们首先进行了硬件电路设计,然后根据电路图和整体的设计思路,使用keil软件编写程序总体设计思路简述如图4.2所示。
1.按照系统设计的功能的要求初步确定设计系统由主控模块、显示模块、键扫描接口电路共三个模块组成。
主控芯片使用STC89C52单片机。
2.键盘电路采用4*4矩阵键盘电路。
3.显示模块采用共阳极数码管构成。
图4.2整体电路设计
4软件设计
4.1主程序设计
计算模块作为计算器的的核心模块共有加、减、乘、除四个部分。
其设计原理是先将键盘输入的BCD码数字转换为十进制数字,然后再对其进行运算。
由于最后需要进行输出显示,所以我们对最终结果又做了一次转换将结果转换为BCD码,以便在LED上显示,如图4.1所示
图4.1主程序设计
4.2计算模块
计算模块作为计算器的核心模块共有加、减、乘、除四个部分。
其设计原理是先将键盘输入的BCD码数字转换为十进制数字,然后再对其进行运算。
由于最后需要进行输出显示,所以我们对最终结果又做了一次转换将结果转换为BCD码,以便在LED上显示。
下面以加法为例对计算模块进行原理介绍。
voidjisuan(chark,chara[8],charb[8])
{
charr[8];数组r用于存储计算结果的BCD码
longi,x,y;
i=0;
x=0;存储第一个数
y=0;存储第二个数
for(i=7;i>0;i--)//数值转化,将代表空格的12转化为数字0,因为个位不显示空格,默认为0,所以不转化
{
while(a[i]==12)a[i]=0;
while(b[i]==12)b[i]=0;
}
x=a[4];
x=10000*x;
x=x+a[0]+a[1]*10+a[2]*100+a[3]*1000+a[5]*100000+a[6]*1000000+a[7]*10000000;将键盘输入的第一个数转换为十进制数
y=b[4];
y=10000*y;
y=y+b[0]+b[1]*10+b[2]*100+b[3]*1000+b[5]*100000+b[6]*1000000+b[7]*10000000;将键盘输入的第二个数转换为十进制数
if(k==10)//加法运算
{
x=x+y;
if(x>99999999)//大于8位,显示“Err”
{
r[0]=11;//r
r[1]=11;//r
r[2]=10;//E
r[3]=12;//空格
r[4]=12;
r[5]=12;
r[6]=12;
r[7]=12;
}
else
{
r[0]=x%10;
r[1]=(x%100)/10;
r[2]=(x%1000)/100;
r[3]=(x%10000)/1000;
r[4]=(x%100000)/10000;
r[5]=(x%1000000)/100000;
r[6]=(x%10000000)/1000000;
r[7]=x/10000000;//此段的功能是利用求余的方法将计算结果转换为BCD码
}
}
从以上程序段中我们可以看出C语言的简单与直观,再进行加法运算时只要输入“+”,就能对数字进行运算,若选用汇编语言,代码将变得很复杂。
5电路安装与调试
在电路板上按整机框图把按键和数码管焊接好,然后按进行调试,连接好每个管脚,接通电源,打开开发板的开关,进行50+3的加法运算结果如下图5.1所示:
图5.1加法运算结果图
输入超出四位或计算结果超出四位,数码管屏幕显示错误提示,如图5.2所示:
图5.2四位溢出报错提示图
6设计总结
这次课程设计带给我们的不仅仅是对课本知识的加深的理解,也锻炼了我们对于把书本知识运用到实践中的能力。
平时在课堂上学到的东西有的虽然明白了,但是毕竟没有实际操作经验,操作起来容易出错;有的只是一知半解,用于实践中就出现了问题。
对于知识的理解知识单纯的停留在书本阶段,自己动手尝试后,这些知识对于我们而言更加鲜活起来了。
课程设计是我们专业课程知识综合应用的实践训练,这是我们迈向社会,从事职业工作前一个必不少的过程。
“千里之行始于足下”,通过这次课程设计,我深深体会到这句千古名言的真正含义。
我今天认真的进行课程设计,学会脚踏实地迈开这一步,就是为明天能稳健地在社会大潮中奔跑打下坚实的基础。
在设计中,从刚刚开始的无从下手,到逐步的知道自己该做什么,该怎么做。
不断地遇到新的问题,不断地尝试各种方法解决,即使失败了也有了经验。
渐渐的发现问题,解决问题,遇到新问题,再解决问题,这种循环让我们体会到了靠自觉解决问题的成就感。
我们的设计也离不开老师的帮助,老师循循善诱的教导和不拘一格的思路给予我无尽的启迪;这次模简易计算器的设计离不开老师您的细心指导。
而您开朗的个性和宽容的态度,帮助我能够很顺利的完成了这次课程设计。
同时感谢对我帮助过的同学们,谢谢你们对我的帮助和支持,让我感受到同学的友谊。
参考文献
[1]徐淑华等编.单片微型机原理及应用[M].哈尔滨:
哈尔滨工业大学出版社,2011:
97-109.
[2]刘光新,李克平,孙剑. 信号控制交叉口行人过街等待时间研究[J].中国安全科学学报.2009(04):
56-58.
[3]毕旭宾,杨永培. 闯红灯自动记录系统检测方法的设计与研讨[J].中国计量.2012(11):
22-25.
[4]冯建华,赵亮.单片机应用系统设计与产品开发[M].北京:
人民邮电出版社,2010:
39-51.
[5]徐雄.基于单片机的闯红灯自动检测系统设计[D].北京:
清华大学,2009:
9-15.
[6]江思敏,陈明编著.Protel电路设计教程[M](第2版).北京:
清华大学出版社.2011:
67-72.
[7]赵泰洋. 一种动态交通信息获取系统的设计与实现[D].大连:
大连理工大学2009:
1-7.
[8]宋杰,汪志宏,江敏编著.微机原理与接口技术课程设计[M].机械工业出版社,2010:
47-49.
[9]R.Hashemian.CondensedHuffmanCoding,ANewEfficientDecodingTechnique[J],
IEEE,2009:
33-35.
[10]康华光.电子技术基础[M].厦门:
厦门大学出版社,2012:
34-41.
[11]于英民.计算机接口技术[M].北京:
电子工业出版社,2013:
56-70.
[12]伍冯洁,谢斌.基于Proteus与Keil的单片机实验教学改革[J].实验室研究与探索.2009(07):
16-20.
附录
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharcodenum[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0x40};//共阳极
ucharcodeloc[]={0x00,0x80,0x40,0x20,0x10};
ucharcodeero[]={~0x79,~0x50,~0x5c};
uintn=0,n1=0,n2=0;//赋初值
ucharflag=0;//计算类型选择关键字
voiddelay(intt);
voiddisplay(intn);
voiderror();
main()
{
while
(1)
{
uchartemp;//第一行检测
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xfe;
if(temp!
=0xfe)
{
temp=P3;
switch(temp)
{
case0xee:
n1=0;n2=0;n=0;flag=0;break;//清零
case0xde:
n1=10*n1+0;n=n1;break;//0
case0xbe:
if(flag==1)n=n2+n1;
if(flag==2)n=n2-n1;
if(flag==3)n=n2*n1;
if(flag==4)n=n2/n1;
n1=0;
break;
case0x7e:
//+
n2=n1;n1=0;
flag=1;break;
}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}//扫描第二行
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
temp=P3;
switch(temp)
{
case0xed:
n1=10*n1+1;n=n1;break;//4
case0xdd:
n1=10*n1+2;n=n1;break;//5
case0xbd:
n1=10*n1+3;n=n1;break;//6
case0x7dn2=n1;n1=0;
flag=2;break;
}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
//扫描第三行
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
temp=P3;
switch(temp)
{
case0xeb:
n1=10*n1+4;n=n1;break;
case0xdb:
n1=10*n1+5;n=n1;break;
case0xbb:
n1=10*n1+6;n=n1;break;
case0x7b:
n2=n1;n1=0;
flag=3;break;
}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}//扫描第四行
P3=0xf7;
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
temp=P3;
switch(temp)
{
case0xe7:
n1=10*n1+7;n=n1;break;//7
case0xd7:
n1=10*n1+8;n=n1;break;//8
case0xb7:
n1=10*n1+9;n=n1;break;//9
case0x77:
n2=n1;n1=0;
flag=4;break;}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
display(n);
}
}//延时函数
voiddelay(intt)
{intx,y;
for(x=0;xfor(y=0;y}//数码管显示
voiddisplay(intn)
{//溢出处理
ucharg,s,b,q;
intabs;
if((n>9999)||(n<-999))
error();//正数
if((n>=0)&&(n<=9999))
{
g=n%10;
s=n/10%10;
b=n/100%10;
q=n/1000%10;
P0=num[g];
delay(5);
P2=loc[4];
delay
(2);
P2=loc[0];
delay(3);
if(n>=10)
{
P0=num[s];
P2=loc[3];
delay
(2);
P2=loc[0];
delay(3);
}
if(n>=100)
{
P0=num[b];
P2=loc[2];
delay
(2);
P2=loc[0];
delay(3);
}
if(n>=1000)
{P0=num[q];
P2=loc[1];
delay
(2);
P2=loc[0];
delay(3);
}
}//负数
if((n<0)&&(n>=-999))
{
abs=-n;
g=abs%10;
s=abs/10%10;
b=abs/100%10;
q=abs/1