欢迎来到课桌文档! | 帮助中心 课桌文档-建筑工程资料库
课桌文档
全部分类
  • 党建之窗>
  • 感悟体会>
  • 百家争鸣>
  • 教育整顿>
  • 文笔提升>
  • 热门分类>
  • 计划总结>
  • 致辞演讲>
  • 在线阅读>
  • ImageVerifierCode 换一换
    首页 课桌文档 > 资源分类 > DOCX文档下载  

    单片机课程设计计算器.docx

    • 资源ID:1363057       资源大小:295.79KB        全文页数:53页
    • 资源格式: DOCX        下载积分:5金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要5金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

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

    单片机课程设计计算器.docx

    课程设计说明书课程设计名称:单片机课程设计课程设计题目:四位数加法计算器的设计学院名称:电气信息学院一专业班级:学生学号:学生姓名:学生成绩:指导教师:课程设计时间:2023.10.30至2023.11.5格式说明(打印版格式,手写版不做规定)(1)任务书三项的内容用小四号宋体,1.5倍行距。(2)目录(黑体,四号,居中,中间空四格),内容自动生成,宋体小四号。(3)章的标题用四号黑体加粗(居中排)。(4)章以下的标题用小四号宋体加粗(顶格排)。(5)正文用小四号宋体,1.5倍行距;段落两端对齐,每个段落首行缩进两个字。(6)图和表中文字用五号宋体,图名和表名分别置于图的下方和表的上方,用五号宋体(居中排)。(7)页眉中的文字采用五号宋体,居中排。页眉统一为:武汉工程大学本科课程设计。(8)页码:封面、扉页不占页码;目录采用希腊字母I、II、In排列,正文采用阿拉伯数字1、2、3排列;页码位于页脚,居中位置。(9)标题编号应统一,如:第一章,1,1.1,;论文中的表、图和公式按章编号,如:表1.1、表1.2;图1.2、图1.2;公式(1.1)、公式(1.2)0课程设计任务书一、课程设计的任务和基本规定(一)设计任务(从“单片机课程设计题目”汇总文档中任选1题,根据所选课题的具体设计规定来填写此栏)1 .系统通过4x4的矩阵键盘输入数字及运算符。2 .可以进行4位十进制数以内的加法运算,假如计算结果超过4位十进制数,则屏幕显示E。3 .可以进行加法以外的计算(乘、除、减)。4 .创新部分:使用1.CDI602液晶显示屏进行显示,有开机欢迎界面,计算数据与结果分两行显示,支持小数运算。(一)基本规定1 .有硬件结构图、电路图及文字说明;2 .有程序设计的分析、思绪说明;3 .有程序流程框图、程序代码及注释说明;4 .完毕系统调试(硬件系统可以借助实验装置实现,也可在Proteus软件中仿真模拟);5 .有程序运营结果的截屏图片。二、进度安排第9周,10.3011.51) 10.30题目分析,文献查阅2) 10.31方案比较,拟定设计方案3) 1O.311.1硬件电路设计4) I1.211.4程序设计,程序调试,系统联调,系统改善5) 11.5课程设计说明书撰写三、参考资料或参考文献1 .林立,张俊亮.单片机原理及应用基于PrOteUS和KeilCM.北京:电子工业出版社,20232 .张毅刚,彭喜元.单片机原理与应用设计M北京:电子工业出版社,20233 .马忠梅.单片机的C语言应用程序设计(第5版)M北京:北京航空航天大学出版社,20234 .楼然苗、李光飞.51系列单片机设计实例M.北京:北京航空航天大学出版社,2023本科生课程设计成绩评估表姓名专业班级学号课程设计题目:课程设计答辩记录:(手写)成绩评估依据:项目得分比例考勤记录设计结果报告撰写答辩成绩备注:成绩评估依据的项目内容和项目分值比例可以由老师按指导的专业进行调整,但成绩评估依据的项目数不得少于3项。最终评估成绩:指导教师署名:年月日第一章设计论证11.1 设计分析11.2 设计方案1第二章硬件设计22.1 硬件结构与工作原理22.2 单元电路设计2第三章软件设计93.1系统软件结构93.2主要功能子程序设计12第四章系统调试与分析204.1 调试过程与结果214.2 结果分析23第五章设计小结25附录26第一章设计论证1.1 设计分析在方案设计过程中,我列出了两种不同的设计方案,分别相应于显示模块和单片机内部运算。显示模块在我的设计中有两种不同的显示方式,分别为数码管显示以及液晶屏显示。对于数码管显示来说,优点是使用简朴,反映速度更快,由于1.CD有众多的接口,以及指令,因此在软件上要比数码管复杂。数码管显示的缺陷也比较明显,就是需要占用过多的单片机输出接口,同时:1.CD的显示功能更多,也更直观,对于现实生活中的使用也更加舒适。在综合了以上几点的考虑后,我最终选择了1.CDI602液晶显示芯片作为显示模块。在单片机内部运算方面,我的设想也有两种,即支持浮点数运算或只支持整数运算,若只支持整数运算,程序设计势必更加简朴易懂,但是出于实用性的考虑,我最终决定了使计算器支持浮点数运算功能。同时,这也能更好地锻炼我的编程思维能力。2. 2设计方案按照系统设计的功能的规定,初步拟定设计系统由主控模块、显示模块、键盘扫描接口电路共四个模块组成。主控芯片使用8051系列的AT89C52单片机,其中带有非易失性FlaSh程序存储器,它是一种高性能、低功耗的8位CMoS微解决芯片,市场应用最多。显示模块采用1.CD1602液晶显示器为主体构成。键盘电路采用4x4矩阵键盘电路。整个单片机的接口电路:PO用于显示输出或1.CDI602信号输入,Pl口用于键盘扫描输入,P2口用于1.CD1602的控制信号输出。为了驱动系统的各个模块正常协调工作,在软件方面我设计了四大模块,分别为显示、键盘、运算、综合模块,通过综合模块的协调来使其它三大模块正常运营,使计算器能对的运算得出对的结果。第二章硬件设计2.1 硬件结构与工作原理系统的主体部分由输入、运算、输出模块所组成,相应于图2.1中有,输入模块为键盘扫描输入,输出模块为1.CD1602显示,运算模块为单片机。在系统上电后,单片机初始化,开始运营内部程序,在程序运营过程中,通过软件功能来实现按下键盘上特定按键后,执行不同的功能,例如加减乘除,并将数据输出至显示模块(1.CDI602)显示。在运算过程中显示运算数据及符号,运算完毕后显示运算结果。2.2 单元电路设计单片机最小系统就是支持主芯片正常工作的最小电路部分,涉及主控芯片、复位电路和晶振电路。主控芯片选取AT89C52芯片,因其具有良好的性能及稳定性,价格便宜应用方便。晶振选取11.0592MHz,晶振旁电容选取20pF0采用按键复位电路,电阻分别选取I(X)Q和10K,电容选取10F0以下为单片机最小系统硬件电路原理图(图2.2),仿真接线图(图2.3)。图2,2单片机最小系统硬件电路原理图X1CRYSTA1.RP2RESPACK-8U11829R23010kP012:P023'P034P045:P056'P067P078POO1X7A1.1P0.0/AD0P0.1/AD1P0.2/AD2XiA1.2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6RSTP0.7/AD7P2.0/A8P2.1/A9P2.2/A10PSENCP2.3/A11EAP2.6/A14P-4T9P2.7/A15DQRY11Pl1/TPYDO1ZTYCP1.2P1QP3.2/1NT0DQQMT1PlApoCPaIRPOARP1.7P3.7/RD9AT89C5238D137D236D335D434D533D632D7DO3921222324252627RW*28ERS10TTJ2t4J5至T7图2.3单片机最小系统仿真接线图3. 2.2键盘接口电路计算器所需按键有:数字键:1,2,/31,4,;51,61,7,81,93Cro功能键:,'=',C(清零、小数点),共计16个按键,采用4*4矩阵键盘,键盘的行和列之间都有公共端相连,四行和四列的8个公共端分别接P1.(TPI.7,这样扫描PI口就可以完毕对矩阵键盘的扫描,通过对16个按键进行编码,从而得到键盘的口地址,对比PI的扫描结果和各按键的地址,我们就可以得到是哪个键按下,从而完毕键盘的功能。在PrOteUS仿真中,我直接使用元件库所有的KEYPAD-SMA1.1.CA1.C键盘,这种键盘直接实现了4*4键盘的功能,方便使用。如下图2.4所示。在按下其中一个键时,其相应的行与列将都会变成低电平,此时,即可通过判断PI口的值来拟定输入的是哪一个按键,然后将所取得的按键通过软件来进行接下来的解决、运算等工作。图2.44*4矩阵键盘4. 2.31.CD1602显示电路1.CDl602简介:如图2.5所示,1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正由于如此所以它不能很好地显示图形(用自定义CGRAM,显示效果也不好)。16021.CD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。1602采用标准的16脚接口,其中:第1引脚:GND为电源地第2引脚:VCC接5V电源正极第3引脚:VO为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个IOK的电位器调整对比度)。第4引脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。第5引脚:RW为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。第6引脚:E(或EN)端为使能(CnabIe)端,高电平(1)时读取信息,负跳变时执行指令。第714引脚:DOD7为8位双向数据端。第1516脚:空脚或背灯电源。第15引脚背光正极,第16引脚背光负极。特性3.3V或5V工作电压,对比度可调内含复位电路提供各种控制命令,如:清屏、字符闪烁、光标闪烁、显示移位等多种功能有80字节显示数据存储器DDRAM内建有192个5X7点阵的字型的字符发生器CGROM8个可由用户自定义的5X7的字符发生器CGRAM特性应用微功耗、体积小、显示内容丰富、超薄轻巧,常用在袖珍式仪表和低功耗应用系统中。操作控制注:关于E=H脉冲一一开始时初始化E为0,然后置E为1。图2.51.CD1602硬件原理图采用1.CDI602显示器对计算过程、结果以及提醒信息进行显示,在仿真电路中,由于Proteus中并没有1.CD1602显示芯片,故采用功能相似的1.M0161.进行替代,其中1.MOI61.的D(TD7三个输入输出端口接至单片机的PO.0P0.7口,用来对显示屏输出显示、输出控制指令以及获取状态信息。单片机的P2.5P2.7分别与1.MoI61.的RS、RW、E端口相连,用来对显示芯片进行控制。以下为1.CD显示电路的仿真接线图(图2.6)。图2.61.CD1602(1.M0161.)仿真接线图第三章软件设计若用户按下数字键1.CD清屏程序,并再次调用键盘扫描解决程序,等待用户输入数据,显示小数点等待按键3.1系统软件结构如图3.1所示,系统启动后,执行1.CD初始化程序,然后调用1.CD显示程序,在屏按下任意键后执行幕上输出欢迎信息。接下来调用键盘扫描解决程序,等待按键按下,图3.1程序流程图本次设计采用模块化设计思想,涉及主程序和初始化子程序、延时子程序、输出数据子程序、检测是否有按键按下子程序、拟定按键子程序、清第一行屏与显示“Welcome”子程序、换算第一个数子程序、运算子程序、显示结果子程序等子程序。运营程序后,一方面调用子程序清屏第一行并显示"Welcomew,清屏第二行并显示“ZCY'sCaculator!",然后检测是否有按键按下,假如没有,继续检测,假如按下,则判断是否是加减乘除键被按下,假如是加减乘除被按下,则显示相应的字符并换算出字符前输入的数据和字符后输入的数字,然后检测是否有等号按下,假如有则完毕相应的运算并显示相应的结果,然后检测是否有清屏键按下,假如有则清屏,相应的流程图如图3.1所示。对于数字键的程序段进行相应的设计,假如运算键(+、一,*,/)相应标志不为一,则将输入的数字送入第一个操作数缓存区,并且清空所有响应位。否则送入第二个操作数缓存区。另一方面对功能键的程序段进行相应的设计。假如功能键(+、一,*,/)第一次被按下,则置相应的标志位为一,并且将运算键响应标志位置一,清空第二个操作数的缓存区,为输入操作数做准备,假如是第二次按下则先调用运算操作子程序,执行上次按下的运算键的运算,置相应的标志位为一,并且将运算键响应标志位置一,清空第二个操作数的缓存区,为输入操作数做准备。程序上的具体实现:在单片机上电后,执行两个函数1.CD_dsp_string(4,0,''Welcome!zz)以及1.CD_dsp_string(l,1,ZCY,sCaCUlator)输出欢迎信息初始化1.CD。然后执行keyscan()函数判断是否有按键输入,若有则读取按键,否则循环扫描,直到有按键按下。在获取按键后,判断按键是否为数字,若是,则执行CaCUI(八)函数,将获取的数字保存为数,然后执行1.CD单个字符显示函数1.CDdspchar(x,y,dat)0若按键不是数字,则判断是否为操作符,若是,则执行1.CD_dsp_cha(x,y,dat)显示操作符,然后将flag标志位置1,代表第一个操作数输入结束。若不是操作符,则判断是否为'二',若是,则执行函数CaCUIator(x,y)函数,计算结果,然后执行1.CD_dsp_string(x,y,string)函数,将计算结果显示在屏幕上,然后执行keyscan()函数,等待按下任意键,按下任意键后,再次执行1.CD初始化程序。若不是G1.则判断是否是第一次按下清零键,若是,则显示小数点,并再次调用keyscan()函数,获取下一个按键,若不是第一次按下,则再次执行1.CD初始化程序。3.2重要功能子程序设计返回图3.21.CD显示子程序流程图如图3.2所示,当主程序调用了1.CD显示程序后,一方面判断1.CD是否处在忙碌状态,若是,则等待,若不是,则开始设立显示位置,然后判断显示的是单个字符还是字符串,分别实现对单个字符的输出以及对字符串的输出。之所以对单字符和字符串设立不同的显示函数,是为了实现程序对单片机资源的最优运用,由于单字符只占据一个字节的存储区,而字符串则至少占用两个字节。在显示完毕后,返回主程序,继续执行下一步。1.CD的显示程序中重要的部份为1.CD显示位置的设立以及1.CD显示数据的输出。为此,我编写了1.CD显示位置设立函数,以及1.CD显示函数,如下。1.CD显示位置设立函数:void1.CD_set_xy(unsignedcharx,unsignedchary)设立1.CD显示的位置unsignedcharaddress;if(y=0)尸0为第一行address=0x80+x;/x=0为一行的第一个else第二行address=OxcO+x;write_com(address);设立数据指针位置,调用1.CD写命令函数1.CD显示函数:void1.CDdspchar(unsignedx,unsignedchary,unsignedchardat)单个字符显示函数1.CD_set_xy(X,/调用1.CD显示位置设立函数,设立显示位置writedata(dat);写入待显示数据,调用1.CD写数据函数void1.CDdspstring(unsignedcharX,unsignedcharY,unsignedchar*s)字符串显示函数1.CD_set_xy(X,Y);调用1.CD显示位置设立函数while(*s)当字符串未到达结尾('0')时,循环输出单个字符(writedata(*s);s+;指向下一个字符)5. 2.2键盘扫描解决子程序图3.3键盘扫描解决子程序流程图如图3.3所示,当调用了键盘扫描解决子程序后,一方面,为Pl口赋值,然后等待,判断Pl的值是否变化,若变化,根据变化后的值,来判断按下的键值为多少;若Pl口的值未发生变化,则循环扫描Pl口的值,直到有按键按下导致Pl口的值发生变化。在扫描到按键值后,将按键值保存在全局变量n中,以便其他函数使用、解决该值。在我编写的程序中,例如下列程序段,我定义了一个临时变量temp来比较该值与给定值,来判断是否有键按下从而导致Pl口的值发生变化。voidkey_scan(void)键盘扫描解决子程序unsignedchartemp;定义临时变量temp保存Pl的值Pl=Oxfe;为Pl赋值,选中第一行if(Pl!=Oxfe)/Pl发生变化delay(200);延时200usif(Pl!=Oxfe)再次判断(消抖)temp=PUOxfO;判断是哪一列SWitCh(temp)(caseOxeO:n三,c,;break;第一歹IJcaseOXd0:n='0'break;第二列caseOxbO:n三,=,;break;第三列case0x70:n='+'break;第四列)While(Pll=Oxfe);等待,直到按键松掉)3. 2.3运算子程序接受操作数a,b,fha=a+bfh='+'?返回图3.4运算子程序流程图如图3.4所示,在取得操作数一、操作数二、运算符后,判断操作符的性质,然后根据操作符来进行加减乘除的计算,将计算结果保存在a中,并判断计算结果的值是否超过四位数,若超过,则在屏幕上输犯错误提醒信息,否则在屏幕上输出对的结果。a中的值可以直接作为下次计算的第一个操作数,即下次输入的是运算符加减乘除的话,之后输入的就是第二个操作数,否则,需要清零再输入两个数进行下轮计算。在我的程序中,我设立了较多的标志位,比如fuhao为负号标志,XSd为小数点标志,dh为等号标志,flag为操作数标志。以下是我的计算子程序的节选。switch(fuhao)判断操作符是哪个case'+,:a=a+b;break;加case,->:a=a-b;break;减case'*,:a-a*b;break;乘case,:a=ab;break;除)计算if(a>9999)判断结果是否超过四位数SPrintf(temp,"%s","Error");1.CD_dsp_string(O,1,temp);若结果超过四位数则输犯错误信息n=17;dokey_scanO;while(n=17);等待按键write_com(OxOl);a=b=0;fuhao=0;flag=0;i=0;J=O;dh=O;xsd=0;fh=O;清屏操作数清零操作符清空第一个操作数等号清空小数点清空将各个标志位恢复初始化第四章系统调试与分析4.1调试过程与结果本次课程设计中,我使用了Proteus作为硬件仿真软件,Keil作为软件编写编译软件,通过两者的协调,来实现仿真模拟。在Keil中编写并编译好程序后,导入到ProteUS中,然后启动仿真,使单片机运营,1.CD上显示出提醒信息,如图4.1所示。按下任意键后1.CD清屏,如图4.2所示。1.CD11.M0161.Uelcone!ZCV,sCaculatorH>>59。9。寸SCVJC11.QOQ1.CD11.M0161.图4.1欢迎界面图4.2清屏在第一次计算中,我输入了9999+1的运算式,按照正常的规定,输出结果应为E',然而,我的输出却是一个错误的计算结果,如图4.3所示,通过检查后,我发现了程序中的错误,是操作数的定义出现了问题,我定义的操作数是无符号字符型,所以导致在计算过程中发生了溢出,最后生成了错误的计算结果。然后我修改了程序,将操作数的定义改为了单精度浮点型,然后再次运营。1.CD11.M0161.图4.3错误输出1.CD11.M0161.图4.4对的输出警告信息进行第二次运算。在这次运算中,我再次输入了上次的运算式,结果不负所望,输出为'E',如图4.4所示。通过修改,结果已经对的。最后,我猜测,在我改善程序之前,由于操作数的数据类型弄错了,所以也许导致其他运算的结果也许也是错误的。进行第三次运算。输入第一个操作数,我输入的是1.25,如图4.5所示,同时,在我的设计中,将清零键与小数点键设立成了同一个键,以满足4*4键盘规定。在同一个操作数中按下两次ON/C键的话,会使屏幕清屏,数据清零,如图4.2所示。然后输入操作符,我输入的是乘号,如图4.5所示。然后输入第二个操作数,我输入的是352.7,如图4.5所示,输入等号后,在1.CD的第二行输出了计算结果,通过验算,发现结果对的。1.CD11.M0161.图4.5对的运营结果w11口.×+BC+5VRP2RESPACK-8图4.64*4键盘图4.7上拉电阻如图4.6所示,矩阵键盘的8个端口接至Pl口,在按下按键后,按键相应的行列端口均变为低电平,由此即可判断出按下的是哪个按键。如图4.7所示,为上拉电阻,在51单片机中,P0口开漏端口,因此需要外接上拉电阻来接负载,这样才干正常的进行输入输出的高低电平变化。4. 2结果分析在输入计算表达式后,系统成功得出了对的的计算结果,并且由于溢出判断的存在,保证了计算结果不会超过四位数,满足了设计规定。第五章设计小结课程设计是培养学生综合运用所学知识,发现、提出、分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。随着科学技术发展的日新日异,单片机已经成为当今计算机应用中空前活跃的领域,在生活中可以说得是无处不在。因此作为电子信息工程专业的学生来说掌握单片机的开发技术是十分重要的。我的题目是4位加法计算器,对于我们这些实践中的新手来说,这是一次考验。怎么才干找到课堂所学与实际应用的最佳结合点?如何让自己的业余更接近专业?如何让自己的计划更具有序性,而不会忙无一用?这都是我们所要考虑和努力的。通过查找资料,编写程序,加深了对单片机的了解与结识。通过本次的实验设计学习,又一次深刻感受到了51单片机虽然已通过去几十年,现在也不断地收到16位、32位低价单片机的冲击,但仍然是一款性能优越的单片机,在解决生活中常用的简朴任务时,51单片机仍然可以焕发出青春般的光彩。同时,51单片机也是学习和理解其他高级单片机的最佳的入门平台,本次的实验也将增强了我对学习好其他高级单片机的决心和信心。本次实验,让我收获很多,感谢同学的帮助,不仅加深了知识方面,更加锻炼了动手能力,相信以后碰到这方面问题不再会不知所措,让我把知识和实践结合到一起,通过这次实践,我了解自己的局限性,C语言掌握的不够,使我更加了解以后该在哪个方面补充的自己的局限性,总体来说本次课程设计是成功的,使我了解到更多课本上没有的知识,最后再次感谢所有帮助过我的老师和同学们。附录1 .计算器.cSinclude<reg51.h>#include<stdio.h>ttinclude<stdlib.h>unsignedcharn;操作数1,操作数2键盘扫描/1.CD初始化floatidataa,b;externvoidkey_scan(void);externvoidinit();externvoid1.CD_dsp_string(unsignedcharX,unsignedcharY,unsignedchar*s);/字符串显示externvoid1.CD_dsp_char(unsignedx,unsignedchary,unsignedchardat);/字符显示externvoidwritecom(unsignedcharcom);voidmain()charidatatemp16;临时存储区chari=0,j=O,fuhao;/i,j分别为temp与1.CD的数据指针bitflag=0,dh=O,fh=O,xsd=0;/flag=。:操作数1,fIag=I:操作数2;dh=l时表达已输入等号;fh负号;XSd小数点init();小数点1.CD_dsp_string(4,0,*Welcome!zz);1.CDdspstring(1,1,*ZCY,sCaculatorzz);输出欢迎信息do(key_scan();while(n=17);等待按键write_com(OxOl);清屏whiIe(I)key_scan();等待按键if(dh=l)&(fIag=D&(n!=17)一次计算完毕后执行1write_com(OxOl);清屏输出上次计算的结果1.CDdspstring(O,O,temp);i=0;flag=O;fh=O;while(tempi+!=,0,)j+;将temp数据指针移向后一个空位,将1.CD显示指针移向下一个空位假如输入的第一个数是负数则执行表达有负号保存负号输出减号if(i=0)&(n=三,-,)&(fh=0)(fh=l;tempO=,-';i+;1.CD_dsp_char(j+,0,n);if(fIag=O)continue;)if(n>三,0')&(n<三,9')I(n='c')&(XSd=O)&(dh=O)if(n='c')n=.;xsd=l;防止再次按下c后继续出现小数点)tempi+=n;保存输入的数字1.CDdspchar(j+,O,n);显示并将光标移至下一位(光标未显示)if(n=-+')I(n=->)I(n=-*,)(n=',)(flag=0)(dh=l)输入完第一个操作数之后或者完毕一次计算之后按下运算符按键时执行fIag=I;fuhao=n;tempi=,0,;a=atof(temp);i=0;dh=O;之后输入的操作数是第二个操作数表达为字符串转换为数据xsd=O;之后第二个操作数中可以添加一个小数点已输入完第二个操作数并按下等号显示等号switch(n)case+:1.CD_dsp_char(j+,O,n);break;case,-,:1.CDdspchar(j÷+,O,n);fh=O;break;case'*':1.CDdsp_char(j+,O,n);break;case,:1.CD_dspchar(j+,O,n);break;显示运算符)if(n=,=,)&(flag=l)(dh=l;tempi=,O,;b=atof(temp);i=O;xsd=O;1.CD_dsp_char(j,O,=,);switch(fuhao)case'+,:a=a+b;break;case,-,:a=a-b;break;case'*':a=a*b;break;case,:a=ab;break;)计算if(a>9999)(SPrintf(temp,%s,“Error");若计算结果超过四位数则输犯错误信息1.CD_dsp_string(O,1,temp);n=17;do(key_scan();while(n=17);等待按键write_com(OxOl);清屏a=b=0;fuhao=0;flag=0;i=0;j=0;dh=O;xsd=0;fh=O;恢复初始化)else(sprintf(temp,zz%g,z,a);输出计算结果1.CDdspstring(O,1,temp);)if(n='c')按下清除键(write_com(OxOl);清屏a=b=0;fuhao=0;fIag=O;i=0;J二O;dh=O;xsd=0;fh=O;恢复初始化)2 .1.CD1602.cttinclude<reg51.h>sbitlcden=P27;读写控制输入端sbitrw=P2'6;读写控制端sbitrs=P25;指令、数据选择端sbitbusy=P(7;/1.CD内部忙标志延时函数voiddelay(unsignedintm)unsignedintn;for(n=0;n<=m;n÷+);)voidcheck()判断1.CD是否忙碌PO=Oxff;rs=0;rw=l;Icden=O;delay(100);Icden=I;while(busy=l);当busy=l,即1.CD忙时,等待)voidwritecom(unsignedcharcom)写显示命令P0-com;rs=O;rw=0;Icden=O;check();Icden=I;voidwrite_data(unsignedchardate)(PO=date;rs=l;rw=0;Icden=O;check();Icden=I;)写显示数据初始化1.CDvoidinit()writecom(0x38);16x2行显示,5x7点阵,8位数据接口开显示,光标不显示、不闪烁光标自增,画面不动选择第一行清屏unsignedchary)设立1.CD显示的位置write_com(OxOc);writecom(0x06);write_com(0x80);writeCom(OxOl);)void1.CDsetxy(unsignedcharx,(unsignedcharaddress;if(y=0)/y=0为第一行/x=0为一行的第一个address=0x80+x;else第二行address=OxcO+x;设立数据指针位置writecom(address);)void1.CD_dsp_char(unsignedx,unsignedchary,unsignedchardat)单个字符显示函数1.CDsetxy(x,y);设立显示位置write_data(dat);写入待显示数据void1.CD_dsp_string(unsignedcharX,unsignedcharY,unsignedchar*s)字符串显示函数1.CD_set_xy(X,Y);while(*s)出单个字符(write_data(*s);s÷+;)3.key_scan.cttinclude<reg51.h>当字符串未到达结尾(,o,)时,循环输指向下一个字符externvoiddelay(intms);外部延时函数声明voidkeyscan(void)(unsignedchartemp;Pl=Oxfe;if(PlI=Oxfe)(delay(200);if(Pl!=Oxfe)(temp=Pl&0xf0;switch(temp)(caseOxeO:n三,c,;break;caseOxdO:n=,0,;break;caseOxbO:n=,=,;break;case0x70:n=,+,;break;whiIe(Pl!=Oxfe);else(Pl=Oxfd;if(Pl!=Oxfd)(delay(200);if(Pl!=Oxfd)(temp=Pl&0xf0;switch(temp)(caseOxeO:n=,;break;caseOxdO:n=,2,;break;caseOxbO:n=,3,;break;whiIe(Pl!=Oxfd);)elsePl=Oxfb;if(Pl!=Oxfb)(delay(200);if(PH=Oxfb)(temp=Pl&0xf0;switch(temp)(caseOxeO:n=,4,;break;caseOxdO:n=,5,;break;caseOxbO:n=,6,;break;whiIe(Pl!=Oxfb);)elsePl=0xf7;if(Pl!=0xf7)(delay(200);if(Pl!=0xf7)(temp=Pl&OxfO;switch(temp)(caseOxeO:n=,T;break;caseOxdO:n=,8,;break;caseOxbO:n=,9,;break;)while(Pl!=Oxf7);)elsen=17;

    注意事项

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

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




    备案号:宁ICP备20000045号-1

    经营许可证:宁B2-20210002

    宁公网安备 64010402000986号

    课桌文档
    收起
    展开