嵌入式计算器.docx

上传人:b****4 文档编号:4201318 上传时间:2022-11-28 格式:DOCX 页数:20 大小:366.71KB
下载 相关 举报
嵌入式计算器.docx_第1页
第1页 / 共20页
嵌入式计算器.docx_第2页
第2页 / 共20页
嵌入式计算器.docx_第3页
第3页 / 共20页
嵌入式计算器.docx_第4页
第4页 / 共20页
嵌入式计算器.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

嵌入式计算器.docx

《嵌入式计算器.docx》由会员分享,可在线阅读,更多相关《嵌入式计算器.docx(20页珍藏版)》请在冰豆网上搜索。

嵌入式计算器.docx

嵌入式计算器

嵌入式计算器

 

xxxxx学院课程结业论文

 

论文题目:

简易计算器设计论文

姓名:

xxx

所在院系:

xxxxxxxxx

班级:

xxxx

学号:

xxx

指导教师:

xxx

 

xxxxx

二〇一七年五月

 

摘要

随着电子科技技术的不断发展在当今社会计算器已深入人们生活中给人们的生活带来了方便推动了社会的发展。

我们主要制作通过采用ARM中的LPC2103芯片为主控单元设计一个能够实现整数的加、减、乘、除基本计算功能的简易计算器。

而且要通过4*4矩阵键盘输入数值和计算符号来进行运算利用八位数码管进行动态显示。

关键词ARMLPC21034*4键盘计算器:

加、减、乘、除数码管动态显示

 

 

一、引言

LPC2000系列基于一个支持实时仿真的ARM7TDMI-SCPU,并带有8kB和32kB嵌入的高速Flash存储器。

128位宽度的存储器接口和独特的加速结构使32位代码能够在最大时钟速率下运行。

这可以使得中断服务程序和DSP算法中重要功能的性能较Thumb模式提高30。

对代码规模有严格控制的应用可使用16位Thumb模式将代码规模降低超过30%,而性能的损失却很小。

由于LPC2000非常小的尺寸和极低的功耗,它们非常适合于那些将小型化作为主要要求的应用,多个UART、SPI到SSP总线组成的混合串行通信接口和片内2kB/4kB/8kB的SRAM一起作用,可使得LPC2101/2102/2103非常适合用来实现通信网关和协议转换器、数学协处理器以及足够大空间的缓冲区的强大处理功能。

而多个3216位的定时器、一个经改良后的10位ADC、PWM特性(通过所有定时器上的一个输出匹配来实现)和32个快速GPIO(含有多达个边沿或电平有效的外部中断管脚)使它们特别适用于工业控制和医疗系统。

近几年,随着大规模集成电路的发展,各种便携式嵌入式设备,具有十分广阔的市场前景。

在嵌入式系统中,数据和命令通过网络接口或串行口经过ARM程序处理后,或显示在LED上,或传输到远端PC上。

本次通过LPC2103芯片完成的简易计算器,目的是彻底理解和掌握LPC2103和C语言的汇编及仿真软件Proteus的使用。

 

二、原理与总体方案

主程序在初始化后调用键盘程序,再判断返回的值。

若为数字0—9,则根据按键的次数进行保存和显示处理。

若为功能键,则先判断上次的功能键,根据代号执行不同功能,并将按键次数清零。

程序中键盘部分使用行列式扫描原理,若无键按下则调用动态显示程序,并继续检测键盘;若有键按下则得其键值,并通过查表转换为数字0—9和功能键与清零键的代号。

最后将计算结果拆分成个、十、百位,再返回主程序继续检测键盘并显示;若为清零键,则返回主程序的最开始。

电路设计与原理:

通过LPC2103芯片进行相应的设置来控制LED显示器。

而通过对键盘上的值进行扫描,把相应的键值通过MM74C922芯片进行运算从而让ARM芯片接收。

2.1系统整体流程图

2.2程序运行流程图

2.3仿真电路图设计

2.4加法仿真

 

2+3=5

 

2.5减法仿真

 

9-6=3

2.6乘法仿真

 

4*6=24

 

2.7除法仿真

 

56/8=7

 

三、硬件设计

3.1元件清单

器件

件数

LPC2103

1个

七段数码管

1个

KEYPAD

1个

74HC595

2个

电阻/电容

若干

晶振

若干

