专业综合实训报告

  

专业综合实训报告

          

   学院:电气工程学院

              班级:09工自三班

              姓名:袁欢欢 朱梦琪 邵帅

              学号:090103010156

                    090103010155

                    090103010150

                     

                       

目录

目录…………………………………………………………………………………………1

第1章 概述………………………………………………………………………………2

1.1 计算器的意义及实验目的………………………………………………………2

1.2 软硬件开发环境……………………………………………………………………3

1.3 STC89C52RC单片机概述…………………………………………………………3

第2章 计算其基本功能与设计………………………………………………………7

2.1 计算器基本实现功能………………………………………………………………7

2.2 设计与实现方法……………………………………………………………7

第3章 计算器模块介绍…………………………………………………………………9

3.1 输入模块:键盘扫描………………………………………………………………9

3.2运算模块:单片机控制………………………………………………………………10

3.3 显示模块:数码管显示………………………………………………………………11

第4章 硬件电路设计……………………………………………………………………12

4.1主要器件………………………………………………………………………………12

4.2功能和操作……………………………………………………………………………12

4.3硬件调试………………………………………………………………………………12

第5章 软件设计…………………………………………………………………………14

5.1软件主要程序设计……………………………………………………………………14

5.2 实现程序………………………………………………………………………………15

  第6章 课程设计心得体会………………………………………………………………27

                   第1章 概述

                1.1 计算器的意义及实验目的

随着社会的发展,科学的进步,人们的生活水平在逐步的提高,尤其是微电子技术的发展,犹如雨后春笋般的变化。单片机的应用已经越来越贴近生活,用单片机来实现一些电子设计也变得容易起来。计算器在人们的日常中是比较的常见的电子产品之一。可是它还在发展之中,以后必将出现功能更加强大的计算器,基于这样的理念,本次设计是用单片机来设计的计算器。本系统以AT89C52为单片机,有矩阵键盘扫描,数码管显示,实现最高六位两个、三个数的加减乘除功能。

                  1.2 软硬件开发环境

 软件环境:Keil uVision4

 硬件环境:PC机一台,STC89C52RC单片机一个

           STC89C52RC单片机引脚图如下所示:

          

               1.3STC89C52RC单片机概述

    STC89C52RC 单片机是宏晶科技推出的新一代高速/低功耗/超强抗干扰的单 片机,指令代码完全兼容传统 8051 单片机,12 时钟/机器周期和 6 时钟/机器周 期可以任意选择。

     主要特性如下:

     1. 增强型 8051 单片机,6 时钟/机器周期和 12 时钟/机器周期可以任 意选择,指令代码完全兼容传统 8051.

     2. 工作电压:5.5V~3.3V(5V 单片机)/3.8V~2.0V(3V 单片机)

     3. 工作频率范围:0~40MHz,相当于普通 8051 的 0~80MHz,实际工 作频率可达 48MHz

     4. 用户应用程序空间为 8K 字节

     5. 片上集成 512 字节 RAM

     6. 通用 I/O 口 (32 个) 复位后为: , P1/P2/P3/P4 是准双向口/弱上拉, P0 口是漏极开路输出,作为总线扩展用时,不用加上拉电阻,作为 I/O 口用时,需加上拉电阻。

     7. ISP(在系统可编程)/IAP(在应用可编程) ,无需专用编程器,无 需专用仿真器,可通过串口(RxD/P3.0,TxD/P3.1)直接下载用户程 序,数秒即可完成一片

     8. 具有 EEPROM 功能

     9. 具有看门狗功能

     10. 共 3 个 16 位定时器/计数器。即定时器 T0、T1、T2

     11. 外部中断 4 路,下降沿中断或低电平触发电路,Power Down 模式可 由外部中断低电平触发中断方式唤醒

     12. 通用异步串行口(UART) ,还可用定时器软件实现多个 UART

     13. 工作温度范围:-40~+85℃(工业级)/0~75℃(商业级)

     14. PDIP 封装

STC89C52RC 单片机的工作模式

 掉电模式:典型功耗<0.1μA,可由外部中断唤醒,中断返回后,继续执行原程序
     空闲模式:典型功耗 2mA 典型功耗

 正常工作模式:典型功耗 4Ma~7mA 典型功耗

 掉电模式可由外部中断唤醒,适用于水表、气表等电池供电系统及便携设备
    STC89C52RC 引脚功能说明

