搜索
您的当前位置:首页正文

电子系统设计完整版

来源:知库网


目录

1 绪论.......................................................... - 1 - 2 系统方案与论证................................................ - 2 -

2.1 方案论述 .................................................... 2 2.2 方案比较 .................................................... 2 3 系统硬件模块方案设计.............................................. 3

3.1 单片机的选择 ................................................ 3 3.2 单片机最小系统 .............................................. 3 3.3 显示器件的选择 .............................................. 4 3.4 输入设备的选择 .............................................. 5 3.5 声音信号 .................................................... 5 4 实际电路的设计.................................................... 5

4.1 单片机最小系统与复位电路 .................................... 5 4.2 蜂鸣器电路 .................................................. 6 4.3 数码管显示电路 .............................................. 7 4.4 4*4矩阵键盘................................................. 7 5 系统软件设计...................................................... 9

5.1软件流程:................................................... 9 6 结论............................................................. 11 参考文献........................................................... 11 附录1 系统原理图 .................................................. 13 附录2 程序 ........................................................ 14

基于STC51单片机的计算器

郭振龙

(德州学院物理系,山东德州253023)

摘 要 本设计采用STC51单片机作为控制芯片,用C语言对其进行编程实现,输入由4*4矩阵式键盘控制,输出采用性价比高的数码管实现。该计算器所能完成的功能包括:(1)整数加减乘除法。(2)小数的除法。(3)矩阵键盘输入指令。(4)每按一次键蜂鸣器发声一次。(5)计算结果显示。对于计算这个部分我采用的是矩阵键盘,10个数字键,一个小数点键,四个符号键,一个多功能键,通过判别该多功能键连续按的次数来决定该键此时的命令。由于C语言库函数繁多,所以我采用调用C语言库函数来解决多种运算类型,这样编程更简单,运行起来也更可靠。

关键字 STC51单片机,数码管,矩阵键盘,C语言库函数

1 绪论

近年来随着科技的飞速发展,单片机的应用正在不断深入,同时带动传统控制检测技术日益更新。在实时检测和自动控制的单片机应用系统中,单片机往往作为一个核心部件来使用,但仅单片机方面的知识是不够的,还应根据具体硬件结构、软硬件结合,来加以完善。

目前,51系列单片机在我国的各行各业得到了广泛应用,各大专业院校、职业培训学校,均开设了单片机原理与应用方面的课程,这是一门技术性和实践性很强的学科,必须通过一系列的软硬件实验、理论联系实际,才能学好、学懂,取得较好的学习效果。

当今社会,随着人们物质生活的不断提高,电子产品已经走进了家家户户,无论是生活或学习,还是娱乐和消遣几乎样样都离不开电子产品,大型复杂的计算能力是人脑所不能胜任的,而且比较容易出错。计算器作为一种快速通用的计算工具方便了用户的使用。计算器可谓是我们最亲密的电子伙伴之一。本设计着重在于分析计算器软件和开发过程中的环节和步骤,并从实践经验出发对计算器设计做了详细的分析和研究。

单片机由于其微小的体积和极低的成本,广泛的应用于家用电器、工业控制等领域中。在工业生产中。单片微型计算机是微型计算机的一个重要分支,也是颇具生命力的机种。单片微型计算机简称单片机,特别适用于控制领域,故又称为微控制器。

- 1 -

计算器在人们的日常生活中是比较常见的电子产品之一。可是它还在发展之中,基于这样的理念,本次设计是用STC51单片机、数码管显示、控制按键为元件来设计的计算器。利用此设计熟悉单片机微控制器及C语言编程,对其片资源及各个I/O端口的功能和基本用途的了解。掌握Microsoft Visual C++ 6.0应用程序开发环境,常用的数码管显示器的使用方法和一般键盘的使用方法。

2 系统方案与论证

为了能够设计出一种成本低廉,精确度较高,操作简单的计算器,本设计给出了二种方案。