电源

若干

电源地

若干

电线

若干

 

3.2键盘接口电路

计算器输入数字和其他功能按键要用到很多按键,如果采用独立按键的方式,在这种情况下,编程会很简单,但是会占用大量的I/O口资源,因此在很多情况下都不采用这种方式,而是采用矩阵键盘的方案。

矩阵键盘采用四条I/O线作为行线,四条I/O线作为列线组成键盘,在行线和列线的每个交叉点上设置一个按键。

这样键盘上按键的个数就为4×4个。

这种行列式键盘结构能有效地提高单片机系统中I/O口的利用率。

矩阵键盘的工作原理:

计算器的键盘布局如图3-1所示:

一般有16个键组成,在单片机中正好可以用一个P口实现16个按键功能,这种形式在单片机系统中也最常用。

图3-1矩阵键盘布局图

电路中采用4*4键盘作为输入电路模块的话,电路连线会比较简单,而且这种行列式键盘结构能有效地提高单片机系统中I/O口的利用率。

但是在硬件电路设计的过程中,实验室没有提供矩阵键盘,所以我们将4*4的矩阵键盘换成了16个独立按键。

采用独立按键的方式的话,会占用大量的I/O口资源,但是在这种情况下,编程会很简单。

图3-2矩阵键盘内部电路图

3.3显示模块:

本设计采用共阳极的七段数码管LED1显示输出数据。

通过D0-D7引脚向LED1写指令字或写数据以使LED1实现不同的功能或显示相应数据。

LED1管脚图如图3-3所示。

 

图3-3LED1管脚图

 

3.4各模块的特性与作用

3.4.1LPC2103的特性及引脚功能

LPC2013系列基于一个支持实时仿真的ARM7TDMI-SCPU,并带有8kB和32kB嵌入的高速Flash存储器。

128位宽度的存储器接口和独特的加速结构使32位代码能够在最大时钟速率下运行,并具有广泛应用。

含向量中断控制器,多个串行接口,两个三十二位定时器,片内晶振的操作频率范围:

10MHZ-25MHZ,两个低功耗模式:

空闲和掉电.

CPU操作电压范围:

1.65V-1.95V

图3-4LPC2103管脚图

管脚说明:

V3、V18:

供电电压

Vss、DBGSEL:

接地

XTAL1:

反向振荡放大器的输入及内部时钟工作电路的输入。

XTAL2:

来自反向振荡器的输出。

P0.0-P0.14作为GPIO接口,P0.15作为EINT2接口。

3.4.2数字式键盘的特性

数字式键盘的实质仍是行列式键盘,4根行线和4根列线通过下拉电阻接地,在其表面贴有标示对应按键的膜,使得易于观察和操作,更加贴近使用者的需求。

3.4.3MM74C922的特性及其引脚功能:

MM74C922具有功耗低,电压为3-5V,三态门输出,与LPTTL兼容,输出锁存按下最后的键,用一个电容器就可以消除键盘抖动,两键轮回,行具有上拉功能,具有芯片内或芯片外时钟,最大开关电阻为管脚说明:

A-D为行键扫描电平输出端,1-4为列键输入读取端;

OSC为振荡器的外接引线端,可用外部的输入脉冲或电容器;

OE为数据输出端,低电平有效;DAV为数据输出有效,高电平有效;VCC为电源端,接3-5V;GND为接地端。

四、部分模块程序

4.1LED显示模块

voidHc595_SendBits(unsignedintbits)

{

inti;

IO0CLR=HC595_CS;

for(i=0;i<12;++i)

{

IO0CLR=HC595_CLK;

if((bits&0x80000000))

IO0SET=HC595_DATA;

else

IO0CLR=HC595_DATA;

bits<<=1;

IO0SET=HC595_CLK;

}

IO0SET=HC595_CS;

}

voidShow(intx)

{

Staticunsignedcharzk[]=

{0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x18};//共阳型段码

unsignedinti,t,bit;

for(i=0;i<4;++i)

{

t=x%10;

bit=0x8<<32-4-i|zk[t]<<32-12;//bits高4位形成位码,接下来的8位段码

Hc595_SendBits(bit);

x/=10;

Sleep();

if(x==0)break;

}

}

4.2矩阵模块

voidKeyScan()

