基于单片机的计算器课程设计报告_第1页
基于单片机的计算器课程设计报告_第2页
基于单片机的计算器课程设计报告_第3页
基于单片机的计算器课程设计报告_第4页
基于单片机的计算器课程设计报告_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、昆明理工大学课程设计报告设计名称:单片机计算器课程设计姓名:学号:2021118521XXX专业班级:测控技术和仪器1111院系:信息工程设计时间:2021年6月21日设计地点:昆明理工大学德信楼目录一、题目二、任务和要求三、课程设计及整体方框图a.总体设计思路简述b.硬件设计简述c.软件设计简述d.程序主流程图四、课程设计原理分析及相关知识概述五、结论六、体会和收获附件:1、源程序代码根据需要选择2、整体电路原理图根据需要选择2、元件表根据需要选择3、实验操作根据需要选择一题目使用单片机芯片AT89C51LCD1602液晶显示屏,用KEILuVision和porteus仿真软件实现简易计算器

2、的仿真和调试.设计制作一个计算器,KEYPAD*4键盘输入,用LCD显示计算数值及结果.二、任务和要求要求计算器能实现加减乘除四种运算,具体如下:1,加法:多位数加法,计算结果不超过8位那么显示计算.2.减法:多位整数减法,计算结果可以算小于零那么显示计算.3,乘法:多位整数乘法,计算结果假设超过8位那么显示计算.4,除法:整数除法,可以算出小数点3位.5,有消除功能三、课程设计简述及整体方框图1,总体设计思路简述根据系统设计的功能的要求,初步确定设计系统由主控模块、显示模块、键扫描接口电路共三个模块组成,电路系统构成框图如图1,1所示.主控芯片使用AT89C51单片机,功能更强,由先进工艺制

3、造,并带有非易失性Flash程序存储器.它是一种高性能、低功耗的8位COMS微处理芯片,市场使用最多.键盘电路采用4*4矩阵键盘电路.显示模块采用1枚LCD1602和RES-V构成器件构成.2 .硬件设计简述单片机最小系统就是支持主芯片正常工作的最小电路局部,包括运算器,限制器.存储器,输入输出设备构成,主控芯片选取AT89C51芯片,因其具有良好的性能及稳定性,价格廉价使用方便.晶振选取11,0592MHz,晶振旁电容选取22pF.采用按键清零电路,KEYPAD4*4C,键盘接口电路计算器所需按键有:数字键:1','2','3','4'

4、,'5','6','7','8','9','0':'*','/','=','C清零'共计16个按键,采用4*4矩阵键盘,键盘的行和列之间都有公共端相连,四行和四列的8个公共端分别接P3.0P3.7,这样扫描P3口就可以完成对矩阵键盘的扫描,通过对16个按键进行编码,从而得到键盘的口地址,比照P3口的扫描结果和各按键的地址,我们就可以得到是哪个键按下,从而完成键盘扫描的功能.LCD显示电路采用LCD对计算数据和结果的显示,动态扫描.为了实

5、现LCD的动态显示,P0口输出显示伯:,通过P0口的二进制代码送到LCD进行显示.3 .软件设计简述键盘扫描子程序设计要进行数据的计算就必须先进行数据的输入,也就必须确定按键输入的数值是什么,这就需要对键盘进行扫描,从而确定究竟是哪个键按下.对于键盘的扫描,这里采用行列扫描的方法来完成对键盘的扫描.原理就是先确定按键在哪一行,接着再确定是哪一列,这样就可以知道是哪个按键被按下了.我是将P3口作为按键扫描口的,比方开始先给P3口设置,每个按键都会有一个对应的十六进制值,我把它们列出来进行一一对应就行了,下面是扫描按键图.以下为键盘扫描子程序的程序清单.ucharcodetable=7,8,9,0

6、,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;LCD显示电路采用LCD1602对计算数据和结果的显示,P0口进行输出显示,D0D7口接P0.0P0.7口,RWgP2.0,RS接P2.4,E接P2.3.LCD2LM032L1I2hI41516171819|0|1|2|3|4|voiddelay(ucharz)/延迟函数uchary;for(z;z>0;z-)for(y=0;y<110;y+

7、);voidcheck()/判断忙或空闲doP0=0xFF;rs=0;指令rw=1;/读lcden=0;/禁止读写delay(1);/等待,液晶显示器处理数据lcden=1;/允许读写while(busy=1);/判断是否为空闲,1为忙,0为空闲)voidwrite_com(ucharcom)/写指令函数P0=com;/com指令付给P0口rs=0;rw=0;lcden=0;check();lcden=1;voidwrite_date(uchardate)/写数据函数P0=date;rs=1;rw=0;lcden=0;check();lcden=1;voidinit()/初始化num=-1;l

8、cden=1;/使能信号为高电平whte_com(0x38);/8位,1行whte_com(0x0c);显示开,光标关,不闪烁*/whte_com(0x06);增量方式不移位显竟獗睽贫柚whte_com(0x80);/检测忙信号whte_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)*1

