电子系统课程设计基于STC51单片机的计算器_第1页
电子系统课程设计基于STC51单片机的计算器_第2页
电子系统课程设计基于STC51单片机的计算器_第3页
电子系统课程设计基于STC51单片机的计算器_第4页
电子系统课程设计基于STC51单片机的计算器_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

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

文档简介

1、电子系统课程设计设计题目: 基于stc51单片机的计算器学院:信息科学与技术学院专业:电子信息科学与技术指导老师:小组成员: 日期:2011年11月一、确定计算器完成的功能1. 整数加减乘除法。2. 小数的除法。3. 矩阵键盘输入指令。4. 每按一次键蜂鸣器发声一次。5. 计算结果显示。 二、系统方案设计与论证使用单片机stc51完成计算器的加减乘除法运算,并且显示结果。1.各模块方案设计 1.1 单片机的选择 要求单片机完成简单的整数加减乘除法、处理4*4矩阵键盘的输入数据、控制显示器件显示输入的数据与运算的结果、控制蜂鸣器的发音。 根据单片机完成的功能对单片机的处理速度要求不高,且考虑到经

2、济效益,决定使用stc51单片机。1.2单片机最小系统 1.2.1 晶振选择24mhz,使stc51单片机速度跟快,并且价格和12mhz差不多。 1.2.2 为了防止单片机程序进入死循环而出不来,增加一个复位键。1.3 显示器件的选择 方案一、使用12864作为显示设备,但是考虑到计算器只要求显示数字,使用12864太浪费,且价格比较贵,不予选用。 方案二、使用1602作为显示设备。相比12864这个器件比较便宜,且能显示数字和一些字符,能完成要求功能。 方案三、使用数码管作为显示设备。数码管能显示数字和一些特殊字符,而且计算器要求的显示器件能显示数字和一些特殊字符。所以数码管能完成我们的要求

3、显示要求,并且数码管是最便宜的。 综上所述我们选择性价比最高的数码管作为显示器件。1.4 输入设备的选择 计算器要求输入的数据有(0,1,2,3,4,5,6,7,8,9,*,/,+,-,=,clear),共16个。输入数据不多,最后选择4*4的矩阵键盘作为输入设备。1,5 声音信号 现实中使用的计算器每按下一次键盘,就会发出声音。因此设计的计算器应该要求每按下一次键盘就发声一次。发声设备使用蜂鸣器就能完成要求。三、实际电路的设计 1. 单片机最小系统与复位电路 1.1 单片机最小系统是指用最少的元器件组成的单片机可以工作的系统。 1.2 31脚(ea/vpp),当接高电平时,单片机在复位后从内

4、部rom的0000h开始执行;当接低电平时,复位后后直接从外部rom的0000h开始执行。我们只使用的单片机内部的rom区,所以31脚(ea/vpp)应接高电平。 1.3 复位电路: 由电容串联电阻构成,由图并结合电容电压不能突变的性质,可以知道,当系统一上电,rst脚将会出现高电平,并且,这个高电平持续的时间由电路的rc值来决定.典型的51单片机当rst脚的高电平持续两个机器周期以上就将复位,所以,适当组合rc的取值就可以保证可靠的复位.2.蜂鸣器电路三极管主要是做驱动用的。因为单片机的io口驱动能力不够让蜂鸣器发出声音,所以我们通过三极管放大驱动电流,从而可以让蜂鸣器发出声音,你要是输出高

5、电平,三极管导通,集电极电流通过蜂鸣器让蜂鸣器发出声音,当输出低电平时,三极管截止,没有电流流过蜂鸣器,所以就不会发出声音。 3.数码管显示电路5位8段共阳极数码管动态显示原理:每一位都是将8个发光二极管(下面简称led)的正极接在一块,就有5个正极,接上5个io口,这个就是位选,相应io口输出高电平电平算是选通该位。相同字段led的负极连在一起,也有八根线,接上8个io口,这就是段选,相应io口输出低电平算是选通该段。一般情况下5个位选只有一个选通,8个段选如果是数字2,那么选通的那一位数码管就会显示2,其它位数码管都是黑的。延迟一段再熄灭它,再选通另一位显示在那一位该显示的数字,延迟一段再

6、熄灭,如此循环,人眼有暂留效应,只要足够快人眼看起来就是几个数字稳定地显示在5位数码管上。如果直接用单片机控制数码管的共阳极,数码管发光很弱,所以用三极管在增加驱动。如下图连接。 数码管接法如下图:4.4*4矩阵键盘 4.1 矩阵键盘原理在键盘中按键数量较多时,为了减少i/o口的占用,通常将按键排列成矩阵形式,如图所示。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样,一个端口(如p1口)就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。由

