电子系统课程设计17805638.docx

上传人:b****6 文档编号:4755781 上传时间:2022-12-08 格式:DOCX 页数:28 大小:210.88KB
下载 相关 举报
电子系统课程设计17805638.docx_第1页
第1页 / 共28页
电子系统课程设计17805638.docx_第2页
第2页 / 共28页
电子系统课程设计17805638.docx_第3页
第3页 / 共28页
电子系统课程设计17805638.docx_第4页
第4页 / 共28页
电子系统课程设计17805638.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

电子系统课程设计17805638.docx

《电子系统课程设计17805638.docx》由会员分享,可在线阅读,更多相关《电子系统课程设计17805638.docx(28页珍藏版)》请在冰豆网上搜索。

电子系统课程设计17805638.docx

电子系统课程设计17805638

电子系统课程设计

 

设计题目:

基于STC51单片机的计算器

 

学院:

信息科学与技术学院

专业:

电子信息科学与技术

指导老师:

余小平

小组成员:

何镇江200805020224

宋俊霖200805020212

廖海波200805020210

 

日期:

2011年11月

一、确定计算器完成的功能

1.整数加减乘除法。

2.小数的除法。

3.矩阵键盘输入指令。

4.每按一次键蜂鸣器发声一次。

5.计算结果显示。

二、系统方案设计与论证

使用单片机STC51完成计算器的加减乘除法运算,并且显示结果。

1.各模块方案设计

1.1单片机的选择

要求单片机完成简单的整数加减乘除法、处理4*4矩阵键盘的输入数据、控制显示器件显示输入的数据与运算的结果、控制蜂鸣器的发音。

根据单片机完成的功能对单片机的处理速度要求不高,且考虑到经济效益,决定使用STC51单片机。

1.2单片机最小系统

1.2.1晶振选择24MHZ,使STC51单片机速度跟快,并且价格和12MHZ差不多。

1.2.2为了防止单片机程序进入死循环而出不来,增加一个复位键。

1.3显示器件的选择

方案一、使用12864作为显示设备,但是考虑到计算器只要求显示数字,使用12864太浪费,且价格比较贵,不予选用。

方案二、使用1602作为显示设备。

相比12864这个器件比较便宜,且能显示数字和一些字符,能完成要求功能。

方案三、使用数码管作为显示设备。

数码管能显示数字和一些特殊字符,而且计算器要求的显示器件能显示数字和一些特殊字符。

所以数码管能完成我们的要求显示要求,并且数码管是最便宜的。

综上所述我们选择性价比最高的数码管作为显示器件。

1.4输入设备的选择

计算器要求输入的数据有(0,1,2,3,4,5,6,7,8,9,*,/,+,-,=,clear),共16个。

输入数据不多,最后选择4*4的矩阵键盘作为输入设备。

1,5声音信号

现实中使用的计算器每按下一次键盘,就会发出声音。

因此设计的计算器应该要求每按下一次键盘就发声一次。

发声设备使用蜂鸣器就能完成要求。

三、实际电路的设计

1.单片机最小系统与复位电路

1.1单片机最小系统是指用最少的元器件组成的单片机可以工作的系统。

1.231脚(EA/VPP),当接高电平时,单片机在复位后从内部ROM的0000H开始执行;当接低电平时,复位后后直接从外部ROM的0000H开始执行。

我们只使用的单片机内部的ROM区,所以31脚(EA/VPP)应接高电平。

1.3复位电路:

由电容串联电阻构成,由图并结合"电容电压不能突变"的性质,可以知道,当系统一上电,RST脚将会出现高电平,并且,这个高电平持续的时间由电路的RC值来决定.典型的51单片机当RST脚的高电平持续两个机器周期以上就将复位,所以,适当组合RC的取值就可以保证可靠的复位.

 

2.蜂鸣器电路

三极管主要是做驱动用的。

因为单片机的IO口驱动能力不够让蜂鸣器发出声音,所以我们通过三极管放大驱动电流,从而可以让蜂鸣器发出声音,你要是输出高电平,三极管导通,集电极电流通过蜂鸣器让蜂鸣器发出声音,当输出低电平时,三极管截止,没有电流流过蜂鸣器,所以就不会发出声音。

3.数码管显示电路

5位8段共阳极数码管动态显示原理:

每一位都是将8个发光二极管(下面简称LED)的正极接在一块,就有5个正极,接上5个IO口,这个就是位选,相应IO口输出高电平电平算是选通该位。