VCC(40 引脚):电源电压

 VS S(20 引脚):接地

P0 端口(P0.0~P0.7 P0.7,39~32 引脚) :P0 口是一个漏极开路的 8 位双向 I/O 口。作为输出端口,每个引脚能驱动 8 个 TTL 负载,对端口 P0 写入 每个引脚能驱动 写入“1”时,可 以作为高阻抗输入。在访问外部程序和数据存储器时 在访问外部程序和数据存储器时,P0 口也可以提供低 8 位 地址和 8 位数据的复用总线 位数据的复用总线。此时,P0 口内部上拉电阻有效。在 Flash ROM 编 在 程时,P0 端口接收指令字节 端口接收指令字节;而在校验程序时,则输出指令字节 则输出指令字节。验证时,要求外接上拉电阻。

 P1 端口(P1.0~P1.7,1~8 引脚) :P1 口是一个带内部上拉电阻的 8 位双向 I/O 口。P1 的输出缓冲器可驱动(吸收或者输出电流方式)4 个 TTL 输入。对端 口写入 1 时,通过内部的上拉电阻把端口拉到高电位,这是可用作输入口。P1 口作输入口使用时,因为有内部上拉电阻,那些被外部拉低的引脚会输出一个电 流( ) 。

 此外,P1.0 和 P1.1 还可以作为定时器/计数器 2 的外部技术输入(P1.0/T2) 和定时器/计数器 2 的触发输入(P1.1/T2EX) ,具体参见下表:

 在对 Flash ROM 编程和程序校验时,P1 接收低 8 位地址。

表 XX  P1.0 和 P1.1 引脚复用功能

 P2 端口(P2.0~P2.7,21~28 引脚) :P2 口是一个带内部上拉电阻的 8 位双 向 I/O 端口。P2 的输出缓冲器可以驱动(吸收或输出电流方式)4 个 TTL 输入。 对端口写入 1 时,通过内部的上拉电阻把端口拉到高电平,这时可用作输入口。 P2 作为输入口使用时,因为有内部的上拉电阻,那些被外部信号拉低的引脚会 输出一个电流(I) 。

    在访问外部程序存储器和 16 位地址的外部数据存储器(如执行“MOVX @DPTR”指令)时,P2 送出高 8 位地址。在访问 8 位地址的外部数据存储器(如 执行“MOVX @R1”指令)时,P2 口引脚上的内容(就是专用寄存器(SFR)区 中的 P2 寄存器的内容) ,在整个访问期间不会改变。

    在对 Flash ROM 编程和程序校验期间, P2也接收高位地址和一些控制信号。

     P3 端口(P3.0~P3.7,10~17 引脚) :P3 是一个带内部上拉电阻的 8 位双向 I/O 端口。P3 的输出缓冲器可驱动(吸收或输出电流方式)4 个 TTL 输入。对端 口写入 1 时,通过内部的上拉电阻把端口拉到高电位,这时可用作输入口。P3 做输入口使用时,因为有内部的上拉电阻,那些被外部信号拉低的引脚会输入一 个电流( ) 。
     在对 Flash ROM 编程或程序校验时,P3 还接收一些控制信号。
      P3 口除作为一般 I/O 口外,还有其他一些复用功能,如下表所示:

 表 XX  P3 口引脚复用功能 复用功能

     RST(9 引脚) :复位输入。当输入连续两个机器周期以上高电平时为有效, 用来完成单片机单片机的复位初始化操作。看门狗计时完成后,RST 引脚输出 96 个晶振周期的高电平。特殊寄存器 AUXR(地址 8EH)上的 DISRTO 位可以使此功 能无效。DISRTO 默认状态下,复位高电平有效。

     ALE/ ROG (30 引脚) 地址锁存控制信号 : (ALE) 是访问外部程序存储器时, 锁存低 8 位地址的输出脉冲。在 Flash 编程时,此引脚( ROG)也用作编程输入 脉冲。

     在一般情况下,ALE 以晶振六分之一的固定频率输出脉冲,可用来作为外部 定时器或时钟使用。然而,特别强调,在每次访问外部数据存储器时,ALE 脉冲 将会跳过。

     如果需要,通过将地址位 8EH 的 SFR 的第 0 位置“1” ,ALE 操作将无效。这 一位置“1” ,ALE 仅在执行 MOVX 或 MOV 指令时有效。否则,ALE 将被微弱拉 高。这个 ALE 使能标志位(地址位 8EH 的 SFR 的第 0 位)的设置对微控制器处于 外部执行模式下无效。