2.1 方案论述

方案一:采用计算器专用芯片实现。用计算器专用芯片进行设计并编程实现。这种设计方案计算效率高、速度快、而且成本也相对较低,是厂家做计算器的最佳方案。但是本人对计算器专用芯片掌握的不够,还不足以实现设计计算器,所以这个方案不可去。

方案二:用单片机实现。由于单片机集成了运算器电路、控制电路、存储器、中断系统、定时器/计数器以及输入/输出口电路等,所以用单片机设计控制电路省去了很多分立元器件。由于单片机是可编程芯片,并且它可以运用C语言编写,对于一些复杂的计算功能,可以调用C语言库函数。使编写程序变得非常简单。所以该课题用单片机实现,不仅功能易于实现,而且精确度高,稳定性好,抗干扰能力强。并且由于其成本低、体积小、技术成熟和功耗小等优点,且技术比较成熟。性价比也相当高。更重要的是本人经过几年的学习,对单片机已有深刻的理解。

综上所述,并通过各个方面综合比较为达到最佳效果。我们采用方案二利用单片机控制器。

2.2 方案比较

方案一使用的是计算器采用计算器专用芯片实现。方案二是用STC51单片机

- 2 -

实现。

方案一使用的是计算器专用芯片进行设计并编程实现。这种设计方案计算效率高、速度快、而且成本也相对较低,是厂家做计算器的最佳方案。但是本人对计算器专用芯片掌握的不够,还不足以实现设计计算器,所以这个方案不可去。方案二是用STC51单片机实现。由于单片机是可编程芯片,并且它可以运用C语言编写,对于一些复杂的计算功能,可以调用C语言库函数。不仅功能易于实现,而且精确度高,稳定性好,抗干扰能力强。并且由于其成本低、体积小、技术成熟和功耗小等优点,且技术比较成熟。性价比也相当高。更重要的是本人经过几年的学习,对单片机已有深刻的理解。

综上所述,并通过各个方面综合比较为达到最佳效果。我们采用方案二利用单片机控制器。

3 系统硬件模块方案设计

3.1 单片机的选择

要求单片机完成简单的整数加减乘除法、处理4*4矩阵键盘的输入数据、

控制显示器件显示输入的数据与运算的结果、控制蜂鸣器的发音。

