找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 23486|回复: 28
打印 上一主题 下一主题
收起左侧

单片机简易计算器设计报告 论文下载

  [复制链接]
跳转到指定楼层
楼主
单片机原理与接口技术课程

考试作品报告

作品名称:简易计算器
姓    名:王海跃
专业班级:电科1401
学    号:X1920145285

中南大学物理与电子学院



目 录
摘 要……………………………………………………………………………2                                                  
引 言……………………………………………………………………………3
  • 系统整体概述 ………………………………………………………4
  • 硬件设计……………………………………………………………6
  • 软件设计 ……………………………………………………………9
  • 调试与分析…………………………………………………………13
  • 制作感受 …………………………………………………………14
附录……………………………………………………………………………15


                     
近年来随着科技的飞速发展,单片机的应用正在不断深入,同时带动传统控制检测技术日益更新。在实时检测和自动控制的单片机应用系统中,单片机往往作为一个核心部件来使用,但仅单片机方面的知识是不够的,还应根据具体硬件结构、软硬件结合,来加以完善。
计算器在人们的日常生活中是比较常见的电子产品之一。可是它还在发展之中,以后必将出现功能更加强大的计算机,基于这样的理念,本次设计是用AT89C51单片机、LCD液晶显示器、控制按键等为元件来设计的计算器。利用此设计熟悉单片机微控制器及C语言编程,对其片资源及各个I/O端口的功能和基本用途的了解。掌握Microsoft Visual C++ 6.0及Keil软件应用程序开发环境,常用的LCD显示器的使用方法和一般键盘的使用方法。




引言

    当今社会,随着人们物质生活的不断提高,电子产品已经走进了家家户户,无论是生活或学习,还是娱乐和消遣几乎样样都离不开电子产品,大型复杂的计算能力是人脑所不能胜任的,而且比较容易出错。计算器作为一种快速通用的计算工具方便了用户的使用。计算器可谓是我们最亲密的电子伙伴之一。计算器一般由运算器、控制器、存储器、键盘、显示器、电源和一些可选外围设备及电子配件通过人工或机器设备组成。键盘是计算器的输入部件,一般采用接触式或传感式。为减小计算器的尺寸,一键常常有多种功能。显示器是计算器的输出部件,有发光二极管显示器和液晶显示器等。除显示计算结果外,还常有溢出指示、错误指示等。
    人们利用计算器代替了许多复杂计算,包括加减乘除和其他运算。尤其是小型计算器,它携带方便,在生活中用起来方便快捷,成为了财政、学习、生意上都青睐的必需品。它的需求广泛,在计算器的发展上存在很大的空间和市场意义。单片机在我国的各行各业得到了广泛使用,单片机的出现是计算机制造技术高速发展的产物,它是嵌入式控制系统的核心。如今,它已经广泛应用到我们生活中的各个领域,用单片机可以很方便的实现计算器的设计。
    众所周知单片机是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能集成到一块硅片上构成的一个小而完善的计算机系统。单片机由于其微小的体积和极低的成本,广泛的应用于家用电器、工业控制等领域中。在工业生产中。单片微型计算机是微型计算机的一个重要分支,也是颇具生命力的机种。单片微型计算机简称单片机,特别适用于控制领域,故又称为微控制器。


第一章  系统整体概述

1.1 设计目的

应用《单片机应用基础》、《计算机应用基础》等所学相关知识及查阅资料,完成简易计算器的设计,以达到理论与实践更好的结合、进一步提高综合运用所学知识和设计的能力的目的。

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

主要完成如下方面的设计任务:

1、简要阐述单片机技术发展的国内外现状及LED动态显示和矩阵键盘基本原理;

2、掌握MCS-51系列某种产品(例如8051)的最小电路及外围扩展电路的设计方法;

3、了解单片机数据转换功能及工作过程;

4、完成主要功能模块的硬件电路设计及必要的参数确定.

1.2 计算器设计总体思想

根据功能和指示要求,本系统选用以51单片机为主控机。通过扩展必要的外围接口电路,实现对计算器的设计。

具体设计如下:

