设计报告.docx
- 文档编号:24038170
- 上传时间:2023-05-23
- 格式:DOCX
- 页数:13
- 大小:131.84KB
设计报告.docx
《设计报告.docx》由会员分享,可在线阅读,更多相关《设计报告.docx(13页珍藏版)》请在冰豆网上搜索。
设计报告
机电工程学院
课程设计报告书
题目:
浮点计算器
专业:
机电一体化
班级:
09304班
学号:
09024967
学生姓名:
谭猛
指导教师:
朱晓玲
2010年12月9日
摘要
浮点计算器是一种简单计算器,可用于进行浮点数的加,减,乘,除运算。
本文主要以单片机AT89C51为核心控制元件,再配合相关辅助元件制作成浮点计算器。
其结构简单,主模块设有16个按键和显示器LCD。
其优点是制作材料低廉,工作效率良好。
关键词:
按键,显示器LCD,
目录
摘要I
1前言1
1.1课题开发背景1
1.2课题研究的目的和意义1
1.3课题的主要研究工作1
2系统硬件设计及说明2
2.1系统组成及总体框图2
2.2部分硬件方案论述2
2.3硬件电路图3
2.4.1AT89C513
2.4.2显示器4
2.4.3键盘输入单元5
3系统软件设计6
3.1使用单片机实现简单运算6
3.3系统总体功能流程图6
3.4程序描述10
4总结与展望11
参考文献12
1前言
1.1课题开发背景
随着电子科技的飞速发展,电子技术正在逐渐改善着人们的学习、生活、工作,因此开发本系统希望能够给人们多带来一点生活上的乐趣。
基于当前市场上的计算器市场需求量较大,其中浮点计算器就是一个很好的应用方面。
单片机技术使我们可以利用软硬件实现浮点计算器的功能,从而实现浮点数的四则运算。
并且可以进行一定的功能扩展。
鉴于可用于加减乘除等简单运算。
则也可以用于指数/对数,十进制转8进制和16进制的运算。
普通计算器只能用于加减乘除,则不能进行浮点数的计算。
1.2课题研究的目的和意义
利用AT89C51单片机自带资源,设计一款能进行浮点数四则运算的简单计算器。
1.3课题的主要研究工作
本课题设计的主要工作有以下几个方面:
(1)了解按键,数码管的工作原理;
(2)可进行浮点数的简单四则运算;
(3)可存储相关程序。
2系统硬件设计及说明
2.1系统组成及总体框图
硬件设计的任务是根据总体设计要求,在选择的机型的基础上,具体确定系统中所要使用的元器件,设计出系统的原理框图、电路原理图。
该设计要实现一种由单片机控制的浮点计算器,单片机工作于12MHZ时钟频率,使用其定时/计数器T0,工作模式为1,改变计数值TH0和TL0可以产生不同频率的脉冲信号。
系统结构图如图2-1所示。
2.2部分硬件方案论述
LCD显示方式的方案比较。
方案一:
采用花样显示,花样显示是指lcd显示某一屏字符时,采取从左到右或者是从右到左的整屏移动的显示方式。
在这种显示方式下,给人的感觉就是程序是在执行的,同时如果控制好了移动一屏的时间间隔的话,在整体视觉上可以达到很好的效果。
方案二:
采用静态显示,静态显示是指lcd显示某一屏字符时,时钟保持当前字符的显示,不使用移屏显示。
便于控制,同时能够满足正常的显示效果。
由于在显示中存在播放时间的动态变化,这样的话,即使是不产生整屏移动,也能给人动态感,也易于控制。
基于以上各种特点,我选择了方案二。
键盘连接方式方案比较。
方案一:
独立式键盘
一个具有16个按键的独立式键盘,每一个按键的一端都接地,另一端接AT89C51的I/O口。
独立式键盘每一按键都需要一根I/O线,占用AT89C51的硬件资源较多。
因此独立式键盘只适合按键较少的场合。
键盘是一组按键或开关的集合,键盘接口向计算机提供被按键的代码。
特点:
使用方便、结构复杂、成本高。
方案二:
矩阵式键盘
我选择采用4×4矩阵式键盘,键盘的行线X0~X3通过电阻接P3口低四位,当键盘没有键闭合时,所有的行线和列线断开,行线X0~X3均呈高电平。
当键盘上某一键闭合时,该键所对应的行线与列线短路,此时该行线的电平将由被短路的列线电平所决定。
如果将行线接至单片机的输入端口,列线接至单片机的输出端口,则在单片机的控制下使列线Y0为低电平,其余三根列线Y1、Y2、Y3均为高电平,然后单片机读输入口状态(即键盘行线状态),若X0、X1、X2、X3均为高电平,则Y0这一列上没有键闭合,如果读出的行线状态不全为高电平,则为低电平的行线和Y0相交的键处于闭合状态。
如果Y0这一列没有键闭合,紧接着使列线Y1为低电平,其余列线为高电平,用同样的方法检查Y1这一列有无键闭合,如此类推。
这种逐行逐列地检查键盘状态的过程称为对键盘的扫描。
CPU对键盘的扫描可以采取程序控制的随机方式,CPU空闲时才扫描键盘;也可以采取定时控制方式,每隔一段时间,CPU对键盘扫描一次;还可以采用中断方式,当键盘上有键闭合时,向CPU请求中断,CPU响应键盘发出的中断请求,对键盘进行扫描,以识别哪一个键处于闭合状态,并对键输入信息作相应处理。
因为如果采用独立式键盘AT89C51的I/O口对于方案一来说将是很浪费资源的,为了节省I/O口,同时使设计显得比较美观,我选用方案二——矩阵连接式键盘。
为了能够较为简单的编程,和节省CPU的资源,我们采用定时扫描,每隔一段时间,CPU对键盘扫描一次,并将键值读入。
2.3硬件电路图
系统硬件电路图如图2-2所示。
2.4元件清单
因为小组是分工协作的,我们主要的工作是设计键盘输入模块,后面将会具体介绍。
2.4.1AT89C51
AT89C51是一种带4K字节闪存可编程可擦除只读存储器(FPEROM—FlashProgrammableandErasableReadOnlyMemory)的低电压,高性能CMOS8位微处理器,俗称单片机。
主要特性:
与MCS-51兼容、4K字节可编程闪烁存储器、寿命:
1000写/擦循环、数据保留时间:
10年、全静态工作:
0Hz-24MHz、三级程序存储器锁定、128×8位内部RAM、32可编程I/O线、两个16位定时器/计数器、5个中断源、可编程串行通道、低功耗的闲置和掉电模式、片内振荡器和时钟电路。
图2-2系统连接图
2.4.2显示器LCD
2.4.3键盘输入单元
采用16个Button,分别为0~9数字,加减乘除,等号键还有个回复键。
图2-4键盘连接图
3系统软件设计
本软件设计关键是要实现一种由单片机控制的简单浮点计算器,它由0~9数字,加减乘除符号,等号键还有个回复键组成的的键盘,用户可以根据相关按键显示相关数字。
通过显示器LCD将数字显示出来。
3.1使用单片机实现简单运算
可以用单片机进行简单的加减乘除运算,只能一个一个的运算,不能连续一起运算.
3.3系统总体功能流程图
该程序设计思路比较清晰既从开始到声明变量与函数再到读取按钮开关,判断是否按下,然后就是一个一个按钮的动作。
其主程序框图如图3-1所示。
图3-1主程序框图
按键子程序流程图如图3-2所示。
图3-2按键子程序流程图
3.4程序描述
系统启动后,先对LCD进行初始化,然后进入对功能键进行判断的阶段,根据输入数字或符号进行计算。
浮点计算器的程序:
#include"sub_ej51.c"//包含库函数
voidmain(void)
{ucharstate;//缓存当前工作状态(0--3)
//0--输入第1个数据,1--输入运算符,
//2--输入第2个数据,3--显示计算结果
uchars_w;//缓存当前输入字符的个数
ucharx_w;//缓存当前数码管上显示字符的个数
ucharkk;//缓存当前按键值('1'--'B')
bitf_b;//用于判断是否第一次按键
ucharys;//缓存计算方式('+','-','*','/')
floatsj1;//缓存运算数据1
floatsj2;//缓存运算数据2
chardatabuf[12];//缓存输入按键值
begin:
init_jp_led_dz();//初始化"键盘、数码管、点阵"
state=0;//当前状态=0
s_w=0;//输入字符的个数=0
x_w=0;//数码管上显示字符的个数=0
f_b=0;//0--表示没有一次按键
sj1=0;sj2=0;//清输入数据
for(kk=0;kk<12;++kk){buf[kk]=0;}//清输入按键值缓存数组
buf[0]='0';//显示字符'0'
clr_led_dz();//清除“数码管、点阵屏"
//=================================================================
for(;;){
led_string(0,"");//清显示屏
led_string(7-x_w,buf);//显示按键缓存数组
if(f_b==0){led_blink(7,1);}//如果没有一次按键,最右位闪烁
else{led_blink(7,0);}
do{kk=read_key();}while(kk==0);//等待按键
switch(state){
//================================================================
case0:
case2:
//输入第1个数据或第2个数据
sr_sj2:
if(kk=='A'){//按键为选择运算符或进行运算
if(state==0){//当前状态为输入第1个数据
if(f_b==0){return;}//如果没有一次按键,退出程序
else{
state=1;sj1=atof(buf);//进入选择运算符状态,保存数据1
ys=0;dz_putchar('+');//默认为“+”运算
for(kk=0;kk<12;++kk){buf[kk]=0;}//清输入按键数组
buf[0]='0';s_w=0;x_w=0;f_b=0;//为输入第2个数据作准备
}
}
else{//当前状态为输入第2个数据
state=3;sj2=atof(buf);//进入运算状态,保存数据2
switch(ys){//进行计算,结果转化为字符串
case0:
sprintf(buf,"%g",sj1+sj2);break;//进行加法运算
case1:
sprintf(buf,"%g",sj1-sj2);break;//进行减法运算
case2:
sprintf(buf,"%g",sj1*sj2);break;//进行乘法运算
case3:
sprintf(buf,"%g",sj1/sj2);break;//进行除法运算
}
dz_putchar('=');//显示“=”
x_w=7;buf[9]=0;//从位置0开始显示,最多8位
}
}
elseif(kk<=0xff&&x_w<7){//输入数字、负号、小数点
if(kk=='B'&&s_w==0&&f_b==0){kk='-';}//'B'键首次输入,输入负号
elseif(kk=='B'){kk='.';}//'B'键不是首次输入,输入小数点
if(f_b!
=0){//如果不是首次输入
++s_w;//增加输入字符的个数
if(kk!
='.'){++x_w;}//如果不是小数点,增加显示字符的个数
}
buf[s_w]=kk;//保存输入的数据
f_b=1;//f_b=1--表示不是首次输入
}
elseif(kk>0xff&&s_w>=0){//如果按键时间超过1秒,删除数据
if(s_w==0){buf[s_w]='0';f_b=0;}//如果是最后的数据,设置首次输入标志
else{
if(buf[s_w]!
='.'){--x_w;}//如果删除小数点,不减小显示位置
buf[s_w]=0;--s_w;//删除数据,减小数据输入位置
}
}
break;
//================================================================
case1:
//选择运算符
if(kk=='A'){//最多4种运算符
++ys;ys%=4;
switch(ys){
case0:
dz_putchar('+');break;//选择加法
case1:
dz_putchar('-');break;//选择加法
case2:
dz_putchar('*');break;//选择加法
case3:
dz_putchar('/');break;//选择加法
}
}
else{state=2;gotosr_sj2;}//不是选择运算符,进入输入第2个数据状态
break;
//================================================================
case3:
if(kk=='A'){state=0;gotosr_sj2;}//计算结束后,继续选择运算符
else{gotobegin;}//按其他任意键,重新开始
//================================================================
}
}
}
4总结与展望
此次课程设计,系统部分功能已实现。
可以进行简单的运算,基本达到预定的效果。
在设计的过程中,小组各成员各负其责,设计不同模块。
不仅提高了设计的效率,而且体现了实践动手及团队合作的精神。
本次课程设计是大学学习阶段一次非常难得的理论与实践相结合的机会,通过这次比较系统的项目设计提高了我们运用所学的专业基础知识来解决面临实际问题的能力。
为了尽早完成作品,我们坚持努力,经过课下大量的实践操作,我们丰富了各种器件常识,收获了难得的实践经验。
参考文献
[1]《C语言综合》
[2]《接口应用》
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 设计 报告