广西科技大学单片机课程设计简易计算器.docx

上传人:b****6 文档编号:7322867 上传时间:2023-01-22 格式:DOCX 页数:23 大小:474KB
下载 相关 举报
广西科技大学单片机课程设计简易计算器.docx_第1页
第1页 / 共23页
广西科技大学单片机课程设计简易计算器.docx_第2页
第2页 / 共23页
广西科技大学单片机课程设计简易计算器.docx_第3页
第3页 / 共23页
广西科技大学单片机课程设计简易计算器.docx_第4页
第4页 / 共23页
广西科技大学单片机课程设计简易计算器.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

广西科技大学单片机课程设计简易计算器.docx

《广西科技大学单片机课程设计简易计算器.docx》由会员分享,可在线阅读,更多相关《广西科技大学单片机课程设计简易计算器.docx(23页珍藏版)》请在冰豆网上搜索。

广西科技大学单片机课程设计简易计算器.docx

广西科技大学单片机课程设计简易计算器

  

单片机技术课程设计

 

课题名称基于单片机的简易计算器设计

 

系别理学院___

专业_电子信息科学与技术

班级___

学号姓名_____

指导教师

 

目录

一 绪论

1.1设计概述...............................................3

1.2项目设计要求...........................................3

 

二  系统设计

2.1框图设计…………………………………………………………..…..3

2.2知识点………………………………………………………..………..4

 

三  硬件设计

3.1电路原理图………………………………………………………..…...8

 

四  软件设计

4.1程序流程图………………………………………………………….….9

4.2程序清单…………………………………………………………...…..10

 

五  系统仿真及调试……………………………………………………….15

六  总结和愿望…………………………………………………………….19

   致谢…………………………………………………………………….19

   参考文献……………………………………………………………….20

 

一 绪论

1.1设计概述

中国古代最早采用的一种计算工具叫筹策,又被叫做算筹.这种算筹多用竹子制成,也有用木头、兽骨充当材料的,约270枚一束,放在布袋里可以随身携带。

17世纪初,西方国家的计算工具有了较大的发展,英国数学家纳皮尔发明的“纳皮尔算筹”,英国牧师奥却德发明了圆柱形对数计算尺,这种计算尺不仅能做加减乘除、乘方、开方运算,甚至可以计算三角函数、指数函数和对数函数,这些计算工具不仅带动了计算器的发展,也为现代计算器的发展奠定了良好的基础,计算器已经成为现代社会应用的广泛的计算工具。

 

1.2项目设计要求

主要研究内容和功能要求:

※研究内容:

单片机控制技术+阵列键盘编程识别+显示输出方法+基本运算实现

※功能要求:

1)计算结果的有效显示(可采用数码管或LCD屏,自主选择);

2)阵列键盘按键实现基本的功能:

0~9、四则运算、三角函数、求幂运算、对数运算等;

3)有效精度、计算范围的确定;

4)完成相关电路的原理图绘制

二  系统设计

2.1框图设计

2.2知识点

本项目需要通过学习和查阅资料,掌握和了解如下知识:

1)单片机复位电路工作原理

关于单片机的置位和复位,都是为了把电路初始化到一个确定的状态,一般来说,单片机复位电路作用是把一个例如状态机初始化到空状态,而在单片机内部,复位的时候单片机是把一些寄存器以及存储设备装入厂商预设的一个值。

单片机复位电路原理是在单片机的复位引脚rst上外接电阻和电容,,实现上电复位,而复位时间是(时钟周期=12×振荡周期,振荡周期=1/f),这个时间只能大不能小,具体数值可以由rc电路计算出时间常数。

MCS-51单片机是高电平复位,所以先看给单片机加5V电源(上电)启动时的情况:

这时电容充电相当于短路,你可以认为RST上的电压就是VCC,这是单片机就是复位状态。

随着时间推移电容两端电压升高,即造成RST上的电压降低,当低至阈值电压时,即完成复位过程。

 

2)单片机晶振电路工作原理

晶振是晶体振荡器的简称。

它用一种能把电能和机械能相互转化的晶体在共振的状态下工作,以提供稳定,精确的单频振荡。

在通常工作条件下,普通的晶振频率绝对精度可达百万分之五十。

高级的精度更高。

有些晶振还可以由外加电压在一定范围内调整频率,称为压控振荡器(VCO)。

  晶振在数字电路的基本作用是提供一个时序控制的标准时刻。

数字电路的工作是根据电路设计,在某个时刻专门完成特定的任务,如果没有一个时序控制的标准时刻,整个数字电路就会成为“聋子”,不知道什么时刻该做什么事情了。

  晶振的作用是为系统提供基本的时钟信号。

通常一个系统共用一个晶振,便于各部分保持同步。