1、由于要设计的是简单的计算器,可以进行四则运算,为了得到教好的显示效果,采用LCD显示数据和结果。

2、另外键盘包括数字键(0-9)、符号键(+、-、*、/)、清除键和等号键,故只需要16个按键即可,设计中采用集成的计算机键盘。

3、执行程序:开机显示零,等待键入数值,当键入数字,通过LCD显示出来,当键入+、-、*、/运算符,计算器在内部执行数值转换和存储,并等待再次键入数值后将显示键入的数值,按等号就会在LCD上输出运算结果。

4、错误提示:当单片机执行程序中有错误时,会在LCD上显示相应的提示,如:当输入的数值或计算器得到的结果大于计算器的显示范围时,计算器会在LCD上提示溢出;当除数为0时,计算器会在LCD上提示错误。


1.3系统的组成

计算器设计硬件电路采用三部分电路模块构成,第一部分是键盘模块电路,采用4*4矩阵式键盘作为输入电路;第二部分是LCD1602液晶显示模块;第三部分是以51单片机作为控制核心。软件程序主要由三部分组成:主程序、按键扫描程序和LCD1602显示程序。


图片在51hei附件中
图 系统组成及总体框图

本系统就是充分利用了8051芯片的I/O引脚。系统以采用MCS-51系列单片机Intel8051为中心器件来设计计算器控制器,实现了能根据实际输入值显示并存储的功能,计算程序则是参照教材。

本计算器是以MCS-51系列8051单片机为核心构成的简易计算器系统。该系统通过单片机控制,实现对4*4键盘扫描进行实时的按键检测,并把检测数据存储下来。整个计算器系统的工作过程为:首先存储单元初始化,显示初始值和键盘扫描,判断按键位置,查表得出按键值,单片机则对数据进行储存与相应处理转换,之后送入LED显示器动态显示。整个系统可分为三个主要功能模块:功能模块一,实时键盘扫描;功能模块二,数据转换成显示器显示;功能模块三,显示器动态显示。


硬件系统设计

硬件系统是指构成微机系统的实体和装置,通常由运算器、控制器、存储器、输入接口电路和输入设备、输出接口电路和输出设备等组成。单片机实质上是一个硬件的芯片,在实际应用中,通常很难直接和被控对象进行电气连接,必须外加各种扩展接口电路、外部设备、被控对象等硬件和软件,才能构成一个单片机应用系统。本设计选用以AT89S51单片机为主控单元。显示部分:采用LCD静态显示。按键部分,采用4*4键盘。 硬件电路原理图如图2.1所示:

  图2.1 硬件电路原理图

2.1 键盘接口电路

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

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

图2.2 矩阵键盘内部电路

2.2 LCD显示模块

本设计采用LCD液晶显示器来显示输出数据。LCD的特性有:1、+5V电压,对比可调度;2、内含复位电路;3、提供各种控制命令,如:清屏、字符闪烁、光标闪烁、显示移位等多种功能;4、有80字节显示数据存储器DDRAM;5、内建有160个5X7点阵的字型的字符发生器CGROM;6、8个可由用户自定义的5X7的字符发生器CGRAM。

本设计通过D0-D7引脚向LCD写指令字或写数据以使LCD实现不同的功能或显示相应的数据。其接口电路如图2.3所示。

                    图2.3 LCD接口电路

LCD的引脚说明如表2.1所示:

                表2.1 LCD的引脚说明

符号

引脚说明

符号

引脚说明

VSS

电源地

DB4

Data  I/O

VDD

电源正极(+5V)

DB5

Data  I/O

V0

液晶显示偏压输入

DB6

Data  I/O

RS

数据/命令选择端(H/L)

DB7

Data  I/O

R/W

读写控制信号(H/L)

CS1

片选IC1信号

E

使能信号

CS2

片选IC2信号

DB0

Data  I/O

RST

复位端(H:正常工作,L:复位)

DB1

Data  I/O

VEE

负电源输出(-10V)

DB2

Data  I/O

BLA

背光源正极(+4.2)

DB3

Data  I/O

BLK

背光源正极


2.3 运算模块