STC51单片机的特点有一下主要几点:(1)工作电压:3.4V-5.5V (5V 单片机)/ 2.0V-3.8V (3V 单片机 (2)工作频率范围:0 -35 MHz,相当于普通8051 的0~420MHz.实际工作频率可达48MHz. (3)内部集成MAX810 专用复位电路(外部晶体20M 以下时,可省外部复位电路) (4)有2个16 位定时器/ 计数器 (5)外部中断2 路,下降沿中断或低电平触发中断,Power Down 模式可由外部中断低电平触发中断方式唤醒

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

3.2 单片机最小系统

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

- 3 -

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

图3.2复位电路图

3.3 显示器件的选择

方案一:使用12864作为显示设备,RT12864M汉字图形点阵液晶显示模块,可显示汉字及图形。供电电源为3.3V~+5V(内置升压电路,无需负压),能采用并行和串行两种通信方式。并有光标显示、画面移位、自定义字符、睡眠模式等功能。但是考虑到计算器只要求显示数字,使用12864太浪费,且价格比较贵,不予选用。

图3.3 12864与单片机的接口电路

方案三:使用数码管作为显示设备。数码管能显示数字和一些特殊字符,而且计算器要求的显示器件能显示数字和一些特殊字符。所以数码管能完成我们的

- 4 -

要求显示要求,并且数码管是最便宜的。

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

3.4 输入设备的选择

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

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

3.5 声音信号

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

应该要求每按下一次键盘就发声一次。发声设备使用蜂鸣器就能完成要求。

4 实际电路的设计

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

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

单片机31脚(EA/VPP),当接高电平时,单片机在复位后从内部ROM的0000H开始执行;当接低电平时,复位后后直接从外部ROM的0000H开始执行。我们只使用的单片机内部的ROM区,所以31脚(EA/VPP)应接高电平。

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

- 5 -

图4.1 复位电路电路图

4.2 蜂鸣器电路

三极管主要是做驱动用的。因为单片机的IO口驱动能力不够让蜂鸣器发出

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

图4.2 蜂鸣器电路

- 6 -

4.3 数码管显示电路

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

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

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

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

数码管接法如下图:

图4.3 数码管接线图

4.4 4*4矩阵键盘

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

- 7 -

图4.4 4*4矩阵键盘图

在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样,一个端口(如P1口)就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。

矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些,上图中,列线通过电阻接正电源,并将行线所接的单片机的I/O口作为输出端,而列线所接的I/O口则作为输入。这样,当按键没有按下时,所有的输入端都是高电平,代表无键按下。行线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。 行列扫描法步骤为:

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

第二步, 在第一步判断有键按下后, 延时 10ms 消除机械抖动,再次读取行值,如果此行线还处于低电平状态则进入下 一步,否则返回第一步重新判断。 第三步,开始扫描按键位置,采用逐 行扫描,每间隔 1ms 的时间,分别拉低第一列,第二列,第三列,第四 列,无论拉低哪一列其他三列都为高电平,读取行值找到按键的位置, 分别把行值和列值储存在寄存器里。

第四步,从寄存器中找到行值和列 值并把其合并,得到按键值,对此按键

- 8 -

值进行编码,按照从第一行第一 个一直到第四行第四个逐行进行编码,编码值从“0000” 至“1111” , 再进行译码,最后显示按键号码。有键按下时,就进入中断,在中断中判断按键与要显示的数。

5 系统软件设计

5.1软件流程:

- 9 -

开始 系统初始化,开键盘扫描中断(INTO) NO 有中断 数码管动态显示 显示数码管动态数据显示区的数据 有无键 按下 YES 循环显示 返回中断服务函数调用处 进入中断服务程序 关中断;蜂鸣器发音一下,关掉 键盘扫描 判断键盘是哪个键按下 按键是否释放 NO YES 键值处理 按下的是什么键完成对用的功能。并把结果送数码管待显示数据区 结束

- 10 -

6 结论

通过本次设计的训练,可以使我在基本思路和基本方法上对基于51单片机的嵌入式系统设计有一个比较感性的认识,并具备一定程度的设计能力。

在这次设计中使我对计算器制作过程有了更深的了解,对STC51单片机也有了更高成次的了解,单片机的种类多,而型号杂,也是我们学习中的困难。

在这次单片机应用系统设计中遇到到很大的困难,主要原因是平时的知识掌握的不够,通过查阅很多资料和类似的论文,才做成的。以前也做过不少单片机设计,但面对这次设计,似乎也有一点束手无策了。

在这次的设计中,让我们发自内心的明白了以下这几个道理。其实,这几个道理以前我们就懂,就知道,甚至每个人都知道,但真正到了关键时间,我们还会不会遵循它来办事就是一个问号啦。

书读百遍,其义自现。 三个臭皮匠胜过一个诸葛亮。 团结就是力量。 温故而知新。

正因为我开始没有遵循这几个道理所以在设计中走了不少弯路,表现出来了我很多的不足之处,就因为这样我们才会在这次设计中有进步、有发展,同时使自己的能力得到进一步的提升。我将好好地记录下这次设计的点点滴滴,我想,这不单是我的经历,更是我的一笔财富。

参考文献

[1] 徐爱钧.智能化测量控制仪表原理与设计(第二版).北京航天航空大学出版社,2004.9 [2] 孙育才等.MCS-51系列单片微型计算机及其应用(第4版).东南大学出版社,2004.3 [3] 李萍等.智能仪器实验指导书.大连交通大学,2007.9 [4] 单片机应用技术(C语言).中国劳动社会保障出版社,2006.6 [5] 武庆生,仇梅等著.单片机原理与应用.电子科技大学出版,1998.12

[6] 朱定华著.单片机原理与接口技术.电子工业出版社,2001.4 [7]王宜怀,刘晓升等著.嵌入式应用技术基础教程.北京清华大学出版社,2005.7

- 11 -

[8] 王威著.HCS12微控制器原理及应用.北京航空航天大学出版社,2007.10 [9] 龚运新著.单片机C语言开发技术.北京清华大学出版社,2006.10 [10] 周立功.单片机实验与实践.北京航空航天大学出版社,2004.3

Based on STC51 single-chip computer

Guo Zhenlong

(Department of Physics , Dezhou University , Dezhou,253023)

Abstract This design uses the STC51single chip microcomputer as control chip, using C language for programming, by 4*4matrix keyboard input control, output using cost-effective digital control to achieve. The calculator can complete the functions include: (1) integer add, subtract, multiply and divide method. (2) the decimal division. (3) a matrix keyboard input instruction. (4) every time a key buzzer. (5) the calculation results show. For the calculation of the part I use is the keyboard matrix,10 numeric keys, a decimal point key, four symbol keys, a function key, through the identification of the multifunction key continuous press times to decide the key point of order. Because C language library function is various, so I used to call C language library function to solve multiple operation types, such programming easier, more reliable operation.

Keywords SCM STC51;Digital tube;Matrix keyboard,;C language library function

- 12 -

附录1 系统原理图

- 13 -

附录2 程序

/**************************计算器的设计(简单版)*******************************/ /*****************************************************************************/ /**作品功能:能完成简单的整数加\\减\\乘\\除\\法,除法的小数位不显示(舍去)***********/ /********输入最大能输入五位数据;且能正常的显示五位数结果,超过五位结果不信任***/ /*****************************************************************************/ /******制作时间:2011年11月08号********************************************/ /*****************************************************************************/ /*****************************************************************************/ /*********************所用头文件**********************************************/ #include #include

#define uchar unsigned char #define uint unsigned int

/****************************************单片机各个口的定义****************/ #define key_data P1 #define duan P2

sbit wei_1= P3^3; sbit wei_2= P3^4; sbit wei_3= P3^5; sbit wei_4= P3^6; sbit wei_5= P3^7; sbit wei_6= P3^1; sbit BEEP = P3^0;

/**************************一些寄存器的设计********************************/ uchar KeyNO; //键盘值

uchar duan_1; //段选中间值

uchar x; //控制小数点的显示 uchar data data_count[5]={0,0,0,0,0}; //只能用0~9 uchar data data_use[5]={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_qian[5]={0,0,0,0,0}; //第一次输入的结果,存入这里面 long data_hou[5]={0,0,0,0,0}; //被加数,乘数,除数,被减数,放入

- 14 -

这里面

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(); 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;

- 15 -

//data_count[0]=key_value[KeyNO];//位1~15的值 display(); } }

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

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

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

void key_int() 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; }

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