有些通讯系统的基频和射频使用不同的晶振,而通过电子调整频率的方法保持同步。

  晶振通常与锁相环电路配合使用,以提供系统所需的时钟频率。

如果不同子系统需要不同频率的时钟信号,可以用与同一个晶振相连的不同锁相环来提供。

  电路中,为了得到交流信号,可以用RC、LC谐振电路取得,但这些电路的振荡频率并不稳定。

在要求得到高稳定频率的电路中,必须使用石英晶体振荡电路。

石英晶体具有高品质因数,振荡电路采用了恒温、稳压等方式以后,振荡频率稳定度可以达到10^(-9)至10^(-11)。

广泛应用在通讯、时钟、手表、计算机……需要高稳定信号的场合。

  石英晶振不分正负极,外壳是地线,其两条不分正负

3)按键电路

通常所用的按键为轻触机械开关,正常情况下按键的接点是断开的,当我们按压按钮时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。

因而机械触点在闭合及断开的瞬间均伴随有一连串的抖动,按键的时序如下图2所示,抖动时间的长短由按键的机械特性及操作人员按键动作决定,一般为5ms~20ms;按键稳定闭合时间的长短是由操作人员的按键按压时间长短决定的,一般为零点几秒至数秒不等。

一次完整的击键过程,包含以下5个阶段:

    1.等待阶段:

此时按键尚未按下,处于空闲阶段。

    2.前沿(闭合)抖动阶段:

此时按键刚刚按下,但按键信号还处于抖动状态,这个时间一般为5~20ms。

为了确保按键操作不会误动作,此时必须有个前沿消抖动延时。

    3.键稳定阶段:

此时抖动已经结束,一个有效的按键动作已经产生。

系统应该在此时执行按键功能;或将按键所对应的键值记录下来,待按键释放时再执行。

    4.后沿(释放)抖动阶段:

一般来说,考究一点的程序应该在这里再做一次消抖延时,以防误动作。

但是,如果前面“前沿抖动阶段”的消抖延时时间取值合适的话,可以忽略此阶段。

    5.按键释放阶段:

此时后沿抖动已经结束,按键已经处于完全释放状态,如果按键是采用释放后再执行功能,则可以在这个阶段进行按键操作的相关处理。

七段数码管的特性及其使用

4)51单片机引脚

1、主电源引脚(2根)

VCC(Pin40):

电源输入,接+5V电源

GND(Pin20):

接地线

2、外接晶振引脚(2根)

XTAL1(Pin19):

片内振荡电路的输入端

XTAL2(Pin18):

片内振荡电路的输出端

3、控制引脚(4根)

RST/VPP(Pin9):

复位引脚,引脚上出现2个机器周期的高电平将使单片机复位。

ALE/PROG(Pin30):

地址锁存允许信号

PSEN(Pin29):

外部存储器读选通信号

EA/VPP(Pin31):

程序存储器的内外部选通,接低电平从外部程序存储器读指令,如果接高电平则从内部程序存储器读指令。

芯片实物图片芯片引脚功能

4、可编程输入/输出引脚(32根)

AT89S51单片机有4组8位的可编程I/O口,分别位P0、P1、P2、P3口,每个口有8位(8根引脚),共32根。

每一根引脚都可以编程,比如用来控制电机、交通灯、霓虹灯等,开发产品时就是利用这些可编程引脚来实现我们想要的功能,尽情发挥你的想象力吧,实现你想要的:

)强大无比。

PO口(Pin39~Pin32):

8位双向I/O口线,名称为P0.0~P0.7

P1口(Pin1~Pin8):

8位准双向I/O口线,名称为P1.0~P1.7

P2口(Pin21~Pin28):

8位准双向I/O口线,名称为P2.0~P2.7

P3口(Pin10~Pin17):

8位准双向I/O口线,名称为P3.0~P3.7

5)74HC245的作用:

信号功率放大。

第1脚DIR,为输入输出端口转换用,DIR=“1”高电平时信号由“A”端输入“B”端输出,DIR=“0”低电平时信号由“B”端输入“A”端输出。

第2~9脚“A”信号输入输出端,A1=B1、、、、、、A8=B8,A1与B1是一组,如果DIR=“1”G=“0”则A1输入B1输出,其它类同。

如果DIR=“0”G=“0”则B1输入A1输出,其它类同。

第11~18脚“B”信号输入输出端,功能与“A”端一样,不在描述。

第19脚G,使能端,若该脚为“1”A/B端的信号将不导通,只有为“0”时A/B端才被启用,该脚也就是起到开关的作用。

第10脚GND,电源地。

第20脚VCC,电源正极。

74HC04的作用:

6位反相器。

第7脚GND,电源地。

第14脚VCC,电源正极。

信号由A端输入Y端反相输出,A1与Y1为一组,其它类推。

例:

