基于单片机的计算器的论文.docx
- 文档编号:3982381
- 上传时间:2022-11-26
- 格式:DOCX
- 页数:36
- 大小:205.63KB
基于单片机的计算器的论文.docx
《基于单片机的计算器的论文.docx》由会员分享,可在线阅读,更多相关《基于单片机的计算器的论文.docx(36页珍藏版)》请在冰豆网上搜索。
基于单片机的计算器的论文
1.2.2.5、键盘设计方案与选择
方案一:
独立键盘。
独立键盘为一端接地,另一端接I/O口,并且要接上拉电阻。
这种键盘的硬件都很容易实现,但每一个按键就要用一个I/O口,非常的浪费单片机的I/O口资源,不适合本次设计。
方案二:
4*4矩阵式键盘。
其电路图如图图1-5所示,这种键盘的硬件简单,使用的I/O口也不多,而且这种键盘的编程方法已很成熟。
所以本次设计采用这种矩阵式键盘。
其电路图如图
图1-5、4*4矩阵式键盘电路图
1.2.3、系统组成
经过方案比较与论证,最终确定的系统组成框图如图1-6所示。
其中单片机作为主控设备对采集输入信号后并进行处理,最后通过输出设备输出给使用者。
,该系统的结构框图如图。
图1-6、系统组成方框图
2.1.5、单片机时钟电路
时钟电路用于产生单片机工作所需要的时钟信号,单片机本身就是一个复杂的同步时序电路,为了保证同步工作方式的实现,电路应在唯一的时钟信号控制下严格地按时序进行工作。
在MCS-51芯片内部有一个高增益反相放大器,其输入端为芯片引脚X1,输出端为引脚X2,在芯片的外部跨接晶体振荡器和微调电容,形成反馈电路,就构成了一个稳定的自激振荡器。
此电路采用12MHz的石英晶体。
时钟电路如下图2-2:
图2-2时钟电路
2.1.6、单片机复位电路
复位是单片机的初始化操作,其主要功能是把PC初始化为0000H,使单片机从0000H单元开始执行程序。
除了进入系统的正常初始化之外,当由于程序运行出错或操作错误是系统处于死锁状态时,为摆脱困境,也需要按复位键以重新启动。
RST引脚是单片机复位信号的输入端,复位信号是高电平有效,其有效时间应持续24个振荡周期(即2个机器周期)以上,若使用频率为12MHz的晶振,则复位信号持续时间应超过4
s才能完成复位操作。
复位操作有上电自动复位和按键手动复位两种方式。
上电自动复位是通过外部复位电路的电容充电来实现的。
按键电平复位是通过使复位端经电阻与Vcc电源接通而实现的。
在本设计中采用了按键电平复位方式,其复位电路如下图2-3。
图2-3、复位电路
2.1.7、单片机下载口电路
下载口电路以一块74HC373芯片为主,电路原理图如图2-4所示。
由于电路中只用了一片74HC373所以完全可以把电路装在DB25插针式并口插头内部,这个可以做到很小巧,可以很方便的使用。
为了稳定也可以芯片外围加一些电阻、电容等元件,具体电路网上有提供下载。
光是做好下载线是不行的,S51系统的ISP下载方式还要求要下载程序单片机运行在最小化系统中。
只要把的相应引脚连接起来就可以对S51进行ISP下载了。
要接的引线是S51的6,7,8,9,20,40引脚。
晶振可以在3M-24M间选用,当然是看你的目标板而选择。
为了方便使用我们需要做一个下载头,电路简单接线正确的话一般无需要调整就可以正常使用,如有问题可以用软件中的IspTest.exe(下载线调试程序)
检查你的74HC373芯片是否正常和你的电脑并口是否正常。
图2-4、下载口电路原理图
三、程序流程图
主程序流程图
显示程序流程图
键扫程序流程图
3.1、程序清单
程序清单见附录4。
产品使用说明
该产品16个按键作为输入信号,液晶为显示器,按键功能如下图所示。
0~9为数字键,其中0~3有第二功能,一个小数点键,一个等号键,该键为四功能键,四个运算符号键。
通电后显示器显示万年历、星期和脑钟,此时按0键可进行校时,可看到时钟已停,并且秒在闪烁,此时按1键可使秒加一,按2键可使秒减一,把秒设定好后,再按0键,秒停止闪烁,分开始闪烁,此时按1键和2键同样可对分进行修改,然后依次时、日、月、年、以及闹钟的秒、分、时进行修改,然后再按0键时钟恢复走时,万年历和闹钟的校准就完成啦。
如果要使用计算器功能,则直接按3键即可进入计算器模式,等号键单键为“=”,双键为清除,默认计算类型为加减乘除,若要进行其他类型的计算,则可使用等号键三键,然后选择运算类型进行运算,此时符号键所对应的运算符号也有相应的变化。
该计算器的计算功能可实现加减乘除、正弦余弦正切余切、反正弦反余弦反正切反余切、平方、立方、m的k次方(m和k均由键盘输入)、e为底的m次方、自然对数、常用对数、开平方根。
可谓功能齐全,操作简单,给使用带来极大方便。
设计体会
在这次设计中使我对步进机有了更深的了解,对单片机也有了更高成次的了解,单片机的种类多,而型号杂,也是我们学习中的困难,所以就MCS—51系列的产品来说,就是一个典型的学习方法。
单片机编程是用汇编语言进行编程,也就需要我们对电路的分析,然后总结,查阅相关资料才能变成好的程序,编程讲究的是多动手写,自己写,用自己的思路,不怕写错,写错再改,懂得有新的思想这样才能提高。
在这次单片机应用系统设计中遇到到很大的困难,主要原因是平时的知识掌握的不够,通过查阅很多资料和类似的论文,才做成的。
以前也做过不少单片机设计,但面对这次设计,似乎也有一点束手五册了。
在这次的设计中,让我们发自内心的明白了以下这几个道理。
其实,这几个道理以前我们就懂,就知道,甚至每个人都知道,但真正到了关键时间,我们还会不会遵循它来办事就是一个问号啦。
书读百遍,其义自现。
三个臭皮匠胜过一个诸葛亮。
团结就是力量。
温故而知新。
正因为我开始没有遵循这几个道理所以在设计中走了不少弯路,表现出来了我很多的不足之处,就因为这样我们才会在这次设计中有进步、有发展,同时使自己的能力得到进一步的提升。
我将好好地记录下这次设计的点点滴滴,我想,这不单是我的经历,更是我的一笔财富。
参考文献
(1)李广弟《单片机原理及应用》北京航天航空大学出版社2008.2
(2)潘新民《微型计算机控制技术》电子工业出版社2008.5
(3)梅丽凤《单片机原理及接口技术》清华大学出版社2004.6
(4)李陪金《C语言程序设计案例教程》西安电子科技大学出版社2008.1
(5)戴佳《51单片机C语言应用程序设计实例精讲》电子工业出版社2006.4
(6)谭浩强《C程序设计》清华大学出版社
附录1、元器件清单
名称
型号
参数
数量
单片机
AT89S52
2
液晶
SBY12864Z-ZK3
一块
双12V变压器
1
发光二极管
LED
3
二极管
IN4001
8
三极管
9013,9014
4,8
稳压管
7805
1
排阻
10K*8
1
电阻
若干
晶振
11.0592MHz
1
下载口
1
电源接口
1
电解电容
100μf
470μf
1
4
电容
104
30
0.1μf
30pf
4
4
插座
单片机插座
所存器插座
40引脚,
24引脚
2
1
开关
1
按键
普通按键
12
排针排座
若干
附录2、系统原理图
原理图
附录3、程序清单
#include
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineulongunsignedlong
sbitrs=P2^0;
sbitrw=P2^1;
sbiten=P2^2;
sbitpsb=P2^3;
sbitret=P2^5;
sbitrd=P3^7;
sbits=P1^0;
sbits1=P1^4;
sbits2=P1^5;
sbits3=P1^6;
sbits4=P1^7;
ucharcount,s1num;
unsignedintnin,ss;
charyue,re,qi,shi,fen,miao;
uchardshi,dfen,dmiao,ling,aa,t1,p;
ucharcommand,data0,data1,data2,com0,j,l;
unsignedcharcommand,data1,data2,com0,bb,bb0,aa,cc,i,yun;//
ucharlcdH,lcdL,key;
floatds,m,k;
ulongds0;
bitflag,flag1,flag2,flag3,flag4;
uchardisbuf[9]={0};//定义显示缓冲区//
ucharcodetable[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x2e};
ucharcodetable1[]={0xc8,0xd5,0xd2,0xbb,0xb6,0xfe,0xc8,0xfd,0xcb,0xc4,0xce,0xe5,0xc1,0xf9};//日~六//
ucharcodetable2[]={0x32,0x30,0x30,0x39,0xc4,0xea,0x30,0x35,0xd4,0xc2,0x30,0x31,0xc8,0xd5};//年月日//
ucharcodetable4[]={0xd0,0xc7,0xc6,0xda,0xc1,0xf9};//星期六//
ucharcodetabping[]={32,29,32,31,32,31,32,32,31,32,31,32};
ucharcodetabrun[]={32,30,32,31,32,31,32,32,31,32,31,32};
ucharcodexing1[]={3,6,0,3,5,1,3,6,2,4,0,2};
ucharcodexing2[]={4,0,0,3,5,1,3,6,2,4,0,2};
ucharxing[12]={0};
uchartab[12]={0};
//延时//
voiddelay(uintms)//延时250us
{
uchari;
while(ms--)
{
for(i=0;i<125;i++);
}
}
//LCD初始化//
voidlcd_int()
{
ret=0;
delay(3);
ret=1;
_nop_();
psb=1;//将PSB置1,通信方式为8BIT数据并口//
_nop_();
}
//写指令程序//
voidwrite_command(ucharcommand)
{
delay(3);
rs=0;
rw=0;
P0=command;
en=1;
_nop_();
_nop_();
en=0;
}
//写数据程序//
voidwrite_data(uchardata0)
{
delay(3);
rs=1;
rw=0;
P0=data0;
en=1;
_nop_();
_nop_();
en=0;
}
//LCD功能设置//
voidlcd_set()
{
command=0x30;//基本指令集//
write_command(command);
command=0x01;
write_command(command);
command=0x06;
write_command(command);
command=0x0c;
write_command(command);
}
//清屏程序//
voidclear_lcd()
{
command=0x01;
write_command(command);
command=0x34;
write_command(command);
command=0x30;
write_command(command);
}
voiddisplay()
{
command=com0;
write_command(command);
data2=lcdH;
write_data(data2);
data1=lcdL;
write_data(data1);
}
voiddisplay1(uchary,ucharx,uchar*p)
{
switch(y)
{
case1:
write_command(0x7f+x);break;//液晶第一行
case2:
write_command(0x8f+x);break;//0x90+(x-1)
case3:
write_command(0x87+x);break;
case4:
write_command(0x97+x);break;
default:
break;
}
while(*p)
write_data(*p++);
}
voidxiaoshu()//先判断k是否为小数,如果k为小数,就将k转化为小数//
{
uchari;
uintmg=1;
if(flag1)
{
for(i=0;i k=k/(mg*1.0); } cc=0; flag1=0; } //键扫描程序// ucharkeyscan() {ucharscancode,tmpcode; P1=0xf0;//行全为0 if((P1&0xf0)! =0xf0)//有键按下 {delay(100);//延时去抖动 if((P1&0xf0)! =0xf0)//判是否真的有键按下 {scancode=0xfe;//诼行扫描 while((scancode&0x10)! =0) {P1=scancode; if((P1&0xf0)! =0xf0)//本行有键按下 {tmpcode=(P1&0xf0)|0x0f; //返回特征字节码,为1的位即对应于行和列 return((~scancode)+(~tmpcode)); } elsescancode=(scancode<<1)|0x01;//行扫描码左移一位 } } } return(0);//无键按下,返回值为0 } disjia() { com0=0x83;lcdH=0xbc;lcdL=0xd3;display(); com0++;lcdH=0xb7;lcdL=0xa8;display(); com0=0x87; } disjian() { com0=0x83;lcdH=0xbc;lcdL=0xf5;display(); com0++;lcdH=0xb7;lcdL=0xa8;display(); com0=0x87; } discheng() { com0=0x83;lcdH=0xb3;lcdL=0xcb;display(); com0++;lcdH=0xb7;lcdL=0xa8;display(); com0=0x87; } dischu() { com0=0x83;lcdH=0xb3;lcdL=0xfd;display(); com0++;lcdH=0xb7;lcdL=0xa8;display(); com0=0x87; } voidjishu()//把ds0处理后放入显示缓冲区中// { disbuf[0]=ds0/1000000000%10; disbuf[1]=ds0/100000000%10; disbuf[2]=ds0/10000000%10; disbuf[3]=ds0/1000000%10; disbuf[4]=ds0/100000%10; disbuf[5]=ds0/10000%10; disbuf[6]=ds0/1000%10; disbuf[7]=ds0/100%10; disbuf[8]=ds0/10%10; disbuf[9]=ds0%10; } voiddisds() { uchari; com0=0x98; for(i=0;i<10;i++) { if(i%2==0){com0++;write_command(com0);} write_data(table[disbuf[i]]); } flag=0; com0=0x88;lcdH=0x20;lcdL=0x20; for(i=0;i<16;i++){display();com0++;} com0=0x87; } zhixing()//计算// { xiaoshu(); if(bb0==1) { switch(bb) { case1: ds=m+k;m=ds;k=0;break; case2: ds=m-k;m=ds;k=0;break; case3: ds=m*k;m=ds;k=0;break; case4: ds=m/k;m=ds;k=0;break; default: break; } } elseif(bb0==2) { switch(bb) { case1: m=m*3.1415926536;m=m/180.0;ds=sin(m);break; case2: m=m*3.1415926536;m=m/180.0;ds=cos(m);break; case3: m=m*3.1415926536;m=m/180.0;ds=tan(m);break; case4: m=m*3.1415926536;m=m/180.0;ds=1.0/tan(m);break; default: break; } } elseif(bb0==3) { switch(bb) { case1: ds=asin(m);ds=ds*180.0;ds=ds/3.1415926536;break; case2: ds=acos(m);ds=ds*180.0;ds=ds/3.1415926536;break; case3: ds=atan(m);ds=ds*180.0;ds=ds/3.1415926536;break; case4: ds=1.0/atan(m);ds=ds*180.0;ds=ds/3.1415926536;break; default: break; } } elseif(bb0==4) { switch(bb) { case1: ds=m*m;break;//平方// case2: ds=m*m*m;break;//立方/// case3: ds=1;for(i=0;i case4: ds=exp(m);break;//e的m次方// default: break; } } elseif(bb0==5) { switch(bb) { case1: ds=log(m);break;//自然对数// case2: ds=log10(m);break;///常用对数// case3: ds=sqrt(m);break;//开方// default: break; } } if(ds<0)display1(4,1,"-");elsedisplay1(4,1,"+"); if(ds>4294967295) { clear_lcd();display1(1,3,"得数大于");display1(2,2,"二的三十二次方");display1(4,2,"请你按复位键");delay(65000); } ds0=ds; if((ds>ds0)) { if(ds<1000){ds0=ds*1000000;jishu();disbuf[9]=disbuf[8];disbuf[8]=disbuf[7];disbuf[7]=disbuf[6];disbuf[6]=disbuf[5];disbuf[5]=disbuf[4];disbuf[4]=10;} elseif(ds<10000){ds0=ds*100000;jishu();disbuf[9]=disbuf[8];disbuf[8]=disbuf[7];disbuf[7]=disbuf[6];disbuf[6]=disbuf[5];disbuf[5]=10;} elseif(ds<100000){ds0=ds*10000;jishu();disbuf[9]=disbuf[8];disbuf[8]=disbuf[7];disbuf[7]=disbuf[6];disbuf[6]=10;} elseif(ds<1000000){ds0=ds*1000;jishu();disbuf[9]=disbuf[8];disbuf[8]=disbuf[7];disbuf[7]=10;} elseif(ds<10000000){ds0=ds*100;jishu();disbuf[9]=disbuf[8];disbuf[8]=10;} } elsejishu(); disds(); } voidjiemian1() { display1(1,1,"请按所选类型序号"); if(! yun) { display1(2,2,"0加减乘除"); display1(3,2,"1弦切值"); display1(4,2,"2反弦切值"); } elseif(yun==1) { display1(2,2,"1弦切值"); display1(3,2,"2反弦切值"); display1(4,2,"3幂运算"); } else { display1(2,2,"2反弦切值"); display1(3,2,"3幂运算"); display1(4,2,"4对数、开方运算"); } } voidjiemian2() { display1(2,3,"下面进行"); switch(bb0) { case1: display1(3,2,"加减乘除运算");break; case2: display1(3,2,"弦切值运算");break; case3: display1(3,2,"反弦切值运算");break; case4: display1(3,2,"幂运算"); case5:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 计算器 论文