已阅读5页,还剩12页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
福州大学至诚学院单片机原理及应用课程设计题 目: 计算器 系 别: 电气工程及其自动化 专 业: 电气工程与自动化 班 级: 姓 名: 学 号: 起止日期: 2009.12.28 2010.1.8 指导教师: 职 称: 课程设计任务书一、课程设计的要求和内容(包括原始数据、技术要求、工作要求)计算器 要求:1、用89C51单片机、键盘、数码管设计计算器。2、编程实现6位数的加减乘除,输入的数通过键盘给出,并由数码管显示结果 。3、能实现连续的加减乘除。4、实现十进制转十六进制,并显示结果。二、课程设计图纸内容及张数1PTOTEUS 仿真原理图一份;2程序流程图。三、课程设计实物内容及要求1 理解项目的需求,编写说明文档;2 设计程序流程图、编写程序源码(要求必要的注释);3 利用PROTEUS软件对程序进行模拟;4写设计报告,演示并简要说明设计要点,分析存在的问题及解决方法。四、主要参考资料1 李朝青.单片机原理及接口技术(第3版). 北京航空航天大学出版社.2006 2 田立 田青 代万震.51单片机C设计快速入门 .人民邮电出版社.20073 楼然苗 李光飞.51单片机设计实例.北京航空航天大学出版社.20044 王守中51单片机开发入门与典型实例. 人民邮电出版社.2007 任务下达日期 2009 年 12 月 27 日完成日期 2010 年 01 月 08 日指导教师 (签名)学 生 (签名)目 录1.设计概述22.硬件电路图3 3.软件设计43.1 设计流图43.2程序54结论 134.1测试结果134.2遇到问题134.3如何解决135参考文献 15附录:键盘内部原理图 151、设计概述1.1实现功能1、通过键盘实现6位数的加减乘除,并由数码管显示结果 。2、能实现连续的加减乘除。3、实现十进制转十六进制,并显示结果。1.2硬件连接P3口接4*4键盘,P2口接锁存器,锁存器与数码管相连,P1口接锁存器允许端,P0.0接16进制转换开关。具体参看电路图。1.3设计思路1、通过键盘扫描获取键值2、判断键值进行处理3、显示结果1.4程序模块1、主程序2、十六进制显示3、四则运算4、键盘扫描程序5、显示程序2、硬件电路图3、软件设计3.1设计流程图:初始化扫描键盘是否为数值显示数值或错误是否按下10转16进制显示16进制数运算显示结果 N Y N Y 主要程序流程说明:主程序首先进行初始化, 设定一些变量及其意义,扫描键盘,当输入有09数字时,通过键盘的扫描程序, 将数值赋给second并在显示器上来,当输入的是加减符号的时候,通过键盘的扫面程序,赋予OP相应值,并跳到运算部分,通过判断preop的值,执行相应的运算部分,将OP的值赋给preop并把second的值赋给first。再一次通过输入09的数字,再一次经过键盘的扫描程序,输出second的值,最后通过输入键盘上的等号,右键盘扫描得出相应的OP,跳到运算部分,根据程序的流程,将第一个数的跟第二个数进行简单的加、减、乘、除运算,并将结果通过显示器输出。同理,当需要进行进制之间的转换时,输入相应的数字,通过键盘的扫描不显示在显示器上,再通过控制,进制转换开关,如果进制转换开关置0 按下,就实现了进制之间的相互转换。3.2程序#include int zixing16=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77, 0x7c,0x39,0x5e,0x79,0x71;/十六进制对应字符int op=0;/用来存储+、-、*、/操作符 int key=20;/按键初值int biaoji=0;/是否已计算并显示标记int pn=0;/当前按键是否为数字long result=0;/存入初值long b=0;/暂存数初值int kbscan(void); /声明键盘扫描程序void display(long temp); /声明显示程序void sljzxs(int temp); /十六进制显示程void yunsuan(void); /声明运算程序void dlms(void); /声明延时程序 /主程序/void main(void) int i,j=0; P0=0x01; /进制转换开关置0 P1=0X00;/送数口 P2=0X00;/片选口 while(1) key=kbscan();/获取键值 if(key=16&biaoji=0) /如果进制转换开关置0 按下 if(op=0&pn=1) sljzxs(result);result=0;/显示16进制数,传送值清0 if(key=0&key=9) /如果KEY在0到9之间,证明键盘按下的是数值 if(result=10&key=13) /如果KEY在10到13之间,证明键盘按下的是操作符键 if(biaoji=1) op=key;/标记为1,已显示结果,只改变运算符 else if(op=0&pn=0) ;/之前无按键 else if(op=0&pn=1)/之前只按过数字键 op=key;b=result;result=0;/记录符号,将当前数存入b中 else if(op!=0&pn=0) op=key;/之前按过数字和符号 else /之前按过数字和符号及数字 yunsuan();op=key;b=result;result=0;/输出结果,再记录符号,将当前数存入b中 pn=0; if(key=14) /如果KEY位14时,证明键盘按下的是C/ON键 P2=0xff;/清空 P1=0x00; P2=0x20;/显示0 P1=0x3f; op=0;/初始化 result=0; b=0; biaoji=0; pn=0; if(key=15) /如果KEY位为15时,证明键盘按下的是=键 if(biaoji=0)/如果未显示过结果 if(op!=0&pn=1)/之前按过数字和符号及数字 yunsuan();b=result;result=0;op=0;/输出结果,将当前数存入b中,符号位及结果清0 pn=0; for(i=0;i0)/直到k=0停止循环 n=k%16;/取最低位 P1=zixingn;/显示低位 k=k/16;/去掉最低位 r=P2=(r1);/左移一位 P1=0x00;/移位后会再送数,所以要置0 while(P0=0x00);/等待按键放开 biaoji=1; /四则运算/void yunsuan(void) switch(op) case 10: result=b+result; display(result); break; case 11: result=b-result; display(result); break; case 12: result=b*result; display(result); break; case 13: result=b/result; display(result); break; default: break; biaoji=1;/延时程序/void dlms(void) int i; for(i=0;i250;i+)/键盘扫描程序/int kbscan(void) int p,a,n; P3=0xf0;/高4位置高,低4位置低 while(P3&0xf0)!=0xf0|P0=0x00) /有按键则高位不全为1 dlms();/延时以防干扰 if(P3&0xf0)!=0xf0|P0=0x00)/确实有按键 if(P0=0x00) return(16); p=0xfe; / p= 1111 1110从第1行开始扫描 while(p&0x10)!=0)/当第5位为0时停止循环扫描,此时已扫描4行 P3=p; /装入行扫描值 if(P3&0xf0)!=0xf0)/如果此行有按键,接下去获取键值 a=P3; /P口值送置a /键码对应的数值 if(a=0xd7)n=0; /4行2列为0 if(a=0xeb)n=1; /3行1列为1 if(a=0xdb)n=2; /3行2列为2 if(a=0xbb)n=3; /3行3列为3 if(a=0xed)n=4; /2行1列为4 if(a=0xdd)n=5; /2行2列为5 if(a=0xbd)n=6; /2行3列为6 if(a=0xee)n=7; /1行1列为7 if(a=0xde)n=8; /1行2列为8 if(a=0xbe)n=9; /1行3列为9 if(a=0x77)n=10; /4行4列为+ if(a=0x7b)n=11; /3行4列为- if(a=0x7d)n=12; /2行4列为* if(a=0x7e)n=13; /1行4列为/ if(a=0xe7)n=14; /4行1列为on if(a=0xb7)n=15; /4行3列为= while(P3&0xf0)!=0xf0);/等待按键放开 return(n);/返回键值 else /不在第1行,左移继续扫描 p=(p=1000000|k-99999) /最高位大于10,显示错误E0001 P2=0x01;r=0x01;P1=0x79; r=(r1);P2=r;P1=0X3f; r=(r1);P2=r;P1=0X3f; r=(r1);P2=r;P1=0X3f; r=(r1);P2=r;P1=0x06; else if(k=-99999)/显示负数 P2=0xff;P1=0x00;/清空 P2=0x01;P1=0x40;/显示负号 P2=0x20;/选定第一位 k=-k;/取反 while(k0)/同正数显示 n=k%10; P1=zixingn; k=k/10; r=(r1); P2=r; P1=0x00; else/显示正数 P2=0xff;P1=0x00;/清空 P2=0x20;/选定第一位 if(k=0) P1=0x3f;/如果是0显示0 while(k0) /由个位开始显示数值 n=k%10;/取最低位 P1=zixingn;/显示低位 k=k/10;/去掉最低位 r=(r1);/左移一位 P2=r; P1=0x00;/移位后会再送数,所以要置0 4、结论4.1、测试结果用Keil uVision3编写程序,经检查成功后,通过编译链接产生*.hex文件,并用Proteus 7.5设计绘制电路图,并将生成的*.hex文件导入芯片中,进行仿真。仿真结果为:1、由键盘输入,能实现6位数加减乘除计算。2、能实现连续的加减乘除。 3、输入时符合输入习惯。4、溢出时能显示错误。5、能通过16进制开关实现16进制转换。6、没有再发现漏洞。4.2、遇到问题1、不懂得按键原理。2、如何知道之前键入的字符,以便处理当前键入字符。3、长按会连续送数 。4、若先输入乘或除时显示结果始终为0,不合要求。5、左移命令的问题。4.3、如何解决1、看课本223页得知原理:a、判断是否有按键:列高4位置1,行低4位置0,如果有按键,总有一列线被置0,使列输入不全位1 。b、行扫描:列高4位置1,行低4位为1110,即从第0行开始扫描,若此行有按键,必有列位被置0,否则左移继续扫描,读取键位值。按键扫描流程图:开始有按键?延时n=16有按键?行扫描获取键值,返回键值n在此行已扫4行n=16返回左移1位2、加入标记就能通过查看标记值得知之前键入字符。3、加一条命令while(P3&0xf0)!=0xf0);可等待按键放开后才继续。4、问题原因:初始化时使当前数为0。通过判断之前键入字符讨论处理后,可解决问题。5、查书后明白左移后末位补的是0,而要补的是1。所以要加一条或命令。心得:这次的设计,加深了我对单片机的理解,编写程序必须严谨,认真,有耐心,才能成功。 遇到问题:由于接触单片机课程的时间尚短,专业知识还不扎实,在编写程序时难免受阻,要常翻阅课本查阅
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 小朋友健康宣教
- 诺水河景区介绍
- 2025年催乳理论试题及答案
- 现场消防档案验收资料汇报
- 环境对训练的辅助
- 运营界面设计
- 科学练声方法与演讲训练
- 肛瘘的健康宣教
- 瑞士万通离子色谱仪使用方法
- 2025年产品考试题目及答案
- 2025年时事政治考试44题及参考答案
- 2025年浙江宁波北仑中学提前招生英语试卷真题(含答案详解)
- 智慧树知到《大话机器人(青海大学)》2025章节测试附答案
- 1供货、安装、调试方案及售后服务方案
- 地质勘查项目野外验收实施细则
- 消防燃烧学(第2版)课件:可燃气体燃烧
- 《R语言入门》课件
- 小学数学作业设计培训
- 1.3.1氧化剂和还原剂 课件高一上学期化学人教版(2019)必修第一册
- 食堂承包劳务合同模板
- 神经外科患者血压护理
评论
0/150
提交评论