计算器设计报告书
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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 *///减