电子计算器课程设计含流程图代码等.docx

上传人:b****4 文档编号:3696794 上传时间:2022-11-24 格式:DOCX 页数:22 大小:373.36KB
下载 相关 举报
电子计算器课程设计含流程图代码等.docx_第1页
第1页 / 共22页
电子计算器课程设计含流程图代码等.docx_第2页
第2页 / 共22页
电子计算器课程设计含流程图代码等.docx_第3页
第3页 / 共22页
电子计算器课程设计含流程图代码等.docx_第4页
第4页 / 共22页
电子计算器课程设计含流程图代码等.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

电子计算器课程设计含流程图代码等.docx

《电子计算器课程设计含流程图代码等.docx》由会员分享,可在线阅读,更多相关《电子计算器课程设计含流程图代码等.docx(22页珍藏版)》请在冰豆网上搜索。

电子计算器课程设计含流程图代码等.docx

电子计算器课程设计含流程图代码等

 

1设计任务和性能指标

1.1设计任务

电子计算器设计

1、能实现4位整数的加减法和2位整数的乘法;

2、结果通过5个LED数码管显示(4位整数加法会有进位)或通过液晶显示屏显示。

1.2性能指标

1.用数字键盘输入4位整数,通过LED数码显示管或液晶显示屏显示。

2.完成四位数的加减法应算。

当四位数想加时产生的进位时,显示进位。

3.显示2位,并进行2位整数的乘法。

4.设计4*4矩阵键盘输入线的连接。

2设计方案

2.1需求分析

我们日常生活的开支,大额数字或是多倍小数的计算都需要计算器的帮助,处理数字的开方、正余弦都离不开计算器。

虽然现在的计算器价格比较低廉,但是功能过于简单的不能满足个人需求,功能多的价格较贵,操作不便不说,很多功能根本用不到。

所以,我们想到可不可以用自己所学为自己设计开发一个属于自己的简单计算器来完成日常生活的需求。

2.2方案论证

使用单片机为ATMEL公司生产AT89C51,AT89C51提供以下标准功能:

4K字节FLASH闪速存储器,128字节内部RAM,32个I/O口线,两个16位定时/计数器,一个向量两级中断结构,一个全双工串行通讯口,内置一个精密比较器,片内振荡器及时钟电路,同时AT89C51可降至0Hz的静态逻辑操作,并支持两种软件可选的工作模式,空闲方式停止CPU的工作,但允许RAM,定时计数器,串行通信及中断系统继续工作。

显示用LCD液晶显示屏,减少线路连接。

用C言编写程序,易进行调试修改。

采用4*4矩阵键盘作为输入。

3系统硬件设计

3.1总体框图设计

电路图如附录1

3.2单片机选型

AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—FalshProgrammableandErasableReadOnlyMemory)的低电压,高性能、CMOS、8位单片机。

该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。

AT89C51的管脚图如图2.2所示。

图3-1

3.3单片机附属电路设计

一、晶体振荡电路

1.晶体振荡器的作用

石英晶体振荡器也称石英晶体谐振器,它用来稳定频率和选择频率,是一种可以取代LC谐振回路的晶体谐振元件。

2.本设计所用的晶体振荡电路如图2.3所示:

图3-2晶振电路

此晶振电路所选用的石英晶振频率为12MHZ。

一、晶体振荡电路

单片机复位的条件是:

必须使RST/Vpd或RST引脚加上持续两个机器周期(即24个振荡周期)的高电平。

图3-2复位电路

该电路除具有上电复位功能外,若要复位,只需按图中的BUTTON键,此时电源VCC经电阻R1、R2分压,在RESET端产生复位高电平。

3.44*4矩阵键盘控制电路

矩阵式键盘的结构与工作原理:

在键盘中的按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式,其内部简图如图3-3在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。

这样,只需要单片机的一个端口(如P1口)就可以构成4*4=16个按键,比直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。

由此可见,在需要的键数比较多时,采用矩阵法来做键盘比较是合理的。

由于本系统按键较多,在这里采用矩阵式4*4键盘,这样可以合理应用硬件资源,用一个8位I/O口控制,如图3-3所示:

图3-3按键内部电路简图

矩阵式键盘的按键识别方法