7、此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。4.2 矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些,上图中,列线通过电阻接正电源,并将行线所接的单片机的i/o口作为输出端,而列线所接的i/o口则作为输入。这样,当按键没有按下时,所有的输入端都是高电平,代表无键按下。行线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。4.3 行列扫描法原理: 第一步, 使行线为编程的输入线,列线是输出线,拉低所有的列线, 判断行线的变化,如果有按键按下,按键按下的对应行线被拉低,否则 所有的行线都为高电平。第二步, 在第一步判断有键按下后

8、, 延时 10ms 消除机械抖动,再次读取行值,如果此行线还处于低电平状态则进入下 一步,否则返回第一步重新判断。第三步,开始扫描按键位置,采用逐 行扫描,每间隔 1ms 的时间,分别拉低第一列,第二列,第三列,第四 列,无论拉低哪一列其他三列都为高电平,读取行值找到按键的位置, 分别把行值和列值储存在寄存器里。第四步,从寄存器中找到行值和列 值并把其合并,得到按键值,对此按键值进行编码,按照从第一行第一 个一直到第四行第四个逐行进行编码,编码值从“0000” 至“1111” , 再进行译码,最后显示按键号码。 4.4 有键按下时,就进入中断,在中断中判断按键与要显示的数。原理图如下:四、系统

9、软件设计软件流程:结束开始系统初始化,开键盘扫描中断(into)有无键按下no进入中断服务程序循环显示关中断;蜂鸣器发音一下,关掉键盘扫描判断键盘是哪个键按下按键是否释放yesno键值处理按下的是什么键完成对用的功能。并把结果送数码管待显示数据区返回中断服务函数调用处数码管动态显示显示数码管动态数据显示区的数据有中断yes五、附件 1. 原理图 2. 程序/*计算器的设计(简单版)*/*/*作品功能:能完成简单的整数加减乘除法,除法的小数位不显示(舍去)*/*输入最大能输入五位数据;且能正常的显示五位数结果,超过五位结果不信任*/*/*制作时间:2011年11月08号*/*/*/*所用头文件*

10、/#include #include #define uchar unsigned char#define uint unsigned int/*单片机各个口的定义*/#define key_data p1#define duan p2sbit wei_1= p33;sbit wei_2= p34;sbit wei_3= p35;sbit wei_4= p36;sbit wei_5= p37;sbit wei_6= p31;sbit beep = p30;/*一些寄存器的设计*/uchar keyno; /键盘值uchar duan_1; /段选中间值uchar x; /控制小数点的显示uch

11、ar data data_count5=0,0,0,0,0; /只能用09uchar data data_use5=0,0,0,0,0;/显示数组uchar scode,kcode,i1,k;/检查键盘的值所用寄存器uchar key_value=/键盘值 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16;uchar key_count;long add,cut,multiply,divide,divide_1; /加减乘除的计算结果long data_qian5=0,0,0,0,0; /第一次输入的结果,存入这里面long data_hou5=0,0,0,0,

12、0; /被加数,乘数,除数,被减数,放入这里面long count1,count2;uchar key_control; uchar asd;uchar operation_select,operation_select_1;uchar mn; /控制只进行除法运算,一次完后必须复位,/*/*函数的定义*/void delay(uint masd);void display();void duan_selct();void beep();void keys_scan();void key_decide();void jia();void jian();void cheng();void chu