:外部程序存储器选通信号( SEN)是外部程序存储器选 SEN(29 引脚)
通信号。当 STC89C52RC 从外部程序存储器执行外部代码时, SEN在每个机器周 期被激活两次,而访问外部数据存储器时, SEN将不被激活。 A/VPP (31 引脚) 访问外部程序存储器控制信号。 : 为使能从 0000H 到 FFFFH 的外部程序存储器读取指令, A必须接 GND。注意加密方式 1 时, A将内部锁 定位 RESET。为了执行内部程序指令, A应该接 VCC。在 Flash 编程期间, A也 接收 12 伏 VPP 电压。 XTAL1(19 引脚) :振荡器反相放大器和内部时钟发生电路的输入端。 XTAL2(18 引脚) :振荡器反相放大器的输入端。

      第2章 计算其基本功能与设计

                  2.1 计算器基本实现功能

   1. 计算器可显示六位数字,有板子的开关按钮控制计算器的开关和清除数码管显示的结果。

 2. 设计4×4键盘,分别表示0~9、小数点(.)、+、-、×、/ 和=,输入的数字从设计的键盘输入;

3. 第一次按下时,显示“D1”;第二次按下时,显示“D1D2”;第三次按下时,显示“D1D2D3”,6个全显示完毕,再按下按键下时,输入的第7个数不接收,仍然显示原来的六位数;

  4.可实现两个数或三个数的加、减、乘、除运算,并且有运算优先级,如:NUM1+NUM2*NUM3,先计算后两数之积,在于第一个数相加。

  5.可实现小数运算,在结果有小数时,只保留小数点后两位结果。

                  2.2 设计与实现方法

 为了满足计算器的基本要求,可以基本的运算(加减乘除),我们采用基于MSC-51单片机设计计算器,并用LED数码管显示数据,4*4的矩阵键盘实现数据输入。

根据功能和指标要求,本系统选用MSC-51单片机为主控机。通过已固化好的的外围接口电路,实现对计算器的设计。具体设计考虑如下:

1、     由于要设计的是简单的计算器,可以进行四则运算,对数字的大小范围要求不高,选用6个LED数码管显示数据和结果。

2、     另外键盘包括数字键(0~9)、符号键(+、-、×、÷)、小数点键和等号键,故只需要16个按键即可。

3、   系统模块图如下所示:

 

    

  

             第3章 计算器模块介绍

                3.1 输入模块:键盘扫描

计算器输入数字和其他功能按键要用到很多按键,如果采用独立按键的方式,在这种情况下,编程会很简单,但是会占用大量的I/O口资源,因此在很多情况下都不采用这种方式。为此,我们引入了矩阵键盘的应用,采用四条I/O线作为行线,四条I/O线作为列线组成键盘。在行线和列线的每个交叉点上设置一个按键。这样键盘上按键的个数就为4×4个。这种行列式键盘结构能有效地提高单片机系统中I/O口的利用率。

矩阵键盘的工作原理:

计算器的键盘布局如图3所示:一般有16个键组成,在单片机中正好可以用一个P口实现16个按键功能,这种形式在单片机系统中也最常用。

   

有板子内部固化电路可知,4×4矩阵键盘的行线与P3.0、P3.1、P3.2、P3.3相连,列线与P3.4、P3.5、P3.6、P3.7相连,判断有无按键按下的方法是:第一步,置列线P3.4~P3.7为输入状态,从行线P3.0~P3.3输出低电平,读入列线数据,若某一列线为低电平,则该列线上有键闭合。第二步,行线轮流输出低电平,从列线P3.4~P3.7读入数据,若有某一列为低电平,则对应行线上有键按下。综合一二两步的结果,可确定按键编号。但是键闭合一次只能进行一次键功能操作,因此须等到按键释放后,再进行键功能操作,否则按一次键,有可能会连续多次进行同样的键操作。

                    

3.2运算模块:单片机控制

MCS-51单片机是在一块芯片中集成了CPU、RAM、ROM、定时器/计数器和多功能I/O等一台计算机所需要的基本功能部件。如果按功能划分,它由如下功能部件组成,即微处理器(CPU)、数据存储器(RAM)、程序存储器(ROM/EPROM)、并行I/O口、串行口、定时器/计数器、中断系统及特殊功能寄存器(SFR)。

