欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    基于单片机的计算器课程设计报告.doc

    • 资源ID:36135774       资源大小:1.15MB        全文页数:21页
    • 资源格式: DOC        下载积分:20金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要20金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    基于单片机的计算器课程设计报告.doc

    昆明理工大学课程设计报告 设计名称: 单片机计算器课程设计 姓 名: 学 号: 2011118521XXX 专业班级: 测控技术与仪器 1111 院(系): 信息工程 设计时间: 2013年6月21日 设计地点: 昆明理工大学 德信楼 目录一、 题目二、 任务与要求三、 课程设计及整体方框图a.总体设计思路简述····················································b.硬件设计简述························································c.软件设计简述························································d.程序主流程图························································四、 课程设计原理分析及相关知识概述五、 结论六、 体会与收获附件:1、 源程序代码(根据需要选择)2、整体电路原理图(根据需要选择)2、 元件表(根据需要选择) 3、实验操作(根据需要选择)一、题目使用单片机芯片AT89C51、LCD 1602 液晶显示屏,用KEIL uVision与 porteus仿真软件实现简易计算器的仿真与调试。 设计制作一个计算器,KEYPAD 4*4键盘输入,用LCD显示计算数值及结果。二、任务与要求 要求计算器能实现加减乘除四种运算,具体如下:1. 加法:多位数加法,计算结果不超过8位则显示计算。2. 减法:多位整数减法,计算结果可以算小于零则显示计算。3. 乘法:多位整数乘法,计算结果若超过8位则显示计算 。4. 除法:整数除法,可以算出小数点3位。5. 有清除功能三、课程设计简述及整体方框图1.总体设计思路简述按照系统设计的功能的要求,初步确定设计系统由主控模块、显示模块、键扫描接口电路共三个模块组成,电路系统构成框图如图1.1所示。主控芯片使用AT89C51单片机, 功能更强,由先进工艺制造,并带有非易失性Flash程序存储器。它是一种高性能、低功耗的8位COMS微处理芯片,市场应用最多。键盘电路采用4*4矩阵键盘电路。显示模块采用1枚LCD 1602 与RES-V构成器件构成。2硬件设计简述 单片机最小系统就是支持主芯片正常工作的最小电路部分,包括运算器.控制器.存储器,输入输出设备构成.主控芯片选取AT89C51芯片,因其具有良好的性能及稳定性,价格便宜应用方便。晶振选取11.0592MHz,晶振旁电容选取22pF。采用按键清零电路, KEYPAD 4*4 C.键盘接口电路 计算器所需按键有: 数字键:1,2,3,4,5,6,7,8,9,0 功能键:+, - , *, / , = , C( 清零)共计16个按键,采用4*4矩阵键盘,键盘的行和列之间都有公共端相连,四行和四列的8个公共端分别接P3.0P3.7,这样扫描P3口就可以完成对矩阵键盘的扫描,通过对16个按键进行编码,从而得到键盘的口地址,对比P3口的扫描结果和各按键的地址,我们就可以得到是哪个键按下,从而完成键盘扫描的功能。 LCD显示电路 采用LCD对计算数据和结果的显示,动态扫描。 为了实现LCD的动态显示,P0口输出显示值,通过P0口的二进制代码送到LCD进行显示。 3.软件设计简述键盘扫描子程序设计 要进行数据的计算就必须先进行数据的输入,也就必须确定按键输入的数值是什么,这就需要对键盘进行扫描,从而确定究竟是哪个键按下。对于键盘的扫描,这里采用行列扫描的方法来完成对键盘的扫描。原理就是先确定按键在哪一行,接着再确定是哪一列,这样就可以知道是哪个按键被按下了。我是将P3口作为按键扫描口的,比如开始先给P3口设置,每个按键都会有一个对应的十六进制值,我把它们列出来进行一一对应就行了,下面是扫描按键图。 以下为键盘扫描子程序的程序清单。uchar code table=7,8,9,0,4,5,6,0,1,2,3,0,0,0,0,0;uchar code table1=7,8,9,0x2f-0x30,4,5,6,0x2a-0x30,1,2,3,0x2d-0x30,0x01-0x30,0,0x3d-0x30,0x2b-0x30;LCD显示电路采用 LCD 1602对计算数据和结果的显示, P0口进行输出显示,D0D7 口接P0.0P0.7口,RW 接P2.0,RS 接P2.4,E 接P2.3. void delay(uchar z) / 延迟函数uchar y;for(z;z>0;z-)   for(y=0;y<110;y+);void check() / 判断忙或空闲do    P0=0xFF;    rs=0;     /指令    rw=1;     /读    lcden=0;     /禁止读写    delay(1); /等待,液晶显示器处理数据    lcden=1;     /允许读写    while(busy=1); /判断是否为空闲,1为忙,0为空闲void write_com(uchar com) / 写指令函数P0=com;    /com指令付给P0口rs=0;rw=0;lcden=0;check();lcden=1;void write_date(uchar date) / 写数据函数    P0=date;rs=1;rw=0;lcden=0;check();lcden=1;void init() /初始化 num=-1;lcden=1; /使能信号为高电平write_com(0x38); /8位,1行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表征按下的是哪个符号除法子程序设计除法的运算,可以显示小数点3位。 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;主程序见附录1 4.程序主框图 主程序流程四、课程设计原理分析及相关知识概述 本次课程设计用的 AT89C51具有速度快、功耗低、抗干扰强的特点,有多种I/O端口模式。Vcc=5v五、结论完成硬件和软件的设计和制作后,进行系统的调试,并处理不断出现的问题。对于计算器的性能,主要的衡量指标就在于计算的精度,本次制作的计算器性能情况如下:a.加法运算:8位整数加法运算,和值不超过99999,若超过上限,则显示错误提示。b.减法运算:4位正整数减法运算, 结果为正或负。 c.乘法运算:积不超过999999的整数乘法运算,若超出上限,显示错误提示。d.除法运算:整数除法,既计算结果为可显示小数。六、体会与收获 单片机课程设计, 体会是单片机学的不够扎实,不会的很多啊,当然这次的课程设计做计算器程序用的是c语言,不是课上初学的汇编,所以很难适应,尽管大家都知道汇编编这个程序也很困难,但还是互相学习,到处找资料看,问同学,所以我的软件主程序才能编译成功,系统才能调试出结果。很感谢那些热心教导我的同学和指导我的老师。 在软件方面,感觉困难更多一些,一开始真的很着急,毫无头绪啊,一时间,百度,论坛,贴吧逛了个遍,找了很多资料,也参考了同学的程序,其中每一个子程序模块都认真去读,去分析,化为己用,最重要的按键扫描和显示程序,还有包括加减乘除的运算程序,还了解了c语言在单片机编程中的一些特点,包括函数的声明和调用等等。而且在用uvison编译的时候出了很多问题,其中一个就是关于头文件的,要加上“#include < reg51.h>”,不仅如此,还要将有关 的文件覆盖在uvison安装路径下,这样头文件才有效啊,所以,一开始找不出问题所在,极其郁闷。但是总的来说,软件设计能够把结果调出来还是很激动的, 同时,我们还亲自动手试验箱进行操作,在老师的帮助下得以突破,完美的结束了实训。附录1 程序源代码#include<reg51.h> /头文件#define uint unsigned int / #define uchar unsigned charsbit lcden=P23; /定义引脚sbit rs=P24;sbit rw=P20;sbit busy=P07;char i,j,temp,num,num_1;long a,b,c; /a,第一个数 b,第二个数 c,得数float a_c,b_c;uchar flag,fuhao;/flag表示是否有符号键按下,fuhao表征按下的是哪个符号uchar code table=7,8,9,0,4,5,6,0,1,2,3,0,0,0,0,0;uchar code table1=7,8,9,0x2f-0x30,4,5,6,0x2a-0x30,1,2,3,0x2d-0x30,0x01-0x30,0,0x3d-0x30,0x2b-0x30;void delay(uchar z) / 延迟函数uchar y;for(z;z>0;z-) for(y=0;y<110;y+);void check() / 判断忙或空闲do P0=0xFF; rs=0; /指令 rw=1; /读 lcden=0; /禁止读写 delay(1); /等待,液晶显示器处理数据 lcden=1; /允许读写 while(busy=1); /判断是否为空闲,1为忙,0为空闲void write_com(uchar com) / 写指令函数P0=com; /com指令付给P0口rs=0;rw=0;lcden=0;check();lcden=1;void write_date(uchar date) / 写数据函数 P0=date;rs=1;rw=0;lcden=0;check();lcden=1;void init() /初始化 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表征按下的是哪个符号void keyscan() / 键盘扫描程序P3=0xfe; if(P3!=0xfe) delay(20); 延迟20ms if(P3!=0xfe) temp=P3&0xf0; switch(temp) case 0xe0:num=0; break; case 0xd0:num=1; break; case 0xb0:num=2; break; case 0x70: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)/没有按过符号键 a=a*10+tablenum; else/如果按过符号键 b=b*10+tablenum; else/如果按下的是'/' flag=1; fuhao=4;/4表示除号已按 i=table1num; write_date(0x30+i);P3=0xfd;if(P3!=0xfd) delay(5); if(P3!=0xfd) temp=P3&0xf0; switch(temp) case 0xe0:num=4; break; case 0xd0:num=5; break; case 0xb0:num=6; break; case 0x70: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)/没有按过符号键 a=a*10+tablenum; else/如果按过符号键 b=b*10+tablenum; else/如果按下的是'/' flag=1; fuhao=3;/3表示乘号已按 i=table1num; write_date(0x30+i);P3=0xfb;if(P3!=0xfb) delay(5); if(P3!=0xfb) temp=P3&0xf0; switch(temp) case 0xe0:num=8; break; case 0xd0:num=9; break; case 0xb0:num=10; break; case 0x70: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)/没有按过符号键 a=a*10+tablenum; else/如果按过符号键 b=b*10+tablenum; else if(num=11)/如果按下的是'-' flag=1; fuhao=2;/2表示减号已按 i=table1num; write_date(0x30+i);P3=0xf7;if(P3!=0xf7) delay(5); if(P3!=0xf7) temp=P3&0xf0; switch(temp) case 0xe0:num=12; break; case 0xd0:num=13; break; case 0xb0:num=14; break; case 0x70:num=15; break; while(P3!=0xf7); switch(num) case 12:write_com(0x01);a=0;b=0;flag=0;fuhao=0;/按下的是"清零" break; case 13: /按下的是"0" if(flag=0)/没有按过符号键 a=a*10; write_date(0x30); P1=0; else if(flag=1)/如果按过符号键 b=b*10; write_date(0x30); break; case 14:j=1; if(fuhao=1)write_com(0x80+0xf);/按下等于键,光标前进至第二行最后一个显示处 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; else if(fuhao=2)write_com(0x80+0xf);/光标前进至第二行最后一个显示处 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; else if(fuhao=3)write_com(0x80+0xf); 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; else if(fuhao=4)write_com(0x80+0xf); 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; case 15:write_date(0x30+table1num);flag=1;fuhao=1; break; main()init();while(1) keyscan();附录2 protues仿真图附录3 元件清单设备使用了C51 与 LCD 液晶显示的完美结合, P0 口接 LCD 液晶显示,同时外接排列电阻 RES-PACKAT89C51单片机keypad数值键盘LCD 1602LCD 液晶显示RES-V电阻RES-PACK8排列电阻附录4 实验操作图

    注意事项

    本文(基于单片机的计算器课程设计报告.doc)为本站会员(叶***)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开