一、确定矩阵式键盘上何键被按下,我们采用一种“行扫描法”。

行扫描法:

行扫描法又称为逐行(或列)扫描查询法,是一种最常用的按键识别方法。

3.4LCD液晶显示

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

编号

符号

引脚说明

编号

符号

引脚说明

1

VSS

电源地

8

D1

数据

2

VDD

电源正极

9

D2

数据

3

VEE

液晶显示偏压

10

D3

数据

4

RS

数据/命令选择

11

D4

数据

5

RW

读/写选择

12

D5

数据

6

E

使能信号

13

D6

数据

7

D0

数据

14

D7

数据

4系统软件设计

4.1设计思路

1.要有显示子程序,当键入一个数值或符号时显示程序要把这个键入的值给显示出来。

经过运算在按下等号之后显示出此次运算的结果。

2.就是按键程序,当一个键盘按下的时候,按键程序要判断是哪个按键按下,如果是数字键按下就要转向显示子程序来显示出这个数字,然后等待下一个键值的输入,再次判断按下的是什么键,如果是功能键就要根据上次功能键和输入的数据来计算结果,然后保存结果和功能键,结果送显示缓冲区显示。

等待下个数值的输入,如此重复。

4.2总体流程图

4.3子程序设计

1.读和写数据子程序

voidwrite_com(charcom)//写指令函数

{

P0=com;//com指令付给P0口

rs=0;

rw=0;

lcden=0;

check();

lcden=1;

}

voidwrite_date(chardate)//写数据函数

{

P0=date;

rs=1;

rw=0;

lcden=0;

check();

lcden=1;

}

4.4总程序清单

见附录2

5仿真与调试

5.1调试步骤

1.采用KEIL开发的89c51单片机应用程序调试步骤:

(1)在uVision集成开发环境中创建新项目(Project),扩展文件名为.UV2,并为该项目选定合适的单片机CPU器件(本设计采用ATMEL公司下的AT89C51)

(2)用uVision的文本编辑器编写源文件,可以是汇编文件(.ASM),也可以使C语言文件(扩展名.C),并将该文件添加到项目中去。

一个项目文件可以包含多个文件,除了源程序文件外,还可以是库文件、头文件或文本说明文件。

(3)通过uVision2的相关选择项,配置编译环境、连接定位器以及Debug调试器的功能。

(4)对项目中的源文件进行编译连接,生成绝对目标代码和可选的HEX文件,如果出现编译连接错误则返回到第2步,修改源文件中的错误后重构整个项目。

图5-1Keil调试

2用Proteus对于本设计的仿真

操作步骤如下:

(1)进入proteusISIS集成环境,在工作前,在systerm菜单下设置界面的颜色、图形界面大小等项目,也可采用了系统默认值。

 

(2)通过工具栏中的(从库中选择元件命令)命令,在pickdevices窗口中选择电路所需的元件,放置元件到编辑区并调整其相对位置,进行元件参数设置,元器件间连线。

(3)连线并加上设置参数,并完成仿真原理图,如图5-2所示。

(4)加载程序。

将编译调试完成的简易计算器机器码程序(hex文件)加载到AT89C51单片机中。

(5)单击仿真工具栏中的仿真键,观察仿真结果。

可以按暂停、继续、单步、等按钮,查看效果。

图5-2

操作说明:

1)本计算器实现4位数的加减,2位数乘除运算。

2)按下数值键,显示按下的“数字”,按运算符,显示符号,按第2个操作数,显示,按“=”键,得到运算结果。

3)按“清零”键清除运算结果,可重新开始。

(6)调试与思考

5.2仿真结果及性能分析

6总结

通过这段时间的设计,终于完成了我计算器的设计,虽然只是一个非常简单的计算器,可是我也经过了一翻很大的努力才完全达到设计要求的,从心底里说,还是挺高兴的,毕竟这次设计所要求的东西都做了出来,然而高兴之余不得不深思呀!

在本次设计的过程中,我发现很多的问题,虽然以前还做过这样的设计但这次设计真的让我长进了很多,单片机的设计重点就在于软件程序的设计,需要有很巧妙的编程方法,在编程时,由于粗心大意马虎,有些语句看似没问题,可就是不出效果,经仔细揣摩修改后,程序才正常运行。