{

inti=0,a=0;

for(i=0;i<=3;i++)

{

switch(i)

{

case0:

IO0SET=c4;IO0CLR=c5|c6|c7;break;

case1:

IO0SET=c5;IO0CLR=c4|c6|c7;break;

case2:

IO0SET=c6;IO0CLR=c4|c5|c7;break;

case3:

IO0SET=c7;IO0CLR=c4|c5|c6;break;

}

if(IO0PIN&c0){a=i+1;break;}

if(IO0PIN&c1){a=i+5;break;}

if(IO0PIN&c2){a=i+9;break;}

if(IO0PIN&c3){a=i+13;break;}

}

4.3算术运算模块

while(IO0PIN&c0|IO0PIN&c1|IO0PIN&c2|IO0PIN&c3);

switch(a)

{

case1:

x=10*x+7;value=x;break;

case2:

x=10*x+8;value=x;break;

case3:

x=10*x+9;value=x;break;

case4:

y=x,b=a,x=0;break;

case5:

x=10*x+4;value=x;break;

case6:

x=10*x+5;value=x;break;

case7:

x=10*x+6;value=x;break;

case8:

y=x,b=a,x=0;break;

case9:

x=10*x+1;value=x;break;

case10:

x=10*x+2;value=x;break;

case11:

x=10*x+3;value=x;break;

case12:

y=x,b=a,x=0;break;

case13:

value=0;y=0;x=0;b=0;break;

case14:

x=10*x+0;value=x;break;

case15:

switch(b)

{

case16:

y+=x;break;

case12:

y-=x;break;

case8:

y*=x;break;

case4:

y/=x;break;

}

value=y,x=y;break;

case16:

y=x,b=a,x=0;break;

}

}

正确图纸

可以仿真程序

完整程序

#include

#defineHC595_CS(1<<10)

#defineHC595_DATA(1<<9)

#defineHC595_CLK(1<<8)

#definec01<<0

#definec11<<1

#definec21<<2

#definec31<<3

#definec41<<4

#definec51<<5

#definec61<<6

#definec71<<7

intcount=0,export=0,x=0,b=0;

voidSleep()

{

unsignedinti;

for(i=0;i<2000;i++);

}

voidHc595_SendBits(unsignedintbits)

{

inti;

IO0CLR=HC595_CS;

for(i=0;i<12;++i)

{

IO0CLR=HC595_CLK;

if((bits&0x80000000))

IO0SET=HC595_DATA;

else

IO0CLR=HC595_DATA;

bits<<=1;

IO0SET=HC595_CLK;

}

IO0SET=HC595_CS;

}

voidShow(intx)

{

staticunsignedcharzk[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x18};//共阳型段码

unsignedinti,t,bit;

for(i=0;i<4;++i)

{

t=x%10;

bit=0x8<<32-4-i|zk[t]<<32-12;//bits高4位形成位码,接下来的8位段码

Hc595_SendBits(bit);

x/=10;

Sleep();

if(x==0)break;

}

}

voidcomputer()

{

inti=0,a=0;

for(i=0;i<=3;i++)

{

switch(i)

{

case0:

IO0SET=c4;IO0CLR=c5|c6|c7;break;

case1:

IO0SET=c5;IO0CLR=c4|c6|c7;break;

case2:

IO0SET=c6;IO0CLR=c4|c5|c7;break;

case3:

IO0SET=c7;IO0CLR=c4|c5|c6;break;

}

if(IO0PIN&c0){a=i+1;break;}

if(IO0PIN&c1){a=i+5;break;}

if(IO0PIN&c2){a=i+9;break;}

if(IO0PIN&c3){a=i+13;break;}

}

while(IO0PIN&c0|IO0PIN&c1|IO0PIN&c2|IO0PIN&c3);

switch(a)

{

case1:

x=10*x+0;export=x;break;

case2:

x=10*x+1;export=x;break;

case3:

x=10*x+2;export=x;break;

case4:

x=10*x+3;export=x;break;

case5:

x=10*x+4;export=x;break;

case6:

x=10*x+5;export=x;break;

case7:

x=10*x+6;export=x;break;

case8:

x=10*x+7;export=x;break;

case9:

x=10*x+8;export=x;break;

case10:

x=10*x+9;export=x;break;

case11:

switch(b)

{

case0:

count=x;break;

case1:

count=count+x;break;

case2:

count=count-x;break;

case3:

count=count*x;break;

case4:

count=count/x;break;

default:

break;

}

b=1;x=0;break;

case12:

switch(b)

{

case0:

count=x;break;

case1:

count=count+x;break;

case2:

count=count-x;break;

case3:

count=count*x;break;

case4:

count=count/x;break;

default:

break;

}

b=2;x=0;break;

case13:

switch(b)

{

case0:

count=x;break;

case1:

count=count+x;break;

case2:

count=count-x;break;

case3:

count=count*x;break;

case4:

count=count/x;break;

default:

break;

}

b=3;x=0;break;

case14:

switch(b)

{

case0:

count=x;break;

case1:

count=count+x;break;

case2:

count=count-x;break;

case3:

count=count*x;break;

case4:

count=count/x;break;

default:

break;

}

b=4;x=0;break;

case15:

switch(b)

{

case0:

count=x;break;

case1:

count=count+x;break;

case2:

count=count-x;break;

case3:

count=count*x;break;

case4:

count=count/x;break;

default:

break;

}

export=count;x=0;b=0;break;

case16:

export=0;count=0;x=0;b=0;break;

default:

break;

}

}