A1=“1”则Y1=“0”、A1=“0”则Y1=“1”,其它组功能一样。

6)74HC573

74HC573有20个脚是一个8数据锁存器。

主要用于数码管、按键等等的控制

每个脚的作用如下·

2,3,4,5,6,7,8,9脚是数据的输入脚从D0到D7

11脚作用为:

连接这个脚此IC为高电压激活

连接1脚为低电压激此芯片

19,18,17,16,15,14,13,12这几个脚是数据的输出脚

10是接地

20是电源

数据的进和出没有逻辑关系

7)1602LCD主要技术参数:

显示容量:

16×2个字符

芯片工作电压:

4.5—5.5V

工作电流:

2.0mA(5.0V)

模块最佳工作电压:

5.0V

字符尺寸:

2.95×4.35(W×H)mm

引脚功能说明

1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表10-13所示:

编号

符号

引脚说明

编号

符号

引脚说明

1

VSS

电源地

9

D2

数据

2

VDD

电源正极

10

D3

数据

3

VL

液晶显示偏压

11

D4

数据

4

RS

数据/命令选择

12

D5

数据

5

R/W

读/写选择

13

D6

数据

6

E

使能信号

14

D7

数据

7

D0

数据

15

BLA

背光源正极

8

D1

数据

16

BLK

背光源负极

表10-13:

引脚接口说明表

第1脚:

VSS为地电源。

第2脚:

VDD接5V正电源。

第3脚:

VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。

第4脚:

RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。

第5脚:

R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。

当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。

第6脚:

E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。

第7~14脚:

D0~D7为8位双向数据线。

第15脚:

背光源正极。

第16脚:

背光源负极。

 

三 硬件设计

 

3.1电路原理图

 

四  软件设计

 

4.1程序流程图

 

(a)主程序流程(b)显示中断流程图(c)计算子程序流程图

 

4.2程序清单

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

ucharkeyshu=16,k1,js,k2;

floatjieguo=0;

uchara[20],b[20];

ucharcodetable[]={'0','1','2','3','4','5','6','7','8','9',

'+','-','*','/','=','.'};

sbitRS=P2^1;

sbitRW=P2^2;

sbitEN=P2^3;

sbitLE=P2^7;

sbitCE=P2^4;

sbitP20=P2^0;

//-------------延时-------------

voidDelayMS(uintms)

{

uchari;

while(ms--)for(i=0;i<101;i++);

}

//----------忙检查---------------

ucharBusy_Check()

{

ucharLCD_Status;

RS=0;

RW=1;

EN=1;

DelayMS

(1);

LCD_Status=P0;

EN=0;

returnLCD_Status;

}

//-------------写LCD命令-----------

voidWrite_LCD_Comand(ucharcmd)

{

while(Busy_Check()&0x80);

RS=0;

RW=0;

EN=0;

P0=cmd;EN=1;DelayMS

(1);EN=0;

}

voidWrite_LCD_Data(uchardat)

{

while((Busy_Check()&0x80)==0x80);

RS=1;RW=0;EN=0;P0=dat;EN=1;DelayMS

(1);EN=0;

}

//--------------LCD初始化-------------

voidInitialize_LCD()

{

Write_LCD_Comand(0x38);

DelayMS

(1);

Write_LCD_Comand(0x01);

DelayMS

(1);

Write_LCD_Comand(0x06);

DelayMS

(1);

Write_LCD_Comand(0x0C);

DelayMS

(1);

}

/*ucharcodekeycodetable[]=

{

0x11,0x12,0x14,0x18,0x21,0x22,0x24,0x28,0x41,

0x42,0x44,0x48,0x81,0x82,0x84,0x88

};*/

ucharkeys_scan()//扫描键盘

{

uchartemp;

LE=1;

CE=1;

P0=0x20;

DelayMS

(2);

LE=0;

P0=0X0FF;

DelayMS

(2);

CE=0;

DelayMS

(2);

temp=P0;

DelayMS

(2);

CE=1;

if((temp&0x0ff)!

=0x0ff)

{

DelayMS

(1);

if((temp&0x0ff)!

=0x0ff)

{

switch(temp)

{

case0x0FE:

keyshu=1;break;

case0x0fd:

keyshu=2;break;

case0x0fb:

keyshu=3;break;

case0x0f7:

keyshu=4;break;

case0x0ef:

keyshu=9;break;

case0x0df:

keyshu=10;break;

case0x0bf:

keyshu=11;break;

case0x7f:

keyshu=12;break;

}

}

}

LE=1;

CE=1;

P0=0x01;

DelayMS

(2);

LE=0;

P0=0X0FF;

DelayMS

(2);

CE=0;

DelayMS

(2);

temp=P0;

DelayMS

(2);

CE=1;

if((temp&0x0ff)!

=0x0ff)

{

DelayMS

(1);

if((temp&0x0ff)!

=0x0ff)

{

switch(temp)

{

case0x0FE:

keyshu=5;break;

case0x0fd:

keyshu=6;break;

case0x0fb:

keyshu=7;break;

case0x0f7:

keyshu=8;break;

case0x0ef:

keyshu=13;break;

case0x0df:

keyshu=0;break;

case0x0bf:

keyshu=14;break;

case0x7f:

keyshu=15;break;

}

}

}

}