相同字段LED的负极连在一起,也有八根线,接上8个IO口,这就是段选,相应IO口输出低电平算是选通该段。

一般情况下5个位选只有一个选通,8个段选如果是数字2,那么选通的那一位数码管就会显示2,其它位数码管都是黑的。

延迟一段再熄灭它,再选通另一位显示在那一位该显示的数字,延迟一段再熄灭,如此循环,人眼有暂留效应,只要足够快人眼看起来就是几个数字稳定地显示在5位数码管上。

如果直接用单片机控制数码管的共阳极,数码管发光很弱,所以用三极管在增加驱动。

如下图连接。

数码管接法如下图:

4.4*4矩阵键盘

4.1矩阵键盘原理

在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式,如图所示。

在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。

这样,一个端口(如P1口)就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。

由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。

4.2矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些,上图中,列线通过电阻接正电源,并将行线所接的单片机的I/O口作为输出端,而列线所接的I/O口则作为输入。

这样,当按键没有按下时,所有的输入端都是高电平,代表无键按下。

行线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。

4.3行列扫描法原理:

第一步,使行线为编程的输入线,列线是输出线,拉低所有的列线,判断行线的变化,如果有按键按下,按键按下的对应行线被拉低,否则所有的行线都为高电平。

第二步,在第一步判断有键按下后,延时10ms消除机械抖动,再次读取行值,如果此行线还处于低电平状态则进入下一步,否则返回第一步重新判断。

第三步,开始扫描按键位置,采用逐行扫描,每间隔1ms的时间,分别拉低第一列,第二列,第三列,第四列,无论拉低哪一列其他三列都为高电平,读取行值找到按键的位置,分别把行值和列值储存在寄存器里。

第四步,从寄存器中找到行值和列值并把其合并,得到按键值,对此按键值进行编码,按照从第一行第一个一直到第四行第四个逐行进行编码,编码值从“0000”至“1111”,再进行译码,最后显示按键号码。

4.4有键按下时,就进入中断,在中断中判断按键与要显示的数。

 

原理图如下:

 

 

四、系统软件设计

软件流程:

五、附件

1.原理图

2.程序

/**************************计算器的设计(简单版)*******************************/

/*****************************************************************************/

/**作品功能:

能完成简单的整数加\减\乘\除\法,除法的小数位不显示(舍去)***********/

/********输入最大能输入五位数据;且能正常的显示五位数结果,超过五位结果不信任***/

/*****************************************************************************/

/******制作时间:

2011年11月08号********************************************/

/*****************************************************************************/

/*****************************************************************************/

/*********************所用头文件**********************************************/

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

/****************************************单片机各个口的定义****************/

#definekey_dataP1

#defineduanP2

sbitwei_1=P3^3;

sbitwei_2=P3^4;

sbitwei_3=P3^5;

sbitwei_4=P3^6;

sbitwei_5=P3^7;

sbitwei_6=P3^1;

sbitBEEP=P3^0;

/**************************一些寄存器的设计********************************/

ucharKeyNO;//键盘值

ucharduan_1;//段选中间值

ucharx;//控制小数点的显示

uchardatadata_count[5]={0,0,0,0,0};//只能用0~9

uchardatadata_use[5]={0,0,0,0,0};//显示数组

ucharsCode,kCode,i1,k;//检查键盘的值所用寄存器

ucharkey_value[]=//键盘值

{

0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16

};

ucharkey_count;

longadd,cut,multiply,divide,divide_1;//加减乘除的计算结果

longdata_qian[5]={0,0,0,0,0};//第一次输入的结果,存入这里面

longdata_hou[5]={0,0,0,0,0};//被加数,乘数,除数,被减数,放入这里面

longcount1,count2;

ucharkey_control;

ucharasd;

ucharoperation_select,operation_select_1;

ucharmn;//控制只进行除法运算,一次完后必须复位,

/**************************************************************************/

 

/****************************函数的定义*******************************/

voidDelay(uintmasd);

voiddisplay();

voidduan_selct();

voidBeep();

voidKeys_Scan();

voidkey_decide();

voidjia();

voidjian();

voidcheng();

voidchu();

voidfuzhi();

voidkeybord(uchara);

voidDelayMS(uintms);

/*****************************************************************/

/****************************主函数**************************************/

/****************************************************************************/

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_count[0]=key_value[KeyNO];//位1~15的值

display();

}

}

/*********************************************************************/

/***************************************************************************/

/**************************************************************************/

/****函数功能:

外部中断0的终段服务函数,外部中断判断按键*********************/

/******************************************************************/

