《51单片机计算器设计报告(共12页).doc》由会员分享,可在线阅读,更多相关《51单片机计算器设计报告(共12页).doc(12页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上目录一 设计概述 -3二 硬件电路图 -3三 软件流程图 -4四 结论 -11五 参考文献-13一、1.1设计概述计算器通过编译,能实现简单的四位数加减及两位数的乘除,输入的数通过键盘给出,要求显示要操作的数,并显示结果 ,编译十进制跟十六进制之间转换的程序,实现十进制转十六进制,显示结果。1.2功能说明简单的运算功能:当通过输入键盘数字时,能够在显示器上显示输出的数值,并且通过想实现的简单运算功能,实现计算器的加、减、乘、除,并将结果显示出来。进制转换的功能:通过输入的十进制数,经过计算器的功能将其转换为十六进制数,并将结果显示出来。二、硬件电路图初始化是否为数值显
2、示数值或错误扫描键盘显示结果运算显示16进制是否按下10转16进制三、软件流程图 N Y N Y 主要程序流程说明:主程序首先进行初始化, 设定一些变量及其意义,扫描键盘,当输入有09数字时,通过键盘的扫描程序, 将数值赋给second并在显示器上来,当输入的是加减符号的时候,通过键盘的扫面程序,赋予OP相应值,并跳到运算部分,通过判断preop的值,执行相应的运算部分,将OP的值赋给preop并把second的值赋给first。再一次通过输入09的数字,再一次经过键盘的扫描程序,输出second的值,最后通过输入键盘上的等号,右键盘扫描得出相应的OP,跳到运算部分,根据程序的流程,将第一个数
3、的跟第二个数进行简单的加、减、乘、除运算,并将结果通过显示器输出。同理,当需要进行进制之间的转换时,输入相应的数字,通过键盘的扫描不显示在显示器上,再通过控制,进制转换开关,如果进制转换开关置0 按下,就实现了进制之间的相互转换。程序代码如下: #include #define uint long#define uchar longint zixing16=0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71; uint op=0;/用来存储+、-、*、/操作符 uint preop=2
4、0; uint first=0;/第一次键入的数值 uint second=0;/第二次键入的数值 uint result=0;/最终运算结果 uchar key=16; uchar kbscan(void); /声明键盘扫描程序void display(uint temp); /声明显示程序void sljzxs(uint temp); /十六进制显示程void yunsuan(void); /声明运算程序void dlms(void); /声明延时程序 /主程序/void main(void) uchar i,j=0; P0=0x01; /进制转换开关置1 P1=0X00; P2=0X00
5、; while(1) key=kbscan(); if(P0=0x00) /如果进制转换开关置按下 sljzxs(second);/显示进制数 second=0;/传送值清 if(key=10&key=0&key=9) /如果KEY在到之间,证明键盘按下的是数值 if(op=0) if(second) second=second*10+key; display(second); key=16; dlms(); if(key=14) /如果KEY位时,证明键盘按下的是C/ON键 display(0); P2=0x20; P1=0x3f; first=0; /清,回复初始状态 second=0;
6、op=0; result=0; preop=20; key=16; if(key=15) /如果KEY位为时,证明键盘按下的是=键 op=key; yunsuan(); dlms(); second=0; op=0; preop=55; key=16; for(i=0;i0)/直到k=0停止循环 n=k%16;/取最低位 P1=zixingn;/显示低位 k=k/16;/去掉最低位 r=P2=(r1);/左移一位 P1=0x00;/移位后会再送数,所以要置 while(P0=0x00);/等待按键放开 /四则运算/void yunsuan(void) if(op!=0) switch(preo
7、p) case 10: result=first+second; first=result; display(result); preop=op; op=0; second=0; break; case 11: result=first-second; first=result; display(result); preop=op; op=0; second=0; break; case 12: result=first*second; first=result; display(result); preop=op; op=0; second=0; break; case 13: result
8、=first/second; first=result; display(result); preop=op; op=0; second=0; break; case 20: preop=op; first=second; second=0; op=0; break; default: preop=op; second=0; op=0; break; /延时程序/void dlms(void) uchar i; for(i=0;i250;i+)/键盘扫描程序/uchar kbscan(void) uchar p,a,n;/无符号数 P3=0xf0;/高位置高,低位置低 if(P3&0xf0)!
9、=0xf0) /有按键则高位不全为 dlms();/延时以防干扰 if(P3&0xf0)!=0xf0)/确实有按键 p=0xfe; / p= 1111 1110从第行开始扫描 while(p&0x10)!=0)/当第位为时停止循环扫描,此时已扫描行 P3=p; /装入行扫描值 if(P3&0xf0)!=0xf0)/如果此行有按键,接下去获取键值 a=P3; /P口值送置a /键码对应的数值 if(a=0xde)n=8;/1行列为 if(a=0xed)n=4;/2行列为 if(a=0xdd)n=5;/2行列为 if(a=0xbd)n=6;/2行列为 if(a=0xeb)n=1;/3行列为 if(
10、a=0xdb)n=2;/3行列为 if(a=0xbb)n=3;/3行列为 if(a=0xe7)n=14;/4行列为on if(a=0xd7)n=0;/4行列为 if(a=0xb7)n=15;/4行列为= if(a=0x7e)n=13; if(a=0x7d)n=12; if(a=0x7b)n=11;/3行列为- if(a=0x77)n=10;/4行列为+ if(a=0xee)n=7;/1行列为 if(a=0xbe)n=9;/1行列为 while(P3&0xf0)!=0xf0);/等待按键放开 return(n);/返回键值 else /不在第行,左移继续扫描 p=(p=10|k-99999) /
11、最高位大于,显示错误 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) P1=0x00; P2=0xff; P2=0x01; P1=0x40; P2=0x20; k=-k; while(k0) buf2=k%10; P1=zixingbuf2; for(i=0;i1); P2=r; P1=0x00; else P1=0x00; P2=0xff; P2=0x20; while(
12、k0) /由个位开始显示数值 buf2=k%10; P1=zixingbuf2; for(i=0;i1); P2=r; P1=0x00;/移位后会再送数,所以要置 四 结论1通过显示器的显示,.该计算器能够简单的四位数加减两位数乘除,输入的数通过键盘给出,能完好的显示要操作的数,并显示结果. 2.该计算器能实现十进制转十六进制,并能很好的显示出结果.本人设计部分负责十进制的显示1、 程序/显示程序/void display(uint temp) uint buf1,buf2,r,k,i; k=temp; r=0x20; P2=0x20; buf1=k/; if(buf1=10|k-99999)
13、 /最高位大于,显示错误 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) /显示负数 P1=0x00; P2=0xff; P2=0x01; P1=0x40; P2=0x20; k=-k; while(k0) buf2=k%10; P1=zixingbuf2; for(i=0;i1); P2=r; P1=0x00; else P1=0x00; P2=0xff; P2=0x20
14、;while(k0) /由个位开始显示数值 buf2=k%10; P1=zixingbuf2; for(i=0;i1); P2=r; P1=0x00;/移位后会再送数,所以要置 k赋值要显示的数2、程序流程图判断是否超出显示范围 N判断是否为负数 Y显示错误 Y N从低位开始显示显示负号,并对k取反从低位开始显示3、测试结果:能够正常的显示十进制数的显示,4、遇到问题:实践经验不够,知识不够解决问题需花较多时间;如何才能让各个LED管把多位数正常的显示出来5、如何解决:自己分析、查阅相关资料,与老师同学一起讨论;利用静态显示方法,用74LS373锁存,利用变量r值的变化赋予P2口不同的值来控制不同的LED管显示,从低位到高位逐渐显示。五、参考文献c语言程序设计(清华大学出版社),单片机原理及接口技术(北京航空航天大学出版社)专心-专注-专业