13、();void fuzhi();void keybord(uchar a);void delayms(uint ms);/*/*主函数*/*/main() key_data=0x0f; p3=0xff; ex0=1;/开外部中断0 it0=0;/外部中断0选用电平触发方式 px0=1;/外部中断0为高级中断源 wei_6=0; ea=1;/开总中断 beep=1; while(1) p1=0x0f; /data_count0=key_valuekeyno;/位115的值 display(); /*/*/*/*函数功能:外部中断0的终段服务函数,外部中断判断按键*/*/*/ void key_i

14、nt() interrupt 0 delayms(1); ea=0;beep=0;p1=0xf0;/if(p1!=0xf0)/key_data=0xf0;/beep();keys_scan();p1=0xf0;while(p1!=0xf0);p1=0x0f;delay(1);key_decide();beep=1; ea=1;/ea=1;/*、/*函数功能:确定每一个按键的功能(09数值),10加;11减;12乘;13除;14等于;15:清除*/*/*/void key_decide() switch(key_valuekeyno) case 0: keybord(0); break; cas

15、e 1: keybord(1); break; case 2: keybord(2); break; case 3: keybord(3); break; case 4: keybord(4); break; case 5: keybord(5); break; case 6: keybord(6); break; case 7: keybord(7); break; case 8: keybord(8); break; case 9: keybord(9); break; case 10: operation_select=1; if(key_control=0) asd=0; data_q

16、ian4=data_use4; data_qian3=data_use3; data_qian2=data_use2; data_qian1=data_use1; data_qian0=data_use0; data_use0=0; data_use1=0; data_use2=0; data_use3=0; data_use4=0; key_control=1; else if(key_control=1) data_hou4=data_use4; data_hou3=data_use3; data_hou2=data_use2; data_hou1=data_use1; data_hou0

17、=data_use0; if(operation_select_1=1) jia(); else if(operation_select_1=2) jian(); else if(operation_select_1=3) cheng(); else if(operation_select_1=4) chu(); operation_select_1=1; break; case 11:operation_select=2; if(key_control=0) asd=0; data_qian4=data_use4; data_qian3=data_use3; data_qian2=data_

18、use2; data_qian1=data_use1; data_qian0=data_use0; data_use0=0; data_use1=0; data_use2=0; data_use3=0; data_use4=0; key_control=1; else if(key_control=1) data_hou4=data_use4; data_hou3=data_use3; data_hou2=data_use2; data_hou1=data_use1; data_hou0=data_use0; if(operation_select_1=1) jia(); else if(op

19、eration_select_1=2) jian(); else if(operation_select_1=3) cheng(); else if(operation_select_1=4) chu(); operation_select_1=2; break; case 12: operation_select=3; if(key_control=0) asd=0; data_qian4=data_use4; data_qian3=data_use3; data_qian2=data_use2; data_qian1=data_use1; data_qian0=data_use0; dat

20、a_use0=0; data_use1=0; data_use2=0; data_use3=0; data_use4=0; key_control=1; else if(key_control=1) data_hou4=data_use4; data_hou3=data_use3; data_hou2=data_use2; data_hou1=data_use1; data_hou0=data_use0; if(operation_select_1=1) jia(); else if(operation_select_1=2) jian(); else if(operation_select_

21、1=3) cheng(); else if(operation_select_1=4) chu(); operation_select_1=3; break; case 13: operation_select=4; if(key_control=0) asd=0; data_qian4=data_use4; data_qian3=data_use3; data_qian2=data_use2; data_qian1=data_use1; data_qian0=data_use0; data_use0=0; data_use1=0; data_use2=0; data_use3=0; data

22、_use4=0; key_control=1; mn=1; else if(key_control=1) data_hou4=data_use4; data_hou3=data_use3; data_hou2=data_use2; data_hou1=data_use1; data_hou0=data_use0; data_use4=0; data_use3=0; data_use2=0; data_use1=0; data_use0=0; if(operation_select_1=1) jia(); else if(operation_select_1=2) jian(); else if

23、(operation_select_1=3) cheng(); else if(operation_select_1=4) chu(); operation_select_1=4; break; case 14: data_hou4=data_use4; data_hou3=data_use3; data_hou2=data_use2; data_hou1=data_use1; data_hou0=data_use0; if(operation_select=1) jia(); else if(operation_select=2) jian(); else if(operation_sele

24、ct=3) cheng(); else if(operation_select=4) chu(); data_use4=data_count0; data_use3=data_count1; data_use2=data_count2; data_use1=data_count3; data_use0=data_count4; key_control=0; break; case 15: data_use4=0; data_use3=0; data_use2=0; data_use1=0; data_use0=0; data_count4=0; data_count3=0; data_coun

25、t2=0; data_count1=0; data_count0=0; data_qian4=0; data_qian3=0; data_qian2=0; data_qian1=0; data_qian0=0; data_hou4=0; data_hou3=0; data_hou2=0; data_hou1=0; data_hou0=0; operation_select=0; asd=0; keyno=0; duan_1=0; scode=0; kcode=0; i1=0; k=0; key_count=0;add=0; cut=0; multiply=0; divide=0; key_co

26、ntrol=0; x=0; break; case 16: _nop_(); break; default: _nop_(); /*/*函数功能:数码管显示*/*/*/ void display() uchar i; for(i=0;i400;i+) / wei_1=1;wei_2=0;wei_3=0;wei_4=0;wei_5=0; wei_1=0;wei_2=1;wei_3=1;wei_4=1;wei_5=1; /个位,第一位 duan_1=data_use0;duan_selct();if(x=1) duan = duan + 0x80;delay(20); /wei_1=0;wei_2