/******************************************************************/

voidkey_int()interrupt0

{

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;

}

/*****************************************************************************、/*函数功能:

确定每一个按键的功能(0~9数值),10~加;11~减;12~乘;13~除;14~等于;15:

清除***/

/***************************************************************************/

/*****************************************************************************/

voidkey_decide()

{

switch(key_value[KeyNO])

{

case0:

keybord(0);break;

case1:

keybord

(1);break;

case2:

keybord

(2);break;

case3:

keybord(3);break;

case4:

keybord(4);break;

case5:

keybord(5);break;

case6:

keybord(6);break;

case7:

keybord(7);break;

case8:

keybord(8);break;

case9:

keybord(9);break;

case10:

operation_select=1;

if(key_control==0)

{

asd=0;

data_qian[4]=data_use[4];

data_qian[3]=data_use[3];

data_qian[2]=data_use[2];

data_qian[1]=data_use[1];

data_qian[0]=data_use[0];

data_use[0]=0;

data_use[1]=0;

data_use[2]=0;

data_use[3]=0;

data_use[4]=0;

key_control=1;

}

elseif(key_control==1)

{

data_hou[4]=data_use[4];

data_hou[3]=data_use[3];

data_hou[2]=data_use[2];

data_hou[1]=data_use[1];

data_hou[0]=data_use[0];

if(operation_select_1==1)jia();

elseif(operation_select_1==2)jian();

elseif(operation_select_1==3)cheng();

elseif(operation_select_1==4)chu();

}

operation_select_1=1;

break;

case11:

operation_select=2;

if(key_control==0)

{

asd=0;

data_qian[4]=data_use[4];

data_qian[3]=data_use[3];

data_qian[2]=data_use[2];

data_qian[1]=data_use[1];

data_qian[0]=data_use[0];

data_use[0]=0;

data_use[1]=0;

data_use[2]=0;

data_use[3]=0;

data_use[4]=0;

key_control=1;

}

elseif(key_control==1)

{

data_hou[4]=data_use[4];

data_hou[3]=data_use[3];

data_hou[2]=data_use[2];

data_hou[1]=data_use[1];

data_hou[0]=data_use[0];

if(operation_select_1==1)jia();

elseif(operation_select_1==2)jian();

elseif(operation_select_1==3)cheng();

elseif(operation_select_1==4)chu();

}

operation_select_1=2;

break;

case12:

operation_select=3;

if(key_control==0)

{

asd=0;

data_qian[4]=data_use[4];

data_qian[3]=data_use[3];

data_qian[2]=data_use[2];

data_qian[1]=data_use[1];

data_qian[0]=data_use[0];

data_use[0]=0;

data_use[1]=0;

data_use[2]=0;

data_use[3]=0;

data_use[4]=0;

key_control=1;

}

elseif(key_control==1)

{

data_hou[4]=data_use[4];

data_hou[3]=data_use[3];

data_hou[2]=data_use[2];

data_hou[1]=data_use[1];

data_hou[0]=data_use[0];

if(operation_select_1==1)jia();

elseif(operation_select_1==2)jian();

elseif(operation_select_1==3)cheng();

elseif(operation_select_1==4)chu();

}

operation_select_1=3;

break;

case13:

operation_select=4;

if(key_control==0)

{

asd=0;

data_qian[4]=data_use[4];

data_qian[3]=data_use[3];

data_qian[2]=data_use[2];

data_qian[1]=data_use[1];

data_qian[0]=data_use[0];

data_use[0]=0;

data_use[1]=0;

data_use[2]=0;

data_use[3]=0;

data_use[4]=0;

key_control=1;

mn=1;

}

elseif(key_control==1)

{

data_hou[4]=data_use[4];

data_hou[3]=data_use[3];

data_hou[2]=data_use[2];

data_hou[1]=data_use[1];

data_hou[0]=data_use[0];

data_use[4]=0;

data_use[3]=0;

data_use[2]=0;

data_use[1]=0;

data_use[0]=0;

if(operation_select_1==1)jia();

elseif(operation_select_1==2)jian();

elseif(operation_select_1==3)cheng();

elseif(operation_select_1==4)chu();

}

operation_select_1=4;

break;

case14:

data_hou[4]=data_use[4];

data_hou[3]=data_use[3];

data_hou[2]=data_use[2];

data_hou[1]=data_use[1];

data_hou[0]=data_use[0];

if(operation_select==1)jia();

elseif(operation_select==2)jian();

elseif(operation_select==3)cheng();

e

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 其它模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1