单片机是靠程序运行的,并且可以修改。通过不同的程序实现不同的功能,尤其是特殊的独特的一些功能,通过使用单片机编写的程序可以实现高智能,高效率,以及高可靠性!因此我们采用单片机作为计算器的主要功能部件,可以进行很快地实现运算功能。

 

                     3.3 显示模块:数码管显示

发光二极管LED是单片机应用系统中的一宗简单而常用的输出设备,其在系统中的主要作用是显示单片机的输出数据、状态等。因而作为典型的外围器件,LED显示单元是反映系统输出和操作输入的有效器件。LED具备数字接口可以方便的和大年纪系统连接;它的优点是价格低,寿命长,对电压电流的要求低及容易实现多路等,因而在单片机应用系统中获得了广泛的应用。

通常的数码显示器是由7段条形的LED组成(如图5所示),点亮适当的字段,就可显示出不同的数字。我们采用8段数码管,其中位于显示器右下角的LED作小数点用。 LED显示器有两种不同的形式:共阴极和共阳极。本次设计采用共阴极接法(如下图所示)。

   

如上图所示,数码管的段选和位选都是由P0端口控制的,74HC573是锁存器,单片机分时的将段选码和位选码送入两锁存器,然后进行显示。

第4章 硬件电路设计

4.1主要器件

单片机采用STC89C51RC单片机,它能够满足数据的采集、控制和数据处理的需求。显示用6段LED数码管,输入采用按键方式。

4.2功能和操作

加减乘除运算和显示。

1、上电。

2、计算。按下数字键,屏幕显示要运算的第一个数字,再按下符号键,然后再按下数字键,屏幕显示要运算的第二个数字,最后 按下“﹦”号键,屏幕上显示出计算结果。

3、如果要再次计算按下单片机的复位键,重新初始化。

4.3硬件调试

4.3.1 常见故障:

1、逻辑错误:它是由设计错误或加工过程中的工艺性错误所造成的。这类错误包括错线、开路、短路等。

2、元器件失效:有两方面的原因:一是器件本身已损坏或性能不符合要求;二是组装错误造成元件失效,如电解电容、二极管的极性错误、集成电路安装方向错误等。

3、可靠性差:引起可靠性差的原因很多,如金属化孔、接插件接触不良会造成系统时好时坏,经不起振动;走线和布局不合理也会引起系统可靠性差。

4、电源故障:若样机有电源故障,则加电后很容易造成器件损坏。电源故障包括电压值不符合设计要求,电源引线和插座不对,功率不足,负载能力差等。

4.3.2 调试方法:

包括多级调试和联机调试。在调试过程中要针对可能出现的故障认真分析,直至检查出原因并且排除。

 

 第5章 软件设计

5.1软件主要程序设计

5.1.1 键盘扫描程序

 此程序为键盘扫描中第一次扫描所用的程序,这段程序的主要过程为:初始化时,将P3.0置为低电平,通过与0xf0相与来判断所按下的键,此次为扫描位于P3.0那一行的键,若相与结果为0xe0时说明P3.4所检测出的为低电平,闭合的键应为P3.0行与P3.4列的交叉处的键。若相与结果为0xd0则P3.5所检测为低电平,闭合的键应为P3.0行与P3.5列的交叉处的键。若相与结果为0xb0则P3.6所检测为低电平,闭合的键应为P3.0行与P3.6列的交叉处的键。若相与结果为0x70则P3.7所检测为低电平,闭合的键应为P3.0行与P3.7列的交叉处的键。要把16个键盘全部扫描完需要进行4次这样的逐行扫描,所用方法相同程序类似分别另P3.1,P3.2,P3.3为低电平执行相同操作。

5.1.2 显示程序

此程序为显示程序的一部分,其同源程序代码中的数据定义部分,显示驱动程序和码制转换程序一起来实现数据在数码管中的显示。如当第一次输入为1,第二次输入为2时,则将1在数码管中向前移一位即第二位显示管上,将2放到第一位显示管上,在通过码制转换使其转换为12来执行运算,如果继续输入数字则它们将逐个的向前移动,直到输入6位后结束。

 5.1.3 简单运算程序