intmain()

{

PINSEL0=0x00;

IO0DIR=IO0DIR|0xff0;

while

(1)

{

computer();

Show(export);

}

}

五、心得体会

我选的题目是基于LPC2103设计一个简易的计算器要求是通过4*4矩阵键盘输入八位数码管动态显示能实现加、减、乘、除等基本运算功能我我基本完成了设计要求的基本功能并实现了扩展部分的连续运算功能。

我收获很大积累了许多经验和知识。

本次实训共分为三步即通过网络、相关书籍等各种途径查找资料电路板的设计和程序的编写调试三部分。

首先实训的第一步就是查找相关资料做好设计制作前的准备。

在这个过程中我深刻地领悟到查找资料是一个大学生获取知识拓宽知识面最重要的一坏。

通过查找资料我们可以学到许多课本上所没有的这也是锻炼一个大学生自学能力的关键。

在此期间我查找了不少有关嵌入式的书籍学到了许多有关嵌入式的知识。

同时也了解到嵌入式芯片广泛应用于工业控制和电子产业中所以学好嵌入式知识对我们来说是很重要的。

通过上网搜索找到了对设计有帮助的资料。

在网络上我找到了许多有关基于嵌入式LPC21xx的简易计算器的设计资料虽然没找到与我的设计要求完全符合的资料但通过对相关资料的学习和分析基本明确了计算器的设计思路为下一步原理图的绘制和程序的编写做好了准备,因此网络也是我们获得知识的一个途径。

虽然这次设计有一定的难度让我有了充分锻炼自己地机会。

最重要的是要自己亲自动若一味地照搬或抄袭他人的作品不加思考领会那也就达不到锻炼自己的目的。

我们可以参考他人的制作成功资料但要去领悟并加以改进创新制作出属于自己的作品。

制作过程中遇到的问题要深入的思考加以解决。

通过这次设计嵌入式计算器提高了对lpc2103的应用能力通过自己动手写程序提高了自己运用C语言编写程序的能力。

总之这次实训锻炼了我们的动手能力将理论运用到实践中。

同时让我深深地感受到理论和实践是有差距的只有将理论运用到实践中才能检验其是否正确并将理论知识加以巩固和理解。

同学的鼓励和支持下我顺利地完成了这次设计。

六、致谢

非常感谢老师对我们的悉心教导为我们讲解知识和写程序应该注意的事项。

同时也非常感谢我们班的同学在我不理解的时候给我耐心的讲解和建议。

七、参考文献

1、ARM嵌入式系统开发-软件设计与优化,AndrewN.Sloss,沈建华(译),北京航空航天大学出版社,2005;

2、ARM体系结构与编程,杜春雷,清华大学出版社,2007;

3、周立功.ARM嵌入式系统基础教程[M].北京航空航天大学出版社,2005;

4、LPC2102/03/04使用指南.广州周立功单片机发展有限公司,2005;

5、嵌入式原理及接口技术:

递阶学习之LPC2103/张开生,程红英,翟岁兵主编,北京航空航天大学出版社,2015;

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

当前位置:首页 > 解决方案 > 学习计划

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

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