学习单机片机更是如此,程序只有在经常的写与读的过程中才能提高。

从这次的课程设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,理论指导实践,在实践中对理论知识加以理解。

还要有独立思考能力和团队协作的精神,个人能力固然重要,集体的力量更是伟大的。

由于时间比较仓促,我所设计的这个计算器非常简单,我们可以考虑在以后来改进一下,使它的功能更加完善,强大。

参考文献

[1]刘和平,刘跃,单片机原理及应用,重庆:

重庆大学出版社,2004

[2]杨西明,朱骐,单片机编程与入门,北京:

机械工业出版社,2004

[3]陈明荧,89C51单片机课程设计实训教材,北京:

北京清华大学出版社,2004

[4]刘瑞新,单片机原理及应用教程,北京:

机械工业出版社,2003

[5楼然苗,李光飞,51系列单片机设计实例,北京:

北京航空航天大学出版社,2003

附录1系统硬件电路图

 

附录2程序清单

#include//头文件

#defineuintunsignedint//

#defineucharunsignedchar

sbitlcden=P2^3;//定义引脚

sbitrs=P2^4;

sbitrw=P2^0;

sbitbusy=P0^7;

chari,j,temp,num,num_1;

inta,b,c;//a,第一个数b,第二个数c,得数

floata_c,b_c;

ucharflag,fuhao;//flag表示是否有符号键按下,fuhao表征按下的是哪个符号

ucharcodetable[]={

7,8,9,0,

4,5,6,0,

1,2,3,0,

0,0,0,0};

ucharcodetable1[]={

7,8,9,0x2f-0x30,

4,5,6,0x2a-0x30,

1,2,3,0x2d-0x30,

0x01-0x30,0,0x3d-0x30,0x2b-0x30};

voiddelay(ucharz)//延迟函数

{

uchary;

for(z;z>0;z--)

for(y=0;y<100;y++);

}

voidcheck()//判断忙或空闲

{

do{

P0=0xFF;

rs=0;//指令

rw=1;//读

lcden=0;//禁止读写

delay

(1);//等待,液晶显示器处理数据

lcden=1;//允许读写

}while(busy==1);//判断是否为空闲,1为忙,0为空闲

}

voidwrite_com(charcom)//写指令函数

{

P0=com;//com指令付给P0口

rs=0;

rw=0;

lcden=0;

check();

lcden=1;

}

voidwrite_date(chardate)//写数据函数

{

P0=date;

rs=1;

rw=0;

lcden=0;

check();

lcden=1;

}

voidinit()//初始化

{

num=-1;

lcden=1;//使能信号为高电平

write_com(0x38);//8位,2行

write_com(0x0c);//显示开,光标关,不闪烁*/

write_com(0x06);//增量方式不移位显竟獗暌贫柚?

write_com(0x80);//检测忙信号

write_com(0x01);//显示开,光标关,不闪烁

num_1=0;

i=0;

j=0;

a=0;//第一个参与运算的数

b=0;//第二个参与运算的数

c=0;

flag=0;//flag表示是否有符号键按下,

fuhao=0;//fuhao表征按下的是哪个符号

}

voidkeyscan()//键盘扫描程序

{

P3=0xfe;

if(P3!

=0xfe)

{

delay(20);

if(P3!

=0xfe)

{

temp=P3&0xf0;

switch(temp)

{

case0xe0:

num=0;

break;

case0xd0:

num=1;

break;

case0xb0:

num=2;

break;

case0x70:

num=3;

break;

}

}

while(P3!

=0xfe);

if(num==0||num==1||num==2)//如果按下的是'7','8'或'9

{

if(j!

=0)

{

write_com(0x01);

j=0;

}

if(flag==0)//没有按过符号键

{

do{

a=a*10+table[num];

}

while(a>10000);

}

else//如果按过符号键

{

do

{

b=b*10+table[num];

}

while(b>10000);

}

}

else//如果按下的是'/'

{

if(a<100)

{

flag=1;

fuhao=4;

};

//4表示除号已按

}

i=table1[num];

write_date(0x30+i);

}

P3=0xfd;

if(P3!

=0xfd)

{

delay(5);

if(P3!

=0xfd)

{

temp=P3&0xf0;

switch(temp)

{

case0xe0:

num=4;break;

case0xd0:

num=5;break;

case0xb0:

num=6;break;

case0x70:

num=7;break;

}

}

while(P3!

=0xfd);

if(num==4||num==5||num==6&&num!

=7)//如果按下的是'4','5'或'6'

{

if(j!

=0)

{

write_com(0x01);

j=0;

}

if(flag==0)//没有按过符号键

{

do

{

a=a*10+table[num];

}

while(a>10000);

}

else//如果按过符号键

{

do

{

b=b*10+table[num];

}

while(B>10000);

}

}

else//如果按下的是'*'

{

if(a<100)

{

flag=1;

fuhao=3;

}//3表示乘号已按

}

i=table1[num];

write_date(0x30+i);

}

P3=0xfb;

if(P3!

=0xfb)

{

delay(5);

if(P3!

=0xfb)

{

temp=P3&0xf0;

switch(temp)

{

case0xe0:

num=8;break;

case0xd0:

num=9;break;

case0xb0:

num=10;break;

case0x70:

num=11;break;

}

}

while(P3!

=0xfb);

if(num==8||num==9||num==10)//如果按下的是'1','2'或'3'

{

if(j!

=0)

{

write_com(0x01);

j=0;

}

if(flag==0)//没有按过符号键

{

do

{

a=a*10+table[num];

}

while(a>10000);

}

else//如果按过符号键

{

do

{

b=b*10+table[num];

}

while(b>10000);

}

}

elseif(num==11)//如果按下的是'-'

{

flag=1;

fuhao=2;//2表示减号已按

}

i=table1[num];

write_date(0x30+i);

}

P3=0xf7;

if(P3!

=0xf7)

{

delay(5);

if(P3!

=0xf7)

{

temp=P3&0xf0;

switch(temp)

{

case0xe0:

num=12;break;

case0xd0:

num=13;

break;

case0xb0:

num=14;break;

case0x70:

num=15;

break;

}

}

while(P3!

=0xf7);

switch(num)

{

case12:

{write_com(0x01);a=0;b=0;flag=0;fuhao=0;}//按下的是"清零"

break;

case13:

{//按下的是"0"

if(flag==0)//没有按过符号键

{

a=a*10;

write_date(0x30);

P1=0;

}

elseif(flag==1)//如果按过符号键

{

b=b*10;

write_date(0x30);

}

}

break;

case14:

{j=1;

if(fuhao==1){write_com(0x80+0x4f);//按下等于键,光标前进至第二行最后一个显示处

write_com(0x04);//设置从后住前写数据,每写完一个数据,光标后退一格

c=a+b;

while(c!

=0)

{

write_date(0x30+c%10);

c=c/10;

}

write_date(0x3d);//再写"="

a=0;b=0;flag=0;fuhao=0;

}

elseif(fuhao==2){write_com(0x80+0x4f);//光标前进至第二行最后一个显示处

write_com(0x04);//设置从后住前写数据,每写完一个数据,光标后退一格(这个照理说顺序不对,可显示和上段一样)

if(a-b>0)

c=a-b;

else

c=b-a;

while(c!

=0)

{

write_date(0x30+c%10);

c=c/10;

}

if(a-b<0)

write_date(0x2d);

write_date(0x3d);//再写"="

a=0;b=0;flag=0;fuhao=0;

}

elseif(fuhao==3){write_com(0x80+0x4f);

write_com(0x04);

c=a*b;

while(c!

=0)

{

write_date(0x30+c%10);

c=c/10;

}

write_date(0x3d);

a=0;b=0;flag=0;fuhao=0;

}

elseif(fuhao==4){write_com(0x80+0x4f);

write_com(0x04);

i=0;

c=(long)(((float)a/b)*1000);

while(c!

=0)

{

write_date(0x30+c%10);

c=c/10;

i++;

if(i==3)

write_date(0x2e);

}

if(a/b<=0)

write_date(0x30);

write_date(0x3d);

a=0;b=0;flag=0;fuhao=0;

}

}

break;

case15:

{write_date(0x30+table1[num]);flag=1;fuhao=1;}

break;

}

}

}

main()

{

init();

while

(1)

{

keyscan();

}

}

 

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

当前位置:首页 > 求职职场 > 简历

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

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