/***************************************************************************/ /*****************************************************************************/ void key_decide() {

switch(key_value[KeyNO]) {

- 16 -

case 0: keybord(0); break; case 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_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; }

else if(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(); 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;

- 17 -

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; }

else if(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(); else if(operation_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_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; }

else if(key_control==1) {

- 18 -

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(); else if(operation_select_1==2) jian(); else if(operation_select_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_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; }

else if(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(); else if(operation_select_1==2) jian(); else if(operation_select_1==3) cheng();

- 19 -

else if(operation_select_1==4) chu(); } operation_select_1=4; break;

case 14: 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(); else if(operation_select==2) jian(); else if(operation_select==3) cheng();

else if(operation_select==4) chu(); data_use[4]=data_count[0]; data_use[3]=data_count[1]; data_use[2]=data_count[2]; data_use[1]=data_count[3]; data_use[0]=data_count[4]; key_control=0; break; case 15: data_use[4]=0; data_use[3]=0; data_use[2]=0; data_use[1]=0; data_use[0]=0;

data_count[4]=0; data_count[3]=0; data_count[2]=0; data_count[1]=0; data_count[0]=0; data_qian[4]=0; data_qian[3]=0; data_qian[2]=0; data_qian[1]=0; data_qian[0]=0;

data_hou[4]=0; data_hou[3]=0; data_hou[2]=0; data_hou[1]=0; data_hou[0]=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_control=0; x=0; break;

case 16: _nop_(); break;

default: _nop_(); } }

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

- 20 -

/**************函数功能:数码管显示***************************************/ /************************************************************************/

/*****************************************************************************/ void display() {

uchar i;

for(i=0;i<400;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_use[0];duan_selct();if(x==1) duan = duan + 0x80;Delay(20);

//wei_1=0;wei_2=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_use[1];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_use[2];duan_selct();if(x==3) duan = duan + 0x80;Delay(20);

//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_use[3];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_use[4];duan_selct();if(x==5) duan = duan + 0x80;Delay(20); } }

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

/**************函数功能:数码管段选*****************************************/ /**************************************************************************/ /*****************************************************************************/ void duan_selct() {

switch(duan_1) {

case 0: duan=0xC0;break;

- 21 -

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; 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; 0

default: duan=0x86; //如果计算结果超过五位,最高位显示E,表示结果是不可信的, } }

/**************************************************************************/ /*****************************************************************************/ /***********************************函数功能:蜂鸣器**************************/ /*************************************************************************/ /**************************************************************************/ void Beep() {

uint i;

for(i=0;i<1000;i++) {

BEEP =0; DelayMS(1); }

BEEP = 1; }

/*************************************************************************/ /****************************************************************************/ /**********************************加减乘除运算******************************/ /**********************************************************************/ /***********************************函数功能:赋值运算****************/ /**********************************************************************/ void fuzhi()

- 22 -

{

data_qian[0]=data_count[4]; data_qian[1]=data_count[3]; data_qian[2]=data_count[2]; data_qian[3]=data_count[1]; data_qian[4]=data_count[0]; asd=0;

data_use[0]=data_count[4]; data_use[1]=data_count[3]; data_use[2]=data_count[2]; data_use[3]=data_count[1]; data_use[4]=data_count[0]; }

/*************************************************************************/ /***********************************函数功能:加法运算******************/ /*********************************************************************/ void jia() {

count1 =data_qian[4]*10000 + data_qian[3]*1000 + data_qian[2]*100 + data_qian[1]*10 + data_qian[0]*1;

count2 =data_qian[4]*10000 + data_hou[3]*1000 + data_hou[2]*100 + data_hou[1]*10 + data_hou[0]*1; add = count1 + count2; data_count[0]=add/10000; data_count[1]=add/1000%10; data_count[2]=add/100%10; data_count[3]=add%100/10; data_count[4]=add%10; fuzhi(); }

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

/***********************************函数功能:减法运算*************************/ /**************************************************************************/ void jian() {

count1 =data_qian[4]*10000 + data_qian[3]*1000 + data_qian[2]*100 + data_qian[1]*10 + data_qian[0]*1;

count2 =data_hou[4]*10000 + data_hou[3]*1000 + data_hou[2]*100 + data_hou[1]*10 + data_hou[0]*1; cut = count1 - count2; data_count[0]=cut/10000; data_count[1]=cut/1000%10;

- 23 -

data_count[2]=cut/100%10; data_count[3]=cut%100/10; data_count[4]=cut%10; fuzhi(); }

/*************************************************************************/ /***********************************函数功能:乘法运算********************/ /**********************************************************************/ void cheng() {

count1 =data_qian[4]*10000 + data_qian[3]*1000 + data_qian[2]*100 + data_qian[1]*10 + data_qian[0]*1;

count2 =data_hou[4]*10000 + data_hou[3]*1000 + data_hou[2]*100 + data_hou[1]*10 + data_hou[0]*1; multiply = count1 * count2; data_count[0]=multiply/10000; data_count[1]=multiply/1000%10; data_count[2]=multiply/100%10; data_count[3]=multiply%100/10; data_count[4]=multiply%10; fuzhi(); }

/***************************************************************************/ /***********************************函数功能:除法运算*************************/ /*****************************************************************************/ void chu() {

count1 =data_qian[4]*10000 + data_qian[3]*1000 + data_qian[2]*100 + data_qian[1]*10 + data_qian[0]*1;

count2 =data_hou[4]*10000 + data_hou[3]*1000 + data_hou[2]*100 + data_hou[1]*10 + data_hou[0]*1; divide = count1 / count2;

divide_1=count1%count2; //最多有四位余数 if(divide_1==0 && mn==0) {

data_count[0]=divide/10000; data_count[1]=divide/1000%10; data_count[2]=divide/100%10; data_count[3]=divide%100/10; data_count[4]=divide%10; } else

- 24 -

{

mn=0; if( (((count1*10)/count2)%10!=0) && (((count1*100)/count2)%10==0) ) {

data_count[0]=divide/1000; data_count[1]=divide/100%10; data_count[2]=divide%100/10; data_count[3]=divide%10; x=2;

data_count[4]=((count1*10)/count2)%10; } else if( (((count1*10)/count2)%10!=0) || (((count1*100)/count2)%10!=0) ) {

data_count[0]=divide/100; data_count[1]=divide%100/10; data_count[2]=divide%10; x=3;

data_count[3]=((count1*10)/count2)%10; data_count[4]=((count1*100)/count2)%10; } else {

data_count[0]=divide/10000; data_count[1]=divide/1000%10; data_count[2]=divide/100%10; data_count[3]=divide%100/10; data_count[4]=divide%10; } } fuzhi(); }

/************************************************************************/ /***********************************函数功能:延时程序1**********************/ /**************************************************************************/ void Delay(uint masd) {

uchar j;

while(masd--) {

for(j=0;j<30;j++); }

- 25 -

}

/***********************************函数功能:延时程序2**************/ void DelayMS(uint ms) {

uchar t; while(ms--) {

for(t=0;t<120;t++); } }

/***************************************************************************/ /**************************************************************************/ /***********************************************************************/ /******************函数功能:键盘扫描**************************/

/****************************************************************************/ void Keys_Scan() {

uchar Tmp; P1 = 0x0f; DelayMS(1);

Tmp = P1 ^ 0x0f; switch(Tmp) {

case 1: KeyNO = 0; break; case 2: KeyNO = 1; break; case 4: KeyNO = 2; break; case 8: KeyNO = 3; break; default: KeyNO = 16; }

P1 = 0xf0; DelayMS(1);

Tmp = P1 >> 4 ^ 0x0f; switch(Tmp) {

case 1: KeyNO += 0; break; case 2: KeyNO += 4; break; case 4: KeyNO += 8; break; case 8: KeyNO += 12; } }

/*************************************************************************/ /***********函数功能:控制输入数据的显示(先按下的是最高位,以此类推)*********/

- 26 -

/******************************************************************/ void keybord(uchar a) {

if(asd==0) {

data_use[4]=0; data_use[3]=0; data_use[2]=0; data_use[1]=0; data_use[0]=a; asd=1; } else if(asd==1) {

data_use[1]=data_use[0]; data_use[0]=a; asd=2; } else if(asd==2) {

data_use[2]=data_use[1]; data_use[1]=data_use[0]; data_use[0]=a; asd=3; } else if(asd==3) {

data_use[3]=data_use[2]; data_use[2]=data_use[1]; data_use[1]=data_use[0]; data_use[0]=a; asd=0; } }

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

- 27 -

因篇幅问题不能全部显示,请点此查看更多更全内容

Top