voidjscl()//计算并显示函数

{

uchari,j,n;

floats;

longints1,s2,a1,b1,temp1;

a1=b1=1;

s1=s2=0;

s=0;

if(k2!

=0)

{

for(j=0;j

{for(i=0;i

a1=a1*10;

s1=s1+a[j]*a1;

a1=1;

}

for(j=k1+1;j

{for(i=0;i

b1=b1*10;

s2=s2+a[j]*b1;

b1=1;

}

if(js==10)//判断是什么运算,并执行运算

{s=s1+s2;

}

if(js==11)

{s=s1-s2;

}

if(js==12)

{s=s1*s2;

}

if(js==13)

{s=s1/s2;

}

jieguo=s;

}

else

s=jieguo;

temp1=(longint)(s);//以下部分处理结果

n=0;

while(temp1)

{b[n]=temp1%10;

temp1=temp1/10;

n++;

}

for(i=n;i>0;i--)//在液晶上显示结果

{

Write_LCD_Data(table[b[i-1]]);

}

}

voidmain()

{

uchari,j;

P20=1;

Initialize_LCD();

while

(1)

{

keys_scan();

/*keyshu=keys_scan();*/

if(keyshu==15)//计算机初始化

{

Write_LCD_Comand(0x01);

i=0;

for(j=0;j<20;j++)

a[j]=b[j]=0;

k1=k2=0;

}

elseif(keyshu<10)

{

Write_LCD_Data(table[keyshu]);

a[i]=keyshu;

DelayMS(500);

keyshu=16;

i++;

}

elseif((9

{

Write_LCD_Data(table[keyshu]);

k1=i-1;

js=keyshu;

DelayMS(500);

keyshu=16;

}

elseif(keyshu==14)

{

Write_LCD_Data(table[keyshu]);

DelayMS(300);

keyshu=16;

if(i==0)

k2=0;

else

k2=i-1;

Write_LCD_Comand(0x80+0x40);//第二行第一个单元显示

jscl();

}

}

}

五  系统仿真及调试

5.1仿真各个部件

LCD屏幕

2*8键盘

51单片机

扩展输入口PD74HC245

5.2仿真调试结果

加法

减法

乘法

除法

 

六  总结和愿望

两周多的课程设计结束了,在这次的课程设计中不仅检验了我所学习的知识,也培养了我如何去把握一件事情,如何去做一件事情,又如何完成一件事情。

在设计过程中,与同学分工设计,和同学们相互探讨,相互学习,相互监督。

学会了合作,学会了运筹帷幄,学会了宽容,学会了理解,也学会了做人与处世。

课程设计是我们专业课程知识综合应用的实践训练,着是我们迈向社会,从事职业工作前一个必不少的过程.”千里之行始于足下”,通过这次课程设计,我深深体会到这句千古名言的真正含义.我今天认真的进行课程设计,学会脚踏实地迈开这一步,就是为明天能稳健地在社会大潮中奔跑打下坚实的基础.

在这次设计过程中,体现出自己单独设计单片机的能力以及综合运用知识的能力,体会了学以致用、突出自己劳动成果的喜悦心情,从中发现自己平时学习的不足和薄弱环节,从而加以弥补。

致谢

在此感谢我们的刘青正老师.,老师严谨细致、一丝不苟的作风一直是我工作、学习中的榜样;老师循循善诱的教导和不拘一格的思路给予我无尽的启迪;这次模具设计的每个实验细节和每个数据,都离不开老师您的细心指导。

而您开朗的个性和宽容的态度,帮助我能够很顺利的完成了这次课程设计。

同时感谢对我帮助过的同学们,谢谢你们对我的帮助和支持,让我感受到同学的友谊。

由于本人的设计能力有限,在设计过程中难免出现错误,恳请老师们多多指教,我十分乐意接受你们的批评与指正,本人将万分感谢。

参考资料:

1)求实科技.单片机典型模块设计实例导航.北京:

人民邮电出版社,2004.5

2)任致程,凌红武.电子制作工艺技巧.北京:

人民邮电出版社,1999

3)王彦朋.大学生电子设计与应用.北京:

中国电力出版社.2007.3

4)胡汉才.单片机原理及其接口技术.北京:

清华大学出版社,2004

5)李晓林.电子工业出版社单片机原理与接口技术(第二版)北京2011.2……

实物图

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1