9、000);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;主程序见附录14 .程序主框图主程序流程四、课程设计原理分析及相关知识概述本次课程设计用的AT89C51具有速度快、功耗低、抗干扰强的特点,有多种I/O端口模式.Vcc=5vU219.XTAL1P0.0/AD039P0.1/AD118XTAL2P0.2/AD2P0.3/AD337P0.4/AD435P

10、0.5/AD5P0.6/AD634F9RSTP0.7/AD732P2.0/A821P2.1/A92229P2.2/A1023PSENALEEAP2.3/A11P2.4/A12P2.5/A13P2.6/A14303125-2G27P2.7/A152812-"3""P1.0P1.1P1.2P1.3P3.0/RXDP3.1/TXDP3.2/INT0-P3.3/INT11011124"5""1314P1.4P1.5P1.6P1.7P3.4/T0P3.5/T1P3.6/WR-P3.7/RD-6157"8""1617

11、AT89C51五、结论完成硬件和软件的设计和制作后,进行系统的调试,并处理不断出现的问题.对于计算器的性能,主要的衡量指标就在于计算的精度,本次制作的计算器性能情况如下:a.加法运算:8位整数加法运算,和值不超过99999,假设超过上限,那么显示错误提示.b.减法运算:4位正整数减法运算,结果为正或负.c.乘法运算:积不超过999999的整数乘法运算,假设超出上限,显示错误提示.d.除法运算:整数除法,既计算结果为可显示小数.六、体会和收获单片机课程设计,体会是单片机学的不够扎实,不会的很多啊,当然这次的课程设计做计算器程序用的是c语言,不是课上初学的汇编,所以很难适应,尽管大家都知道汇编编这

12、个程序也很困难,但还是互相学习,到处找资料看,问同学,所以我的软件主程序才能编译成功,系统才能调试出结果.很感谢那些热心教导我的同学和指导我的老师.在软件方面,感觉困难更多一些,一开始真的很着急,毫无头绪啊,一时间,百度,论坛,贴吧逛了个遍,找了很多资料,也参考了同学的程序,其中每一个子程序模块都认真去读,去分析,化为己用,最重要的按键扫描和显示程序,还有包括加减乘除的运算程序,还了解了c语言在单片机编程中的一些特点,包括函数的声明和调用等等.而且在用uvison编译的时候出了很多问题,其中一个就是关于头文件的,要加上“#include<reg51.h>",不仅如此,还要

13、将有关的文件覆盖在uvison安装路径下,这样头文件才有效啊,所以,一开始找不出问题所在,极其郁闷.但是总的来说,软件设计能够把结果调出来还是很冲动的,同时,我们还亲自动手试验箱进行操作,在老师的帮助下得以突破,完美的结束了实训.附录1程序源代码#include<reg51.h>头文件#defineuintunsignedint/#defineucharunsignedcharsbitlcden=P2A3;定义引脚sbitrs=P2A4;sbitrw=P2A0;sbitbusy=P0A7;chari,j,temp,num,num_1;longa,b,c;/a,第一个数b,第二个数c

14、得数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<110;y+);voidcheck()/判断忙或空闲doP0=0xFF;

15、rs=0;/指令rw=1;读lcden=0;禁止读写delay(1);等待,液晶显示器处理数据lcden=1;允许读写while(busy=1);/判断是否为空闲,1为忙,0为空闲voidwrite_com(ucharcom)/写指令函数P0=com;/com指令付给P0口rs=0;rw=0;lcden=0;check();lcden=1;voidwrite_date(uchardate)/写数据函数P0=date;rs=1;rw=0;lcden=0;check();lcden=1;)voidinit()/初始化(num=-1;lcden=1;/使能信号为高电平write_com(0x38);

16、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);延迟20msif(P3!=0xfe)(temp=P3&0xf0;sw

17、itch(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)/没有按过符号键(a=a*10+tablenum;)else/位口果按过符号键(b=b*10+tablenum;)else/位口果按下的是'/'(flag=1;fuhao=

18、4;/4表示除号已按)i=table1num;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)(

19、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)(case0xe0:num=8;break;case0xd0:num=9;break;case0xb0:num=10;b

20、reak;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)/没有按过符号键(a=a*10+tablenum;)else/位口果按过符号键(b=b*10+tablenum;)elseif(num=11)/如果按下的是'-'(flag=1;fuhao=2;/2表示减号已按)i=table1num;write_date(0x30+i);)P3=0xf7;if

21、(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;

22、write_date(0x30);P1=0;elseif(flag=1)/如果按过符号键b=b*10;write_date(0x30);break;case14: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;elseif(fuhao=2)write_

23、com(0x80+0xf);/光标前进至第二行最后一个显示处write_com(0x04);设置从后住前写数据,每写完一个数据,光标后退一格(这个照理说顺序不对,可显示和上段一样)if(a-b>0)c=a-b;elsec=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+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;)elseif(fuhao=4)write_com(0x80+0xf);write_com

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论