计算器设计报告书

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

物理与电子信息学院电子技术综合设计报告

设计题目:基于51单片机的计算器

专业:电气工程及其自动化

学号:

姓名:

成绩:

指导教师:

基于51单片机的计算器设计

一、系统方案

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

二、硬件设计

如图1所示,该图是一个计算器的PCB线路模型。我们用到了17个键位,1个自锁开关,分别负责控制计算器的运行与电源开关。1个STC89C51单片机,负责存储与执行计算器各部分的运行状况,是整个电路的核心部分。一个LCD1602显示屏,负责计算器的显示模块。部分电阻、电容、晶振等,用来支持计算机电路的正常执行。

在此线路中,设计时未设计下载接口,但使用了电源接口代替下载口,负责电路板的供电等。

三、软件设计

首先,我们使用了Proteus设计进行仿真,确认该设计思路可执行后,通过DXP设计电路。Proteus仿真例如图2所示。原理图参考了中国电子科技论坛提供的一些相关资料,同时自己进行了适当的改进。依据Proteus所绘制的原理图,我们在Autium Designer上绘制了AD版的原理图,如图3所示。在生成PCB版图时,第一次使用的封

装为中国电子科技论坛提供的封装,但是由于该封装存在明显缺陷,即:焊盘太小,部分接口太接近等问题,然后我们将大量的元件更换至了由老师提供的封装,部分元件仍然使用原封装。在将程序下载至单片机的过程中,我借用了同学购买的单片机开发板,使用了STC 公司提供的软件

四、系统调试与结果

在使用Proteus仿真阶段,我们就开始了程序编写的任务。程序编写我们真的感觉是从0开始。因为在编写程序过程中,我们并没有完成51系列单片机的C语言程序的学习、LCD1602等元器件理论性知识的学习。编写程序时,参考了《C51单片机入门(第二版)》,《单片机原理与应用(第三版)》,以及部分网络资源。使用的软件为Keil 第四版。部分核心代码如下:

核心代码第一部分:反转法键盘扫描(参考了《C51单片机入门(第二版)》)

short keycheckdown() /* 反转法键盘扫描*/

{

short temp1,temp2,temp,a=0xff;

P1=0xf0; /* 输入行值(或列值)*/

LCD_Delay_ms(20); /* 延时*/

temp1=P1; /* 读列值(或行值)*/

P1=0xff;

LCD_Delay_ms(20); /* 延时*/

P1=0x0f; /* 输入列值(或行值)*/

LCD_Delay_ms(20); /* 延时*/

temp2=P1; /* 读行值(或列值)*/

P1=0xff;

temp=(temp1&0xf0)|(temp2&0xf); /* 将两次读入数据组合*/ switch(temp) /* 通过读入数据组合判断按键位置*/ {

case 0x77 :a=0x0d;break;// 按键/

case 0x7b :a=0x0e; break;// 按键=

case 0x7d :a=0; break;// 按键0

case 0x7e :a=0x0f; break;// 按键CE

case 0xb7 :a=0x0c;break;// 按键*

case 0xbb :a=0x9;break; // 按键9

case 0xbd :a=0x8;break; // 按键8

case 0xbe :a=0x7;break; // 按键7

case 0xd7 :a=0x0b;break;// 按键-

case 0xdb :a=0x6;break; // 按键6

case 0xdd :a=0x5;break; // 按键5

case 0xde :a=0x4;break; // 按键4

case 0xe7 :a=0x0a; break;// 按键+

case 0xeb :a=3;break; // 按键3

case 0xed :a=2;break; // 按键2

case 0xee :a=1;break; // 按键1

default :a=0xff;

}

return a; /* 返回按键值*/

}

核心代码第二部分:主函数

void main()

{

uchar key=0xff; //键值初始化

uchar n=0; //第1个数可以按1-4次uchar m=5; //第2个数可以按1-4次uchar x=0;

data_a=0; //前一个数

data_b=0; //后一个数

data_c=0; //结果

init_lcd(); //1602液晶初始化

display_a();

while(1)

{

key=keycheckdown(); /*动态扫描键盘,返回按键对应值,赋给j key=0到f */

if(0xff!=key) /*若返回值有效,进入内部处理程序*/

{

if(key<10)

{

if(n<4){data_a=data_a*10+key;m=5;display_a();}n++; //首先输入第一个数

if(m<4){data_b=data_b*10+key;n=5;display_b();}m++; //必须按了+-*/才能输入第二个数

}

else

{ switch(key) /*功能键选择*/

{

case 0xa:n=5;m=0;x=1;W_lcd(5,0,'+');break; //加/* + S=1 */ /* 数值转换函数*/

case 0xb:n=5;m=0;x=2;W_lcd(5,0,'-');break;

/* - S=2 *///减

相关文档
最新文档