ImageVerifierCode 换一换
格式:DOCX , 页数:12 ,大小:117.65KB ,
资源ID:3565117      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3565117.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(51单片机计算器程序设计报告.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

51单片机计算器程序设计报告.docx

1、51单片机计算器程序设计报告长沙民政职业技术学院课 程 设 计 报 告课 题 名 称: 51单片机的计算器设计 课 程: 单片机技术及应用 专 业: 应用电子技术 学生姓名周扬孔计张娇陈实学 号17151419班 级0733073307330733指导老师方跃春老师应用电子技术教研室2009年9月2日一、课题任务及要求要求:1、掌握数码管移位动态扫描显示的编程方法2、掌握矩阵扫描的编程方法3、掌握数据在内部运算的编程方法任务:1、实现最大6位正整数加、减、乘、除 2、具备清零、等于功能3、16个按键功能依次为: 数字0、数字1、数字2、数字3、数字4、数字5、数字6、数字7、数字8、数字9、清

2、零、等于、加、减、乘、除 二、硬 件 设 计1. 原理图2. 原理分析该设计通过89C51芯片控制6个一位数码管显示,并实时检测按键按下情况来实现计算器功能,16个按键有10个为数字按键 其他6个分别为加、减、乘、除、复位、等于电路接上电源后 数码管显示个位显示数字0 ,芯片对按键进行实时扫描,通过矩阵键盘进行计算,特别注意的是,当结果为负数时,数码管显现EORR。(一)、硬件部分1、数码管为一位共阴数码管,共6个;故在段码输出口外加NPN型三极管作驱动2、51芯片P1口接键盘端(矩阵按键)、P3口接段码、P2口的P2_0P2_5接位码3、按键为四乘四矩阵,共16个键(二)、软件部分1、数码管

3、移位显示的实现是通过标志位wei2的数值变化控制dispiay函数显示位来实现的2、程序的重要算法是通过类型为unsigned int 的数temp和数组str实现整体加减乘除、各位显示的 只要弄懂这一算法,此程序就可轻易掌握3. PCB图略。4. 元件清单及造价预算按键 20个 单价 0.2 元 总计 4元万用板 2块 单价 4 元 总计 8元一位共阴数码管 6个 单价 2 元 总计 2元三极管 7个 单价 0.2 元 总计 1.4元1K电阻 20个 单价 0.01 元 总计 2毛排插及排线 5对 单价 1元 总计 5元 电容 3个 单价 0.2元 总计 6毛晶振 1个 单价 1元 总计 1

4、元 8051芯片 1 个 单价 6元 总计 6元 费用总计 26.2元5.实物照片三、程 序 设 计头程序 str6=str5=str4=str3=str2=str1=10; str16=str15=str14=str13=str12=str#include /51单片机基本定义头文件#include /循环位移头文件#define uchar unsigned char /宏定义#define uint unsigned int sbit P1_4=P14; /IO端口定义 (矩阵扫描后4位端口)sbit P1_5=P15;sbit P1_6=P16;sbit P1_7=P17;uchar

5、i,num,s; /全局变量定义uchar wei,wei2,ss,ss1,ss2,str1=0,0,0,0,0,0,0;long temp,temp1,str=10,10,10,10,10,10,10;uchar code dutable= /段位编码0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e;uchar code wetable= 0xfe,0xfd,0xfb,0xf7,0xef,0xdf;void init(); /函数声明void panduan();void displ

6、ay();void delay(uint z);void shaomiao();void main() /主函数 init(); /调用变量初始化函数 while(1) /大循环 shaomiao(); /调用矩阵扫描加处理函数 display(); /调用显示函数 void init() /变量初始化函数 ss2=0; wei2=1; temp1=0; ss=0; ss1=0; temp=0; wei=0; num=0;void delay(uint z)/延时函数(单位ms) uchar i; uint j; for(j=z;j0;j-) for(i=114;i0;i-);void sha

7、omiao() /扫描加处理函数 for(i=0,s=0xfe;i4;i+) /低四位端口依次赋值1 P1=s; /对P1口赋值 panduan(); /调用判断处理函数 s=_crol_(s,1); /s循环位左移 s=s|0xf0; /进行位或运算 (使高4位复原) void panduan() uchar n; if(P1_4=0|P1_5=0|P1_6=0|P1_7=0) delay(10); P1=s|0xf0;if(P1_4=0|P1_5=0|P1_6=0|P1_7=0) if(P1_4=0) n=1;num=i*4+n-1; else if(P1_5=0) n=2;num=i*4

8、+n-1; else if(P1_6=0) n=3;num=i*4+n-1; else if(P1_7=0) n=4;num=i*4+n-1;if(num=10) wei=0; if(num=10) temp=0;11=0; wei=0; temp1=0; ss=0; wei2=1; if(ss1=0&num=11|(ss1=0&ss2!=0&num11&num999999) temp=0; ss1=1; if(num=12) temp1=temp; ss=1;ss1=1;ss2=1; if(num=13) temp1=temp; ss=2;ss1=1;ss2=1; if(num=14) te

9、mp1=temp; ss=3;ss1=1;ss2=1; if(num=15) temp1=temp; ss=4;ss1=1;ss2=1; str16=temp/100000; str15=temp%100000/10000; str14=temp%10000/1000; str13=temp%1000/100; str12=temp%100/10; str11=temp%10/1; if(str11!=0) wei2=1;if(str12!=0) wei2=2; if(str13!=0) wei2=3; if(str14!=0) wei2=4; if(str15!=0) wei2=5; if(

10、str16!=0) wei2=6; while(P1_4=0|P1_5=0|P1_6=0|P1_7=0); void display() char i1; for(i1=1;i1wei2+1;i1+) if(num=0&ss=4|temp0) P2=wetable0; P3=dutable14; else P2=wetablei1-1; P3=dutablestr1i1; delay(10); P3=0xff; 四、调 试 结 果1、硬件调试a. 把电路板焊好后,先通过检查电路板表面检查是否有漏焊、错焊、接触不良等b. 编写检测程序逐个点亮数码管,检查数码显示部分是否有硬件问题 c编写检测程序

11、检测矩阵扫描是否有硬件问题2、程序调试重点就是这个部分,很多程序就是在调试过程中慢慢完善,先前所完成的程序部分只能算一个基本框架,当然,这一切是建立在硬件没用问题的基础上程序在进行调试时,可以像硬件一样使用分模块调试,这样可以最迅捷的找出问题所在,不受其他模块的影响我们在硬件调试时,一开始时51芯片不工作,经过反复检查后发现原来51芯片的31脚(/EA/VPP)必须接入高电平才能使单片机在读取程序时优先访问内部程序存储器,否则只访问外部程序存储器,而我们的程序是在内部的,故芯片不工作,我们随即在31脚外接VCC和限流电阻,在解决了这个后,硬件OK了。软件调试时问题就比较多了,很多都是小问题,大

12、多是因为在编写程序时一些地方不够注意或笔误引起的,在这里就不过多解释,少部分是一些难以解决的大问题,一是在输入数字的储存上,开始打算只使用一个数组str解决,但在编程时发现在数字转换为一个一个的编码中发现直接引用会引起数据混乱,最后在添入另一数组str1后问题得到解决;二是输入数据在内部进行加减乘除时,加法乘法没有错误,但减法除法因为一次输出和二次输入数据的位置关系导致第二次运作时出现错误,最后我们调整了储存数据的变量,这个问题顺利的解决了,最后一个问题困扰我们最久,甚至导致调试过程一度中止,由于我们是6位数的运算,在数字显示过程中,出现了跳位现象,比如你输入123,当输如12时,数码管正常显

13、示12,但将3输入后,数码管显示变为了312,由于一直找不出原因,这个问题一直得不到解决,最后我尝试改变display( )函数和大循环中函数的位置循序后才能正常显示,但这从理论上说不通,最后得出可能是受到延时函数delay( )的延时影响,导致数码管动态显示位码出错。在将这个问题解决后,我们的程序就基本调试完成了,但这并不是最终结果,我将做好的计算器给其他同学进行操作,在他们找茬似的操作中,我们又发现了几个隐藏的很深的BUG并加以解决,虽然不知道还有什么BUG没发现,但至少在BUG发现之前,我们的程序是没问题了。五 、设 计 总 结从这次课题设计任务中,我们学习到了很多,经过我们四个的共同努

14、力,老师的精心指导,还有和在网上找到的一些资料,主要让我们掌握了数码管移位动态扫描显示的编程方法,掌握了矩阵扫描的编程方法,掌握了数据在内部运算的编程方法,这也是编程必须掌握的知识。当然调试的时候你也是一个重点,也让我们收获良多,这其中就分硬件和软件两部分,硬件只要我们注意一些焊接问题,对板子输入简单的程序进行检测。这个只要自己细心一点都可以按照原理图做好,其中最重要,最麻烦,也是学到和掌握的东西最多的地方就是软件调试了,这其中包括程序的编写检验,这样你必须对程序的每部分都很熟悉,掌握每句程序的再整个整体的作用。这样你出现问题是你才能根据问题改变程序内容而达到目的。我们出问题最多的也是这个地方,这证明了我们对程序的掌握还有欠缺,不能熟悉的掌握和运用程序,所以导致我们不能很快很好的完成课题任务。当然也还有很多细节方面和人工的失误问题,我们几个第一次的配合还是不能很好的进行。程序编写上也出现了很多细节的错误,并不能把程序依次性就编写好,这也浪费了我们很多的时间,这主要也是我们没有把这方面的知识学扎实。所以我们要把一次课题设计好,不但要学习好课堂的知识,而且要注意各方面的细节。这次课题设计使我们各方面都得到了一定的锻炼。

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

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