MCS-51单片机是在一块芯片中集成了CPU、RAM、ROM、定时器/计数器和多功能I/O等计算机所需要的基本功能部件。如果按功能划分,它由以下功能部件组成,即微处理器(CPU),数据存储器(RAM),程序存储器(ROM/EPROM),并行I/O口,串行口,定时器/计数器,中断系统及特殊功能寄存器(SFR)。单片机是靠程序运行的,并且可以修改。通过不同的程序实现不同的功能,尤其是特殊的一些功能,通过使用单片机编写的程序可以实现高智能、高效率以及高可靠性,因此采用单片机作为计算器的主要功能部件,可以很快的实现运算功能。

运算模块由键盘和显示屏组成。单片机通过按键来实现输入数据和操作方式的控制,在运算过程中,对所设的数据进行四则运算时,要先确定选用的是哪一个运算符,若是+或*,则要判断结果是否会溢出,溢出则显示错误提示,没有溢出则显示运算结果,若是/,则要判断除数是否为零,为零时显示错误提示,不为零显示运算结果。

软件设计
3.1 语言的特点及选择

本设计是硬件电路和软件编程相结合的设计方案,选择合适的编程语言是一个重要的环节。在单片机的应用系统程序设计时,常用的是汇编语言和C语言。机硬件,程序可读性和可移植性比较差。而C语言虽然执行效率没有汇编语言高,但语言简洁,使用方便,灵活,运算丰富,表达化类型多样化,数据结构类型丰富,具有结构化的控制语句,程序设计自由度大,有很好的可重用性,可移植性等特点。

由于现在单片机的发展已经达到了很高的水平,内部的各种资源相当的丰富,CPU的处理速度非常的快。用C语言来控制单片机无疑是一个理想的选择。所以在本设计中采用C语言编写软件程序。主程序的设计详见附录三。

3.2 键扫程序设

键扫程序的过程为:开始时,先判断是否有键闭合,无键闭合时,返回继续判断,有键闭合时,先去抖动,然后确定是否有键按下,若无键按下,则返回继续判断是否有键闭合,若有键按下,则判断键号,然后释放,若释放按键完毕,则返回,若没有释放按键,则返回继续释放。其流程图如图3.1所示。

图3.1 键扫程序流程图

3.3 算术运算程序设计

算术运算程序的过程为:先判断输入的运算符是+、-、*、/ 中的哪一个,若是+或-,则要判断运算结果是否溢出,溢出则显示错误信息,没溢出就显示运算结果,若是/,则要先判断除数是否为零,为零就显示错误信息,不为零则显示运算结果,若是-,则直接显示运算结果。其流程图如图3.2所示。




图3.2 算术运算程序设计流程图
3.4 显示程序设计

显示程序的过程为:显示开始时,先进行LCD的初始化,判断是否显示汉字或ACSII码或图形,若不显示,则返回,若显示的是汉字或ACSII码,则进行相应功能的设置,然后送地址和数据,再判断是否显示完,显示完则返回,没有显示完则继续送地址,若显示的是图形,则先进行相应功能的设置,再送行地址和列地址,然后送数据,最后判断是否显示完,显示完则返回,没有显示完则继续送行地址和列地址。其流程图如图3.3所示。































图3.3 显示程序流程图
调试与分析
4
.1 硬件调试

常见故障:

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

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

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

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

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

本次硬件调试过程中,对所出现的问题进行了认真的分析和改正,最后能够很好的达到设计要求的效果。

4.2 软件调试

软件调试分为以下四个阶段:1、 编写程序并查错;2、在C语言的编译系统中编译源程序3、对程序进行编译连接,并及时发现程序中存在的错误;4、改正错误。

在本次调试中出现的问题有:

1、在程序中有的函数名未定义;