此设计能实现简单运算,此程序实现加法运算,则根据程序首先通过第一次键盘扫描确定出所按下的键对应的输出数据,然后通过显示程序经数码管显示出来,接着进行键盘扫描若确定出按下的键所对应的字符还为数据则把第一次显示的数字在数码管上左移一个管子,然后把第二次扫描的数据放入右边第一个管子中,继续扫描直到确定出按下的键为“+”则保存前面所扫描的数据到缓冲区,然后接着扫描键盘直到确定出加数,最后当扫描出所按下的键为“=”时,则保存数据到缓冲区,根据程序计算出其相加结果。并通过程序及原理图显示出来。通过这个程序还可实现连加功能。整个源程序还可以实现加,减,乘,除四个基本运算,具体的减,乘,除运算程序在源程序中有详细显示。当检测出所闭合的为这些按键时,通过程序将执行相似过程最后通过数码管显示出结果。

5.2 实现程序

 #include<reg52.h> /*包含的头文件 */

#define uchar unsigned char    /* 宏定义 */

#define uint unsigned int

sbit dula=P2^6;

sbit wela=P2^7;

uchar Led[16] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f,

       0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, };  /* 数码管段选 */

long float Number[]={0,0,0,0};     /* 数码管显示位控制寄存器 */   

uchar A[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

long int D[] = {0,0,0,0,0,0,0,0};    //数码管显示内容寄存器 

uchar code C[] ={0xff, 0xDF, 0xEF, 0xF7, 0xFB, 0xFD, 0xFE};    /* 数码管位选 */

         /* 列扫描控制 LED 1位 2位 3位 4位 5位 6位  */

uchar k=16;     /*  按键对外控制  */

uchar b;   /*  按键【+】【-】 【*】 【/】对外的控制  */

long float Out_put;   /* 定义变量【Out_put】作为结果  */

uchar e=0;  /*  数字的位存储递进的控制   */

uchar g=0;  /*  运算方式的控制变量  */

uchar L=0;  /*  运算方式的控制变量  */

uchar g1=0;  /*  运算方式的控制变量  */

uchar g2=0;  /*  运算方式的控制变量  */

uchar g3=0;  /*  运算方式的控制变量  */

uchar g4=0;  /*  运算方式的控制变量  */

char j=-1;  /*  与Number[]数组连用  */

uchar m=0;  /*  按键【=】的控制变量   */

uchar n=0;  /*  按键【.】的控制变量   */

uchar x=0;  /*  小数点个数的记录变量   */

uchar xo=0;  /*  控制开始计数小数点的变量  */

long int result;

void Delay(uint o)    /* 延时函数 delay() 的定义 */

{

 uint i,j;

 for(i = 0; i < o; i++)

 {

   for(j = 0; j < 121; j++) {;}

  }

}

void show(long float Out_put)  //结果显示

{ uchar r;

 uchar k;

 long int q,p;

 uchar s=0;

 uchar i;

 long int temp;

 temp=Out_put ;

 if( (Out_put-temp)!=0)  {result=Out_put*100; r=3;}//非整数

 else  { result=Out_put;  r=0; }

 p=result;  

 if(m==1)

 {

  if(result<0)

  { result=-result; p=result; q=result;

    for(i=1;i<=6;i++)

       { q=q/10;

         if(q==0)

           {k=i;

            i=7;

           }

       }

  P0=0x40;

  dula=1;

  dula=0;

  P0=C[k+1];

  wela=1;

  wela=0;Delay(1); 

  } //负号的显示

  if(temp==0)

  P0=0xbf;

  else P0=0x80;

  dula=1;//显示小数点

  dula=0;

  P0=C[r];

  wela=1; wela=0;  Delay(1); P0=0x00;

  result=p;

  P0=Led[result%10];dula=1;dula=0; P0=C[1]; wela=1; wela=0; result=result/10; Delay(1);

if( (result%10==0)&&(result%100==0)&&(result%1000==0)&&(result%10000==0) )  {P0=0x00;}

  else {P0=Led[result%10];dula=1; dula=0; P0=C[2]; wela=1; wela=0; result=result/10; Delay(1);}

  if( (result%10==0)&&(result%100==0)&&(result%1000==0) )  {P0=0x00;}

  else {P0=Led[result%10];dula=1; dula=0; P0=C[3]; wela=1; wela=0; result=result/10; Delay(1);}

  if( (result%10==0)&&(result%100==0))  {P0=0x00;}

  else {P0=Led[result%10];dula=1; dula=0; P0=C[4];  wela=1; wela=0;result=result/10; Delay(1);}

  if( (result%10==0) )  {P0=0x00;}

  else {P0=Led[result%10];dula=1; dula=0; P0=C[5]; wela=1; wela=0; result=result/10; Delay(1);}

  if(result==0)  {P0=0x00;}

  else {P0=Led[result%10];dula=1; dula=0; P0=C[6]; wela=1; wela=0; result=result/10; Delay(1);}

   }

}

void In_put()  // 输入函数 输入小数  加小数点 

{

    uchar i;

 if(k>=0&&k<=9)

 switch(e)

 {

                                 //用来存放数值

 case 6:  D[5]=D[4];A[5]=A[4];

  case 5:  D[4]=D[3];A[4]=A[3];

  case 4:  D[3]=D[2];A[3]=A[2];

  case 3:  D[2]=D[1];A[2]=A[1];

  case 2:  D[1]=D[0];A[1]=A[0];

  case 1:  if(n==0) { D[0]=k; A[0]=Led[k];  if(xo==1)  x++; }

           if(n==1) {  A[0]=Led[k]|0x80; xo=1; n=0;} 

   }

 if(k>=11&&k<=15&&b==1)

 {   switch(k)

  {

    case 11: g1++;g++;if(g2==1) L=1; if(g3==1) L=2; if(g4==1) L=3;break;  // +

    case 12: g2++;g++;if(g1==1) L=4; if(g3==1) L=5; if(g4==1) L=6;break;  // -

    case 13: g3++;g++;if(g1==1) L=7; if(g2==1) L=8; if(g4==1) L=9;break;  // *

    case 14:g4++;g++;if(g1==1) L=10;if(g2==1) L=11;if(g3==1) L=12;break;  // / 

  }

  j++;

  Number[j]=100000*D[5]+10000*D[4]+1000*D[3]+100*D[2]+10*D[1]+D[0];

  for(i=1;i<=x;i++) {Number[j]=(float)Number[j]/10;}

  x=0;

  for(i=0;i<=7;i++)  // 数据存储器清零

   D[i]=0;

  for(i=0;i<=8;i++)  // 数据显示清零

   {A[i]=0x00;} 

  b=0;e=0;xo=0;

  }

}

void Key_scan()   // 键盘扫描函数  Key_scan()

{unsigned char temp;

 P3=0xfe;

 temp=P3;

 temp=temp&0xf0;

    if(temp!=0xf0)

    {

      Delay(10);

      if(temp!=0xf0)

      {

        temp=P3;

        switch(temp)

        {

          case 0xee:

               k=0;

                  e++; In_put();

               break;

          case 0xde:

               k=1;

                  e++; In_put();

               break;

          case 0xbe:

               k=2;

                  e++; In_put();

               break;

          case 0x7e:

               k=3;

                  e++; In_put();

               break;

         }

       while(temp!=0xf0)

         {

           temp=P3;

           temp=temp&0xf0; 

         }

      }

    }

    P3=0xfd;

    temp=P3;

    temp=temp&0xf0;

    if(temp!=0xf0)

    {

      Delay(10);

      if(temp!=0xf0)

      {

        temp=P3;

        switch(temp)

        {

          case 0xed:

               k=4;

                  e++; In_put();

               break;

          case 0xdd:

               k=5;

                  e++; In_put();

               break;

          case 0xbd:

               k=6;

                  e++; In_put();

               break;

          case 0x7d:

               k=7;

                  e++; In_put();

               break;

         }

     while(temp!=0xf0)

         {

           temp=P3;

           temp=temp&0xf0;

         }  

      }

   }

    P3=0xfb;

    temp=P3;

    temp=temp&0xf0;

    if(temp!=0xf0)

    {

      Delay(10);

      if(temp!=0xf0)

      {

        temp=P3;

        switch(temp)

        {

          case 0xeb:

               k=8;

                  e++; In_put();

               break;

          case 0xdb:

               k=9;

                  e++; In_put();

               break;

          case 0xbb:

              n=1; In_put();

               break;

          case 0x7b:

               k=11;

              b=1; In_put();

               break;

         }

       while(temp!=0xf0)

         {

           temp=P3;

           temp=temp&0xf0;

         }

      }

   }

    P3=0xf7;

    temp=P3;

    temp=temp&0xf0;

    if(temp!=0xf0)

    {

      Delay(10);

      if(temp!=0xf0)

      {

        temp=P3;

        switch(temp)

        {

          case 0xe7:

               k=12;

                  b=1; In_put();

               break;

          case 0xd7:

               k=13;

                  b=1; In_put();

               break;

          case 0xb7:

               k=14;

                 b=1; In_put();

               break;

          case 0x77:

               k=15;

                  m=1;b=1; In_put();

               break;

         }

       while(temp!=0xf0)

         {

           temp=P3;

           temp=temp&0xf0;

         } 

      }

    }

  }

void Yun_suan()

{

  if(g1==1&&g==1) Out_put=Number[0]+Number[1];

  if(g2==1&&g==1) Out_put=Number[0]-Number[1];

  if(g3==1&&g==1) Out_put=Number[0]*Number[1];

  if(g4==1&&g==1) Out_put=Number[0]/Number[1];

  if(g1==2&&g==2) Out_put=Number[0]+Number[1]+Number[2];

  if(g2==2&&g==2) Out_put=Number[0]-Number[1]-Number[2];

  if(g3==2&&g==2) Out_put=Number[0]*Number[1]*Number[2];

  if(g4==2&&g==2) Out_put=Number[0]/Number[1]/Number[2];

  if(L==1)  Out_put=Number[0]-Number[1]+Number[2];

  if(L==2)  Out_put=Number[0]*Number[1]+Number[2];

  if(L==3)  Out_put=Number[0]/Number[1]+Number[2];

  if(L==4)  Out_put=Number[0]+Number[1]-Number[2];

  if(L==5)  Out_put=Number[0]*Number[1]-Number[2];

  if(L==6)  Out_put=Number[0]/Number[1]-Number[2];

  if(L==7)  Out_put=Number[0]+Number[1]*Number[2];

  if(L==8)  Out_put=Number[0]-Number[1]*Number[2];

  if(L==9)  Out_put=Number[0]/Number[1]*Number[2];

  if(L==10) Out_put=Number[0]+Number[1]/Number[2];

  if(L==11) Out_put=Number[0]-Number[1]/Number[2];

  if(L==12) Out_put=Number[0]*Number[1]/Number[2];

}

void Xian_shi()

{

 if(m!=1)

 {

  Key_scan();

        /* 显示函数  与A[i]有关 */

  P0=A[7];dula=1;dula=0; P0=C[8];wela=1;wela=0;Delay(1);

  P0=A[6];dula=1;dula=0; P0=C[7];wela=1;wela=0;Delay(1);      

  P0=A[5];dula=1;dula=0; P0=C[6];wela=1;wela=0;Delay(1);

  P0=A[4];dula=1;dula=0; P0=C[5];wela=1;wela=0;Delay(1);

  P0=A[3];dula=1;dula=0; P0=C[4];wela=1;wela=0;Delay(1);

  P0=A[2];dula=1;dula=0; P0=C[3];wela=1;wela=0;Delay(1);

  P0=A[1];dula=1;dula=0; P0=C[2];wela=1;wela=0;Delay(1);

  P0=A[0];dula=1;dula=0; P0=C[1];wela=1;wela=0;Delay(1);

 }

}

void main()

{

      while(1)

        {  

            Xian_shi();

            Yun_suan();

            show( Out_put );

         } 

}

       

           第6章 课程设计心得体会

    本设计采用STC89C52RC芯片,基本上实现了利用单片机进行了一个简单的计算器设计。允许对输入数据进行‘+’、‘-‘、‘*’、’/’运算以及数码管显示。设计的关键所在,必须非常熟悉单片机的原理与结果,同时还要对整个设计流程有很好的把握。

软件和硬件都完成之后,接下来就是将软件的控制程序写入到硬件里面,从而实现软硬结合的过程,来实现设计要求。在这个环节中我们还是遇到了或多或少的问题,例如数码管显示器不工作等问题都让我们困惑了很久,最后还是通过不断的完善代码来实现各个元器件的工作。

通过这次课程设计,我知道了学会一个东西是循序渐进的过程,会遇到很多问题很多困难,只有坚持,不放弃,才能有成果,而且在这一周的设计过程中让我深深的了解了我在软件、硬件方面的许多不足之处,对于今后的学习和工作都有了一次很好的借鉴经验。

相关推荐