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

下载本文档

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

文档简介

1、长沙民政职业技术学院课 程 设 计 报 告课 题 名 称: 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、数码管移位显示的实现是通过标志位w

3、ei2的数值变化控制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元 8051芯片 1 个 单

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

5、it P1_7=P17;uchar 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 pa

6、nduan();void display();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;j>0;j-) for

7、(i=114;i>0;i-);void shaomiao() /扫描加处理函数 for(i=0,s=0xfe;i<4;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-

8、1; else if(P1_5=0) n=2;num=i*4+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!=7) wei+;if(ss1=1) temp=0; str6=str5=str4=str3=str2=str1=10; str16=str15=str14=str13=str12=str11=0; ss1=0; strwei=num;if(str1!=10) temp=str1; if(str2!=10) temp=str1*10+str2;

9、 if(str3!=10) temp=str1*100+str2*10+str3; if(str4!=10) temp=str1*1000+str2*100+str3*10+str4; if(str5!=10) temp=str1*10000+str2*1000+str3*100+str4*10+str5; if(str6!=10) temp=str1*100000+str2*10000+str3*1000+str4*100+str5*10+str6; if(num>=10) wei=0; if(num=10) temp=0;11=0; wei=0; temp1=0; ss=0; wei

10、2=1; if(ss1=0&&num=11|(ss1=0&&ss2!=0&&num>11&&num<16) if(num=11) ss2=0; switch(ss) case 0: break; case 1: temp=temp+temp1;break; case 2: temp=temp1-temp;break; case 3: temp=temp*temp1;break; case 4: temp=temp1/temp;break; if(temp>999999) temp=0; ss1=1; if(num

11、=12) temp1=temp; ss=1;ss1=1;ss2=1; if(num=13) temp1=temp; ss=2;ss1=1;ss2=1; if(num=14) temp1=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=

12、1;if(str12!=0) wei2=2; if(str13!=0) wei2=3; if(str14!=0) wei2=4; if(str15!=0) wei2=5;if(str16!=0) wei2=6; while(P1_4=0|P1_5=0|P1_6=0|P1_7=0); void display() char i1; for(i1=1;i1<wei2+1;i1+) if(num=0&&ss=4|temp<0) P2=wetable0; P3=dutable14; else P2=wetablei1-1; P3=dutablestr1i1; delay(1

13、0); P3=0xff; 四、调 试 结 果1、硬件调试a. 把电路板焊好后,先通过检查电路板表面检查是否有漏焊、错焊、接触不良等b. 编写检测程序逐个点亮数码管,检查数码显示部分是否有硬件问题 c编写检测程序检测矩阵扫描是否有硬件问题2、程序调试重点就是这个部分,很多程序就是在调试过程中慢慢完善,先前所完成的程序部分只能算一个基本框架,当然,这一切是建立在硬件没用问题的基础上程序在进行调试时,可以像硬件一样使用分模块调试,这样可以最迅捷的找出问题所在,不受其他模块的影响我们在硬件调试时,一开始时51芯片不工作,经过反复检查后发现原来51芯片的31脚(/EA/VPP)必须接入高电平才能使单片机

14、在读取程序时优先访问内部程序存储器,否则只访问外部程序存储器,而我们的程序是在内部的,故芯片不工作,我们随即在31脚外接VCC和限流电阻,在解决了这个后,硬件OK了。软件调试时问题就比较多了,很多都是小问题,大多是因为在编写程序时一些地方不够注意或笔误引起的,在这里就不过多解释,少部分是一些难以解决的大问题,一是在输入数字的储存上,开始打算只使用一个数组str解决,但在编程时发现在数字转换为一个一个的编码中发现直接引用会引起数据混乱,最后在添入另一数组str1后问题得到解决;二是输入数据在内部进行加减乘除时,加法乘法没有错误,但减法除法因为一次输出和二次输入数据的位置关系导致第二次运作时出现错

15、误,最后我们调整了储存数据的变量,这个问题顺利的解决了,最后一个问题困扰我们最久,甚至导致调试过程一度中止,由于我们是6位数的运算,在数字显示过程中,出现了跳位现象,比如你输入123,当输如12时,数码管正常显示12,但将3输入后,数码管显示变为了312,由于一直找不出原因,这个问题一直得不到解决,最后我尝试改变display( )函数和大循环中函数的位置循序后才能正常显示,但这从理论上说不通,最后得出可能是受到延时函数delay( )的延时影响,导致数码管动态显示位码出错。在将这个问题解决后,我们的程序就基本调试完成了,但这并不是最终结果,我将做好的计算器给其他同学进行操作,在他们找茬似的操

16、作中,我们又发现了几个隐藏的很深的BUG并加以解决,虽然不知道还有什么BUG没发现,但至少在BUG发现之前,我们的程序是没问题了。五 、设 计 总 结从这次课题设计任务中,我们学习到了很多,经过我们四个的共同努力,老师的精心指导,还有和在网上找到的一些资料,主要让我们掌握了数码管移位动态扫描显示的编程方法,掌握了矩阵扫描的编程方法,掌握了数据在内部运算的编程方法,这也是编程必须掌握的知识。当然调试的时候你也是一个重点,也让我们收获良多,这其中就分硬件和软件两部分,硬件只要我们注意一些焊接问题,对板子输入简单的程序进行检测。这个只要自己细心一点都可以按照原理图做好,其中最重要,最麻烦,也是学到和掌握的东西最多的地方就是软件调试了,这其中包括程序的编写检验,这样你必须对程序的每部分都很熟悉,掌握每句程序的再整个整体的作用。这样你出现问题是你才能根据问题改

温馨提示

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

评论

0/150

提交评论