2、在抄录程序时,少录入一些字符,如:“;”、“{”、“-”等符号,而出现错误;

3、有一些函数名录入时少写一个字母或顺序颠倒;

4、没有注意函数名的调用及定义;

5、芯片引脚定义出错而导致没有实验现象。

在软件调试过程中,对出现的错误进行了认真的分析和修改,多次调试成功后,能够很好的达到既定的设计效果。

第五章 制作感受

通过这个作品的设计,收获颇多,当我开始准备做单片机作品设计的时候,设计什么都是我十分困惑的,无意中室友找我借计算器去考试,灵感就来了,没错就设计计算器了,于是便搜集各种关于计算器的相关资料。开始感觉设计出来应该会很难,不过,经过不断地努力之后,了解计算器的工作原理,设计计算器的电路原理图和实物图,然后便到网上买需要的电子元器件了,经过一些时日各种东西都已准备齐全,说干就干,按照原理图一步步进行焊接。做起来越来越来劲,感觉很有趣的样子,都说兴趣是最好的老师,果然没错。

当我刚刚做完这个作品第一次进行功能运行的时候,没有成功,当时心里有些无奈,经过几天的布线焊接最终却没成功,有点点小失落。当然不是每个人都能一次就能做成的,便进行各种检查调试,经过几番周折最后勉强能实现功能了,但是还有些不尽人意,不过当时已有一种成功的喜悦感了。再经过不断地进行修改完善,终于达到了我想要的效果,这时的我感觉自己棒棒哒,自己也能做出计算器了。这个过程中除了学到知识以外,还感受到了坚持努力最终就会取得自己想要的成绩。












附录一:计算器proteus仿真图

附录二:元器件清单

1
10uf
直插电解电容
1
2
30P
直插瓷片电容
2
3
10K
9脚排阻
1
4
LCD1602
LCD1602液晶显示器
1
5
POWER
DC电源插座
1
6
2.2k
色环电阻
1
7
10K
2
8
SW-PB
按键6X6X5MM
17
9
SWITCH
自锁开关
1
10
STC89C51/52
51单片机
1
11
12MHZ
晶振
1
12
导线
XXcm
1
13
焊锡
XXcm
1
14
USB转DC3.5mm电源线
系统供电
1
15
9*15万用板

1
16
单片机插座
40脚IC座
1
17
DC电源头
DC插头 3.5-1.35MM
1
18
LCD1602插座
16P排母
1
19
LCD1602引出脚
16P排针
1

附录三:源程序


  1. /*
  2. 接盘按键说明:
  3. --------------------------------------------------
  4.             |  1  |  2  |  3  |  +  |
  5.             - - - - - - - - - - - - -
  6.             |  4  |  5  |  6  |  -  |
  7.             - - - - - - - - - - - - -
  8.             |  7  |  8  |  9  |  *  |
  9.             - - - - - - - - - - - - -
  10.                                           |  C  |  0  |  =  |  /  |
  11. --------------------------------------------------*/
  12. //操作简介
  13. // 按第一个数,再按'+-*/',再按'='显示出结果,然后按C清屏
  14. // 加最大9999+9999=19998
  15. // 减最大9999-0   =9999
  16. // 乘最大9999*9999=99980001
  17. // 除 1/9=0.1111 保留小数点后4位
  18. #include<reg51.h>
  19. #define uint unsigned int
  20. #define uchar unsigned char
  21. //--------LCD1602-------------------
  22. //P00-07==== D0-7
  23. sbit rs=P2^5;        //指令or数据
  24. sbit wela=P2^6;      //读or写
  25. sbit lcden=P2^7;              //使能信号
  26. //--------LCD1602-------------------
  27. //--------KEY-----------------------
  28. //P1口
  29. //--------KEY-----------------------
  30. uchar code table[]= "                ";

  31. long  int data_a,data_b;               //第一个数和第二个数
  32. long  int data_c;                                          //计算结果

  33. uchar dispaly[10];         //显示缓冲

  34. //************************************************************************/
  35. // 描述: 延时t us函数
  36. //************************************************************************/
  37. void LCD_Delay_us(unsigned int t)
  38. {
  39.               while(t--);           //t=0,退出
  40. }
  41. //************************************************************************/
  42. // 描述: 延时t ms函数
  43. //************************************************************************/
  44. void LCD_Delay_ms(unsigned int t)
  45. {
  46.               unsigned int i,j;
  47.               for(i=0;i<t;i++)                                   //执行t次循环
  48.               for(j=0;j<113;j++)                                 //执行113次循环
  49.               ;
  50. }
  51. //************************************************************************/
  52. // 描述: 1602液晶写指令
  53. //************************************************************************/
  54. void write_com(uchar com)                  //1602液晶写指令
  55. {
  56.               rs=0;                       //写指令
  57.               lcden=0;                    //使能1602
  58.               P0=com;                     //写入指令com
  59.               LCD_Delay_ms(1);            //延时1ms
  60.               lcden=1;                    //使能1602
  61.               LCD_Delay_ms(2);            //延时2ms
  62.               lcden=0;                              //使能1602
  63. }
  64. //************************************************************************/
  65. // 描述:1602液晶写数据
  66. //************************************************************************/
  67. void write_date(uchar date) //1602液晶写数据
  68. {
  69.               rs=1;                        //写数据
  70.               lcden=0;                     //使能1602
  71.               P0=date;                     //写入数据date
  72.               LCD_Delay_ms(1);             //延时1ms
  73.               lcden=1;                     //使能1602
  74.               LCD_Delay_ms(2);             //延时2ms
  75.               lcden=0;                               //使能1602
  76. }
  77. //************************************************************************/
  78. // 描述:指定x,y写入字符函数
  79. //************************************************************************/
  80. void W_lcd(unsigned char x,unsigned char y,unsigned char Data)
  81. {   
  82.               if (y == 0){write_com(0x80 + x);}   //第一行
  83.               else{write_com(0xc0 + x);}          //第二行
  84.               write_date( Data);                  //写入数据
  85. }
  86. //指定x,y写入字符串函数
  87. void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
  88. {   
  89. if (y == 0){write_com(0x80 + x);}                             //第一行
  90. else{write_com(0xC0 + x);}                                    //第二行
  91. while (*s)                                                    //
  92.               {write_date( *s); s++;}                                  //写入数据
  93. }
  94. //************************************************************************/
  95. // 描述:初始化液晶,及画面初始化
  96. //************************************************************************/
  97. void init_lcd(void)            //初始化液晶,及画面初始化
  98. {
  99.               wela=0;                      //写液晶
  100.               lcden=0;                     //使能1602
  101.               write_com(0x38);             //8 位总线,双行显示,5X7 的点阵字符
  102.               LCD_Delay_us(100);           //延时100us
  103.               write_com(0x0c);             //开显示,无光标,光标不闪烁
  104.               write_com(0x06);             //光标右移动
  105.               write_com(0x01);             //清屏
  106.               write_com(0x80);             //DDRAM 地址归0
  107. }
  108. //************************************************************************/
  109. // 描述: 反转法键盘扫描
  110. //************************************************************************/
  111. short keycheckdown()                                                        /* 反转法键盘扫描 */
  112. {

  113.               short temp1,temp2,temp,a=0xff;
  114.               P1=0xf0;                                                                                    /* 输入行值(或列值) */
  115.               LCD_Delay_ms(20);                                                        /* 延时 */
  116.               temp1=P1;                                                                                    /* 读列值(或行值) */
  117.               P1=0xff;
  118.               LCD_Delay_ms(20);                                                        /* 延时 */
  119.               P1=0x0f;                                                                                    /* 输入列值(或行值) */
  120.               LCD_Delay_ms(20);                                                        /* 延时 */            
  121.               temp2=P1;                                                                                    /* 读行值(或列值) */
  122.               P1=0xff;
  123.               temp=(temp1&0xf0)|(temp2&0xf);              /* 将两次读入数据组合 */
  124.               switch(temp)                                                                      /* 通过读入数据组合判断按键位置 */
  125.               {


  126.                             case 0x77 :a=0x0d;break;//  按键/  
  127.                             case 0x7b :a=0x0e; break;// 按键=            
  128.                             case 0x7d :a=0;                 break;// 按键0
  129.                             case 0x7e :a=0x0f; break;// 按键CE

  130.                             case 0xb7 :a=0x0c;break;//               按键*
  131.                             case 0xbb :a=0x9;break; //  按键9
  132.                             case 0xbd :a=0x8;break; //  按键8
  133.                             case 0xbe :a=0x7;break; //               按键7

  134.                             case 0xd7 :a=0x0b;break;//  按键-
  135.                             case 0xdb :a=0x6;break; //               按键6
  136.                             case 0xdd :a=0x5;break; //               按键5
  137.                             case 0xde :a=0x4;break; //               按键4

  138.                             case 0xe7 :a=0x0a; break;// 按键+
  139.                             case 0xeb :a=3;break;              //  按键3
  140.                             case 0xed :a=2;break;              //  按键2
  141.                             case 0xee :a=1;break;              //  按键1

  142.                             default :a=0xff;
  143.               }
  144.               return a;                                                                                    /* 返回按键值 */
  145. }
  146. void display_a() //显示数据a
  147. {
  148.               dispaly[3]=data_a%10000/1000;    //千
  149.               dispaly[2]=data_a%1000/100;      //百
  150.               dispaly[1]=data_a%100/10;        //十
  151.               dispaly[0]=data_a%10;            //个

  152.               write_com(0x80+0);               //显示数据a
  153.               if(data_a>999){              write_date('0'+dispaly[3]);}      //显示千位
  154.               if(data_a>99){              write_date('0'+dispaly[2]);}                            //显示百位
  155.               if(data_a>9){              write_date('0'+dispaly[1]);}     //显示十位
  156.                                           write_date('0'+dispaly[0]);      //显示个位
  157. }

  158. void display_b() //显示数据b
  159. {
  160.               write_com(0x80+7); //第一行
  161.               dispaly[3]=data_b%10000/1000;    //千
  162.               dispaly[2]=data_b%1000/100;      //百
  163.               dispaly[1]=data_b%100/10;        //十
  164.               dispaly[0]=data_b%10;            //个

  165. if(data_b>999){              write_date('0'+dispaly[3]); }     //显示千位  
  166. if(data_b>99) {              write_date('0'+dispaly[2]); }    //显示百位
  167. if(data_b>9)  {              write_date('0'+dispaly[1]); }     //显示十位
  168.                                                 write_date('0'+dispaly[0]);      //显示个位
  169. }

  170. //计算结果
  171. void display_c(x)
  172. {

  173.               if(data_c<100000000&&data_c>-1)//溢出时显示错误
  174.               {            

  175.                             dispaly[8]=data_c%1000000000/100000000;                  //万万
  176.                             dispaly[7]=data_c%100000000/10000000;                  //千万
  177.                             dispaly[6]=data_c%10000000/1000000;                                //百万
  178.                             dispaly[5]=data_c%1000000/100000;                                //十万
  179.                             dispaly[4]=data_c%100000/10000;                                              //万
  180.                             dispaly[3]=data_c%10000/1000;                                              //千
  181.                             dispaly[2]=data_c%1000/100;                                                //百
  182.                             dispaly[1]=data_c%100/10;                                                  //十
  183.                             dispaly[0]=data_c%10;                                                      //个
  184.                             write_com(0x80+6+0x40); //第一行
  185.                             if(x==4)
  186.                             {   
  187.                             if(data_c>99999999)              {              write_date('0'+dispaly[8]);}    //显示万万
  188.                             if(data_c>9999999)              {              write_date('0'+dispaly[7]);}   //千万
  189.                             if(data_c>999999)              {              write_date('0'+dispaly[6]);}    //百万
  190.                             if(data_c>99999)              {              write_date('0'+dispaly[5]);}    //十万
  191.                                                                                                                 write_date('0'+dispaly[4]);    //万
  192.                                                                                                                 write_date('.');
  193.                                                                                                                 write_date('0'+dispaly[3]);    //千
  194.                                                                                                                 write_date('0'+dispaly[2]);    //百
  195.                                                                                                                 write_date('0'+dispaly[1]);    //十
  196.                                                                                                                 write_date('0'+dispaly[0]);    //个
  197.                             }
  198.               else{
  199.                             if(data_c>99999999)              {              write_date('0'+dispaly[8]);}    //显示万万
  200.                             if(data_c>9999999)              {              write_date('0'+dispaly[7]);}    //千万
  201.                             if(data_c>999999)              {              write_date('0'+dispaly[6]);}    //百万
  202.                             if(data_c>99999)              {              write_date('0'+dispaly[5]);}    //十万
  203.                             if(data_c>9999)                            {              write_date('0'+dispaly[4]);}    //万
  204.                             if(data_c>999)                            {              write_date('0'+dispaly[3]);}    //千
  205.                             if(data_c>99)                            {              write_date('0'+dispaly[2]);}    //百
  206.                             if(data_c>9)                            {              write_date('0'+dispaly[1]);}    //十
  207.                                                                                                                 write_date('0'+dispaly[0]);    //个
  208.                             }
  209.               }
  210.               else  //溢出时显示错误
  211.               {
  212.                             write_com(0x80+11+0x40); //第一行
  213.                             write_date('E');         //显示 E
  214.                             write_date('r');         //显示R
  215.                             write_date('r');                            //显示R
  216.                             write_date('o');                            //显示O
  217.                             write_date('r');                            //显示E
  218.               }
  219. }

  220. void eql(uchar x)//加减乘除运算
  221. {
  222.               switch(x)                            /*功能键选择*/
  223.                                           {  
  224.                                                         case 1:data_c=data_a+data_b;break;                               //加  /* + S=1 */ /* 数值转换函数 */                                                                                                                             
  225.                                                         case 2:if(data_a>=data_b){data_c=data_a-data_b;} /* - S=2 *///减
  226.                        else{data_c=data_b-data_a;W_lcd(5,1,'-');} //负数符号
  227.                                                                          break;               
  228.                                                         case 3:data_c=(data_a*data_b);break;                              /* * S=3 *///乘
  229.                                                         case 4:if(data_b==0){LCD_Write_String(0,1,"Error !");}else{data_c=(data_a*10000)/data_b;}break;                              /* / S=4 *///除//溢出时显示错误
  230.                                                         case 0:break;
  231.                                           }               

  232. }

  233. void main()
  234. {
  235.               uchar   key=0xff;               //键值初始化
  236.               uchar   n=0;                                                                      //第1个数可以按1-4次
  237.               uchar   m=5;                                                                       //第2个数可以按1-4次
  238.               uchar   x=0;
  239.               data_a=0;                       //前一个数
  240.               data_b=0;                       //后一个数
  241.               data_c=0;                       //结果
  242.               init_lcd();                                                                        //1602液晶初始化
  243.               display_a();
  244.     while(1)
  245.                 {
  246.                               key=keycheckdown();                                          /*动态扫描键盘,返回按键对应值,赋给j        key=0到f */
  247.                             if(0xff!=key)                                                        /*若返回值有效,进入内部处理程序*/
  248.                             {
  249.                               if(key<10)
  250.                               {
  251.                       if(n<4){data_a=data_a*10+key;m=5;display_a();}n++;  //首先输入第一个数
  252.                                 if(m<4){data_b=data_b*10+key;n=5;display_b();}m++;  //必须按了+-*/才能输入第二个数                           
  253.                               }
  254.           else
  255.           {              switch(key)                            /*功能键选择*/
  256.                                                                       {
  257.                                                                                     case 0xa:n=5;m=0;x=1;W_lcd(5,0,'+');break; //加 /* + S=1 */ /* 数值转换函数 */                                                                                                                             
  258.                                                                                     case 0xb:n=5;m=0;x=2;W_lcd(5,0,'-');break;                              /* - S=2 *///减
  259.                                                                                     case 0xc:n=5;m=0;x=3;W_lcd(5,0,'*');break;                              /* * S=3 *///乘
  260.                                                                                     case 0xd:n=5;m=0;x=4;W_lcd(5,0,'/');break;                              /* / S=4 *///除
  261.                                                                                     case 0xe:n=5;m=5;eql(x);W_lcd(12,0,'=');display_c(x);break;   

  262. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

完整论文下载(word格式 可编辑):
单片机作品之计算器设计报告.doc (622.26 KB, 下载次数: 299)


评分

参与人数 3黑币 +15 收起 理由
林木林 + 5 很给力!
l278966232 + 5
454656432 + 5 很给力!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶5 踩
回复

使用道具 举报

沙发
ID:277109 发表于 2018-1-17 18:48 | 只看该作者
受教了
回复

使用道具 举报

板凳
ID:277230 发表于 2018-1-18 08:24 来自手机 | 只看该作者
看来挺不错的资料
回复

使用道具 举报

地板
ID:347385 发表于 2018-6-8 11:06 | 只看该作者
不错的资料,学习了
回复

使用道具 举报

5#
ID:358645 发表于 2018-6-25 16:51 | 只看该作者
很厉害
回复

使用道具 举报

6#
ID:363545 发表于 2018-7-2 21:56 | 只看该作者
太棒了,帮大忙了
回复

使用道具 举报

7#
ID:368586 发表于 2018-7-10 12:02 | 只看该作者
很给力
回复

使用道具 举报

8#
ID:342128 发表于 2018-7-10 15:26 | 只看该作者
很好的分享 感谢
回复

使用道具 举报

9#
ID:369931 发表于 2018-7-12 09:27 | 只看该作者
大佬。。。
回复

使用道具 举报

10#
ID:369931 发表于 2018-7-12 09:28 | 只看该作者
请问你这个有prodeus的仿真电路图
回复

使用道具 举报

11#
ID:325250 发表于 2018-7-13 09:08 | 只看该作者
多谢多谢
回复

使用道具 举报

12#
ID:399809 发表于 2018-9-19 09:05 | 只看该作者
感谢楼主分享
回复

使用道具 举报

13#
ID:400039 发表于 2018-9-19 15:37 来自手机 | 只看该作者
学习到了,确实很好
回复

使用道具 举报

14#
ID:434835 发表于 2018-11-28 11:29 | 只看该作者
谢谢了,刚好急需
回复

使用道具 举报

15#
ID:438408 发表于 2018-12-3 14:57 来自手机 | 只看该作者
上课刚好可以用到!谢谢!
回复

使用道具 举报

16#
ID:443436 发表于 2018-12-10 16:56 | 只看该作者
最近在做单片机的实习,正需要这篇帖子,奈斯
回复

使用道具 举报

17#
ID:443718 发表于 2018-12-15 22:09 | 只看该作者
为什么跟楼主连的一样,仿真的时候按键盘没有反应啊
回复

使用道具 举报

18#
ID:447541 发表于 2018-12-17 00:08 | 只看该作者
很实用!
回复

使用道具 举报

19#
ID:453458 发表于 2018-12-24 14:47 | 只看该作者
很棒的这个程序
回复

使用道具 举报

20#
ID:453458 发表于 2018-12-24 14:49 | 只看该作者
很棒的这个程序、、
回复

使用道具 举报

21#
ID:456730 发表于 2018-12-27 22:56 | 只看该作者
网上都是lcd1602
回复

使用道具 举报

22#
ID:457268 发表于 2018-12-28 14:03 | 只看该作者
感谢分享
回复

使用道具 举报

23#
ID:460483 发表于 2019-1-2 21:23 | 只看该作者
感谢分享
回复

使用道具 举报

24#
ID:482132 发表于 2019-2-28 15:36 | 只看该作者
谢谢 正好用到
回复

使用道具 举报

25#
ID:513165 发表于 2019-4-24 14:25 | 只看该作者
早就想自己做了
回复

使用道具 举报

26#
ID:559525 发表于 2019-6-11 07:49 来自手机 | 只看该作者
思路清醒,我们老师说搞工程或者项目关键在于你怎么想,最后才去实现,我认为重要的不是源代码,而是思路
回复

使用道具 举报

27#
ID:559780 发表于 2019-6-11 11:29 | 只看该作者
看起来很好,谢谢
回复

使用道具 举报

28#
ID:787036 发表于 2020-6-23 10:29 | 只看该作者
为啥我这边操作后运行程序显示目标没有被创造
回复

使用道具 举报

29#
ID:787436 发表于 2020-6-23 16:21 | 只看该作者
很不错的资料
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表