27、=1;wei_3=0;wei_4=0;wei_5=0; wei_1=1;wei_2=0;wei_3=1;wei_4=1;wei_5=1;/十位,第二位 duan_1=data_use1;duan_selct();if(x=2) duan = duan + 0x80;delay(20); / wei_1=0;wei_2=0;wei_3=1;wei_4=0;wei_5=0; wei_1=1;wei_2=1;wei_3=0;wei_4=1;wei_5=1;/百位,第三位 duan_1=data_use2;duan_selct();if(x=3) duan = duan + 0x80;delay(20

28、); /wei_1=0;wei_2=0;wei_3=0;wei_4=1;wei_5=0; /千位,第四位 wei_1=1;wei_2=1;wei_3=1;wei_4=0;wei_5=1; duan_1=data_use3;duan_selct();if(x=4) duan = duan + 0x80;delay(20); /wei_1=0;wei_2=0;wei_3=0;wei_4=0;wei_5=1; /万位,第五位 wei_1=1;wei_2=1;wei_3=1;wei_4=1;wei_5=0; duan_1=data_use4;duan_selct();if(x=5) duan = du

29、an + 0x80;delay(20); /*/*函数功能:数码管段选*/*/*/ void duan_selct() switch(duan_1) case 0: duan=0xc0;break; case 1: duan=0xf9;break; case 2: duan=0xa4;break; case 3: duan=0xb0;break; case 4: duan=0x99;break; case 5: duan=0x92;break; case 6: duan=0x82;break; case 7: duan=0xf8;break; case 8: duan=0x80;break;

30、case 9: duan=0x90;break;/ case 10:duan=0x88;break; a/ case 11:duan=0x83;break; b/ case 12:duan=0xc6;break; c/ case 13:duan=0xa1;break; d/ case 14:duan=0x86;break; e/ case 15:duan=0x8e;break; f/ case 16:duan=0x00;break; 0default: duan=0x86; /如果计算结果超过五位,最高位显示e,表示结果是不可信的, /*/*/*函数功能:蜂鸣器*/*/*/void beep(

31、) uint i;for(i=0;i1000;i+) beep =0;delayms(1);beep = 1;/*/*/*加减乘除运算*/*/*函数功能:赋值运算*/*/void fuzhi() data_qian0=data_count4; data_qian1=data_count3; data_qian2=data_count2; data_qian3=data_count1; data_qian4=data_count0; asd=0; data_use0=data_count4; data_use1=data_count3; data_use2=data_count2; data_u

32、se3=data_count1; data_use4=data_count0;/*/*函数功能:加法运算*/*/void jia() count1 =data_qian4*10000 + data_qian3*1000 + data_qian2*100 + data_qian1*10 + data_qian0*1; count2 =data_qian4*10000 + data_hou3*1000 + data_hou2*100 + data_hou1*10 + data_hou0*1; add = count1 + count2; data_count0=add/10000; data_co

33、unt1=add/1000%10; data_count2=add/100%10; data_count3=add%100/10; data_count4=add%10; fuzhi();/*/*函数功能:减法运算*/*/void jian() count1 =data_qian4*10000 + data_qian3*1000 + data_qian2*100 + data_qian1*10 + data_qian0*1; count2 =data_hou4*10000 + data_hou3*1000 + data_hou2*100 + data_hou1*10 + data_hou0*1

34、; cut = count1 - count2; data_count0=cut/10000; data_count1=cut/1000%10; data_count2=cut/100%10; data_count3=cut%100/10; data_count4=cut%10; fuzhi();/*/*函数功能:乘法运算*/*/void cheng() count1 =data_qian4*10000 + data_qian3*1000 + data_qian2*100 + data_qian1*10 + data_qian0*1; count2 =data_hou4*10000 + data_hou3*1000 + data_hou2*100 + data_hou1*10 + data_hou0*1; multiply = count1 * count2; data_count0=multiply/10000; data_count1=multiply/1000%10; data_count2=multiply/100%10; data_count3=multiply%100/10; data_count4=multiply%10; fuzhi

温馨提示

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

最新文档

评论

0/150

提交评论