51单片机简易计算器论文

华侨大学厦门工学院单片机控制系统题目:通信3班专业、班级:

学生姓名:

学号:指导教师:年月日

目录

一、设计任务目的........................................................................................................2

二、计任务要求............................................................................................................2

三、设计方案选取与论证............................................................................................2

四、电路设计................................................................................................................3

4.1总体电路图.......................................................................................................34.2硬件设计..........................................................................................................44.2.1矩阵按键.................................................................................................44.2.2STC89C52主芯片..................................................................................44.2.3LCD 显示................................................................................................64.3软件设计...........................................................................................................74.3.1键盘模块................................................................................................74.3.2计算模块................................................................................................84.3.3显示模块................................................................................................9五. 制作及调试过程.......................................................................................................9

5.1制作过程......................................................................................................105.2软件调试........................................................................................................105.3硬件调试........................................................................................................11结论..............................................................................................................................12致谢..............................................................................................................................13参考文献......................................................................................................................13附件..............................................................................................................................14

附录1. 程序代码...................................................................................................14附录2. 元器件清单...............................................................................................22

一、设计任务目的

设计一个计算器,可以进行简易的四则运算。

二、计任务要求

1、能够进行简单的四则运算,包括带负数的运算。用LCD 显示数据和结果(6位即可)

2、采用键盘输入方式,键盘包括数字键(0~9)、符号(+、-、×、÷)、清除键(c)和等号键(=),故只需要16个按键即可。

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

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

三、设计方案选取与论证

根据功能和指示要求,本系统选用51单片机为主控机。通过扩展必要的外围电路接口实现计算的设计。具体如下:1、由于要设计的是简单的计算器,可以进行四则运算,为了得到较好的显示效果,采用LCD 显示数据和结果。2、另外键盘包括数字键(0~9)、符号键(+、-、*、/)、清除键和等号键,故采用4*4按键。3、执行程序:开机显示字符串,等待键入数值,当键入数值,通过LCD 显示,当键入+、-、*、/时计算器在内部执行数值转换和存储,并等待再次键入数值并等待执行等号程序。整个系统可分为三个主要的功能模块:一、实时键盘扫描;二、数据转换成显示器显示;三、显示器的动态显示。其系统结框图如

下:

根据设计的电路流程选择的系统方案是:

(1):采用STC89C52作为主控芯片;

(2):显示模块使用LCD1602液晶显示;

(3):输入模块使用4*4矩阵键盘输入;

选取此种设计方案,可以基本满足任务要求,并且在电路板焊接中更清晰明了的知道该如何去焊接电路。但是,这种方案还是存在着不足,如:①按键的缺少导致取消了一些特殊函数的实现。和我们真正可以的计算器有很大的差距,功能的单一,在实际中没有使用价值。②使用3字节的浮点数表示,不可避免的带来了数表示的不精确,加上有效数字比较少,因此计算结果很容易产生误差,尤其是进行连续多次运算后。

四、电路设计

4.1总体电路图

根据方案的选取,其硬件的电路图在protues 软件中设计如下图所示,本电

路图可以满足设计要求。

4.2硬件设计

4.2.1矩阵按键

键盘是单片机系统中最常用的人机对话输入设备,用户通过按键向单片机输入指令和数据。该模块利用16个的小按键,提供0-9,+、-、*、/、=、清零键。键盘控制程序需完成的任务有:给电路提供输入的符号,让LCD 显示屏显示输入的按键是什么。在编写的程序中,可以检查是否有按键按下, 有键按下时, 如无硬件去抖动电路时,应用软件延时方法消除按键抖动;当有多个按键按下时, 只响应一个按键,不管持续多长时间,仅执行一次按键功能程序。其结构图如下所

示:

矩阵键盘结构图

4.2.2STC89C52主芯片

STC89C52是一种带8K 字节闪烁可编程可檫除只读存储器(FPEROM-Flash Programable and Erasable Read Only Memory )的低电压,高性能COMOS8的微处理器,俗称单片机。该器件采用ATMEL 搞密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。ST89C52单片机包含中央处理器、程序存储器、数据存储器、定时/计数器、并行接口、串行接口和中断系统等几大单元及数据总线、地址总线和控制总线等三大总线。

时钟电路:STC89C52内部有一个用于构成振荡器的高增益反相放大器,引脚RXD 和TXD 分别是此放大器的输入端和输出端。时钟可以由内部方式产生或外部方式产生。内部方式的时钟电路如图4—2(a)所示,在RXD 和TXD 引脚

上外接定时元件,内部振荡器就产生自激振荡。定时元件通常采用石英晶体和电容组成的并联谐振回路。晶体振荡频率可以在1.2~12MHz 之间选择,电容值在5~30pF 之间选择,电容值的大小可对频率起微调的作用。

TXD 接外部振荡器。外部方式的时钟电路如图4—2(b )所示,RXD 接地,

对外部振荡信号无特殊要求,只要求保证脉冲宽度,一般采用频率低于12MHz 的方波信号。片内时钟发生器把振荡频率两分频,产生一个两相时钟P1和P2,

供单片机使用。

(a )外部方式时钟电路(b )内部方式时钟电路

复位及复位电路:(1)复位操作,复位是单片机的初始化操作。其主要功能是把PC 初始化为0000H ,使单片机从0000H 单元开始执行程序。除了进入系统的正常初始化之外,当由于程序运行出错或操作错误使系统处于死锁状态时,为摆脱困境,也需按复位键重新启动。除PC 之外,复位操作还对其他一些寄存器有影响,;(2)复位信号及其产生,RST 引脚是复位信号的输入端。复位信号是高电平有效,其有效时间应持续24个振荡周期(即二个机器周期) 以上。若使用颇率为6MHz 的晶振,则复位信号持续时间应超过4us 才能完成复位操作。整个复位电路包括芯片内、外两部分。外部电路产生的复位信号(RST)送至施密特触发器,再由片内复位电路在每个机器周期的S5P2时刻对施密特触发器的输出进行采样,然后才得到内部复位操作所需要的信号。复位操作有上电自动复位相按键手动复位两种方式。本系统的复位电路采用上电复位方式。

STC89C52具体介绍如下:

①主电源引脚(2根)VCC(Pin40):电源输入,接+5V 电源GND(Pin20):接地线②外接晶振引脚(2根)XTAL1(Pin19):片内振荡电路的输入端XTAL2(Pin20):片内振荡电路的输出端③控制引脚(根)RST/VPP(Pin9):复位引脚,引脚上出现2个机器周期的高电平将使单片机复位。ALE/PROG(Pin30):地址锁存允许信号PSEN(Pin29):外部存储器读选通信

号EA/VPP(Pin31):程序存储器的内外部选通,接低电平从外部程序存储器读指令,如果接高电平则从内部程序存储器读指令。④可编程输入/输出引脚(32根)STC89C52单片机有4组8位的可编程I/O口,分别位P0、P1、P2、P3口,每个口有8位(8根引脚),共32根。PO 口(Pin39~Pin32):8位双向I/O口线,名称为P0.0~P0.7P1口(Pin1~Pin8):8位准双向I/O口线,名称为P1.0~P1.7P2口(Pin21~Pin28):8位准双向I/O口线,名称为P2.0~P2.7,P3口(Pin10~Pin17):8位准双向I/O口线,名称为P3.0~P3.7

STC89C52

的外部结果如下图:

STC89C52

主要功能:

4.2.3LCD 显示

1602LCD 采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如下所示

:

LCD 结构图

第1脚:VSS 为地电源。

第2脚:VDD 接5V 正电源。

第3脚:VEE 为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K 的电位器调整对比度。

第4脚:RS 为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。

第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS 和R/W共同为低电平时可以写入指令或者显示地址,当RS 为低电平R/W为高电平时可以读忙信号,当RS 为高电平R/W为低电平时可以写入数据。

第6脚:E 端为使能端,当E 端由高电平跳变成低电平时,液晶模块执行命令。第7~14脚:D0~D7为8位双向数据线。

第15脚:背光源正极。

第16脚:背光源负极。

4.3软件设计

软件设计和硬件设计一样也由三部分组成,其中包括:键盘模块、显示模块、计算模块,现分别对这三部分分别介绍。

4.3.1键盘模块

矩阵按键扫描程序是一种节省IO 口的方法, 按键数目越多节省IO 口就越可

观,思路:先判断某一列(行)是否有按键按下,再判断该行(列)是那一只键按下。但是,在程序的写法上,采用了最简单的方法,使得程序效率最高。本程序中,如果检测到某键按下了,就不再检测其它的按键,这完全能满足绝大多数需要,又能节省大量的CPU 时间。

本键盘扫描程序的优点在于:不用专门的按键延时程序,提高了CPU 效率,也不用中断来扫描键盘,节省了硬件资源。另外,本键盘扫描程序,每次扫描占用CPU 时最短,不论有键按下或者无键按下都可以在很短的时间完成一次扫描。矩阵键盘需要初始化,并且分别对其行、列进行扫描,在扫描过程中判断是否有

键按下,根据以上要求,键盘模块设计的流程图:

4.3.2计算模块

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

在计算模块中,必须保证按键按下的数和LCD 液晶显示的数保持一致,则需要把+、-、*、/

等字符转换成数据,根据以上要求,计算模块的程序流程图:

4.3.3显示模块

本电路采用的是LCD 液晶显示输出数据, 在流程图中应包括对LCD 液晶显示器初始化,取要显示的数据,要是有两位数据需要显示,则在显示完第一位数据后需要进行延迟来显示第二位数据,则根据以上要求,

显示模块的流程图如图:

五、制作及调试过程

5.1制作过程

根据设计的电路图焊接电路板,焊接情况如下。

5.2软件调试

本电路软件设计采用C 语言编写程序(具体程序在附件中给出)。程序设计主要包括简易计算的编程,按键编程,时间控制编程,液晶屏LCD1602的显示编程。编写好c 文件后,用keil 软件生成hex 文件。在Proteus 布置的电路图中,点击芯片,将生成的的hex 文件导入芯片中,进行软件仿真。其仿真结果如下:

对于计算器的性能,主要的衡量指标就在于计算的精度,本次制作的计算器性能情况如下:

按第一个数,再按‘+—*/’,再按第二个数,然后按‘=’显示出结果,然后按C 清屏;

加最大9999+9999=19998;

减最大9999—0=9999;

乘最大9999*9999=99980001;

除1/9=0.1111保留小数点后4位,若分母为0则显示ERROR 。

5.3硬件调试

焊接好的电路板接入电源后,若LCD 的15脚16脚有接,则LCD 背景灯光发光。调节继电器的电阻值,可以调节背景灯光的亮度。按下按键,LCD 显示按下的字符,根据课设的任务要求,调试结果如下图所示,可以看到,实物调节可以实现了课设要求。

结论

课程设计是培养学生综合运用所学知识, 发现, 提出, 分析和解决实际问题, 锻炼实践能力的重要环节, 是对学生实际工作能力的具体训练和考察过程. 随着科学技术发展的日新日异,单片机已经成为当今计算机应用中空前活跃的领域,在生活中可以说得是无处不在。因此作为二十一世纪的大学来说掌握单片机的开发技术是十分重要的。通过这次课程设计,最大的一点体会是单片机学的不够扎实,不会的很多啊,当然这次的课程设计做计算器程序用的是c 语言,不是课上初学的汇编,所以很难适应,尽管大家都知道汇编编这个程序也很困难,但还是互相学习,到处找资料看,问同学,所以我的软件主程序才能编译成功,系统才能调试出结果。很感谢那些热心教导我的同学和指导我的老师。首先在硬件电路的制

作中,在焊接电路板的途中,由于我的粗心,将两个接口焊接在了一起,导致了两个接口短路了,在后来的检测中才发现。同时在焊接完了,接上电源才发现那个晶振是坏的,后来换了才使电路板可以使用。在这次课设中,整个硬件电路还是做得令自己比较满意的。在软件方面,感觉困难更多一些,一开始真的很着急,毫无头绪啊,一时间,百度,论坛,贴吧逛了个遍,找了很多资料,也参考了同学的程序,其中每一个子程序模块都认真去读,去分析,化为己用,程序是一遍一遍的改啊,可是怎么没编译比通过啊,后来在同学的帮助下才使程序能过编译通过。且,在这之前从来没有使用keil 这个软件,使用keil 软件生成hex 文件完全是自己摸索的情况下完成的。在使用开发板烧入程序中也出现了错误,导致出现了LCD 乱码的情况,在后来中这些问题都在一次次修改过,纠错中解决了。总的来说,软件设计能够把结果调出来还是很激动的,尽管还有很多未知的问题没有出现。

致谢

本次课设是在杨艺敏老师的带领下完成的。在此要感谢老师和同学们的帮助,使我能够圆满的完成这次课设的任务。在这次为期约一个多月的课程设计里,大大培养了我的动手能力和同学间的相互合作精神。通过这次课程设计我们进一步加深了对所用到的各种元器件的功能的理解,这对我以后的学习会很有帮助。本次课程设计是一个要求动手能力很强的设计,而且也是一个有严谨的态度才能完成的设计,它要求我必须一丝不苟,在此还要感谢学校开了这次课设课题,这次课不仅使我加深了单片机的课程知识,更是加强了我的动手能使,非常感谢!

参考文献

[1]张毅刚等. 新编MCS-51单片机应用设计(第3版). 哈尔滨大学出版社,2008.3

[2]江义火等.C 语言程序设计. 清华大学出版社,2012.41

附件

附录1. 程序代码

#include

#defineuint unsigned int

#defineuchar unsigned char

sbit rs=P2^7;//指令or 数据

sbit wela=P2^6;//读or 写

sbit lcden=P2^5;//使能信号

uchar code table[]=" ";

long int data_a,data_b;//第一个数和第二个数

long int data_c;//计算结果

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

//描述:延时t us 函数

void LCD_Delay_us(unsignedint t)

{

while(t--);//t=0,退出

}

//描述:延时t ms 函数

void LCD_Delay_ms(unsignedint t)

{

unsigned int i,j;

for(i=0;i

for(j=0;j

}

//描述:1602液晶写指令

void write_com(ucharcom) //1602液晶写指令

{

rs=0;//写指令

lcden=0;//使能1602

P0=com;//写入指令com

LCD_Delay_ms(1);//延时1ms

lcden=1;//使能1602

LCD_Delay_ms(2);//延时2ms

lcden=0;//使能1602

}

//描述:1602液晶写数据

void write_date(uchardate) //1602液晶写数据

{

rs=1;//写数据

lcden=0;//使能1602

P0=date;//写入数据date

LCD_Delay_ms(1);//延时1ms

lcden=1;//使能1602

LCD_Delay_ms(2);//延时2ms

lcden=0;//使能1602

}

//描述:指定x,y 写入字符函数

void W_lcd(unsignedchar x,unsigned char y,unsigned char Data) {

if (y==0){write_com(0x80+x);}//第一行

else{write_com(0xc0+x);}//第二行

write_date(Data); //写入数据

}

//指定x,y 写入字符串函数

void LCD_Write_String(unsignedchar x,unsigned char y,unsigned char *s){

if (y==0){write_com(0x80+x);}//第一行

else{write_com(0xC0+x);}//第二行

while (*s)//

{write_date(*s);s++;}//写入数据

}

//描述:初始化液晶,及画面初始化

void init_lcd(void)//初始化液晶,及画面初始化{

wela=0;//写液晶

lcden=0;//使能1602

write_com(0x38);//8位总线, 双行显示,5X7的点阵字符LCD_Delay_us(100);//延时100us

write_com(0x0c);//开显示,无光标,光标不闪烁write_com(0x06);//光标右移动

write_com(0x01);//清屏

write_com(0x80);//DDRAM地址归0

}

//描述:反转法键盘扫描

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 display_a()//显示数据a

{

dispaly[3]=data_a%10000/1000;//千

dispaly[2]=data_a%1000/100;//百

dispaly[1]=data_a%100/10;//十

dispaly[0]=data_a%10;//个

write_com(0x80+0);//显示数据a

if(data_a>999){write_date('0'+dispaly[3]);}//显示千位if(data_a>99){write_date('0'+dispaly[2]);}//显示百位

if(data_a>9){write_date('0'+dispaly[1]);}//显示十位

write_date('0'+dispaly[0]);//显示个位

}

void display_b()//显示数据b

{

write_com(0x80+7);//第一行

dispaly[3]=data_b%10000/1000;//千

dispaly[2]=data_b%1000/100;//百

dispaly[1]=data_b%100/10;//十

dispaly[0]=data_b%10;//个

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

write_date('0'+dispaly[0]);//显示个位

}

//计算结果

void display_c(x)

{

if(data_c-1)//溢出时显示错误

{

dispaly[8]=data_c%1000000000/100000000;//万万dispaly[7]=data_c%100000000/10000000;//千万

dispaly[6]=data_c%10000000/1000000;//百万dispaly[5]=data_c%1000000/100000;//十万

dispaly[4]=data_c%100000/10000;//万

dispaly[3]=data_c%10000/1000;//千

dispaly[2]=data_c%1000/100;//百

dispaly[1]=data_c%100/10;//十

dispaly[0]=data_c%10;//个

write_com(0x80+6+0x40);//第一行

if(x==4)

{

if(data_c>99999999){write_date('0'+dispaly[8]);}//显示万万if(data_c>9999999){write_date('0'+dispaly[7]);}//千万if(data_c>999999){write_date('0'+dispaly[6]);}//百万if(data_c>99999){write_date('0'+dispaly[5]);}//十万

write_date('0'+dispaly[4]);//万

write_date('.');

write_date('0'+dispaly[3]);//千

write_date('0'+dispaly[2]);//百

write_date('0'+dispaly[1]);//十

write_date('0'+dispaly[0]);//个

}

else{

if(data_c>99999999){write_date('0'+dispaly[8]);}//显示万万if(data_c>9999999){write_date('0'+dispaly[7]);}//千万if(data_c>999999){write_date('0'+dispaly[6]);}//百万if(data_c>99999){write_date('0'+dispaly[5]);}//十万if(data_c>9999){write_date('0'+dispaly[4]);}//万if(data_c>999){write_date('0'+dispaly[3]);}//千if(data_c>99){write_date('0'+dispaly[2]);}//百if(data_c>9){write_date('0'+dispaly[1]);}//十

write_date('0'+dispaly[0]);//个

}

}

else //溢出时显示错误

{

write_com(0x80+11+0x40);//第一行

write_date('E');write_date('r');write_date('r');write_date('o');write_date('r');}}

void eql(ucharx)//加减乘除运算{

switch(x)

{

//显示E //显示R //显示R //显示O //显示E

/*功能键选择*/

case 1:data_c=data_a+data_b;break;

数值转换函数*/

//加/*+S=1*//*

case 2:if(data_a>=data_b){data_c=data_a-data_b;}/*-S=2*///减

else{data_c=data_b-data_a;W_lcd(5,1,'-');}//负数符号break;

case 3:data_c=(data_a*data_b);break;case

4:if(data_b==0){LCD_Write_String(0,1,"Error!");}else{data_c=(data_a*10000)/data_b;}break;

/*/S=4*///除//溢出时显示错误case 0:break;}

}

void main(){

uchar uchar uchar uchar

key=0xff;n=0;m=5;x=0;

//键值初始化//第1个数可以按1-4次//第2个数可以按1-4次

/**S=3*///乘

data_a=0;data_b=0;data_c=0;init_lcd();display_a();while(1){

key=keycheckdown();

给j

key=0到f */if(0xff!=key){

if(key

//前一个数//后一个数//结果

//1602液晶初始化

/*动态扫描键盘,返回按键对应值,赋

/*若返回值有效,进入内部处理程序*/

if(n

一个数

if(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*///减

case 0xc:n=5;m=0;x=3;W_lcd(5,0,'*');break;

S=3*///乘

case 0xd:n=5;m=0;x=4;W_lcd(5,0,'/');break;

S=4*///除

case

/*+

/*-

/**

/*/

0xe:n=5;m=5;eql(x);W_lcd(12,0,'=');display_c(x);break;

case 0xf:n=0;x=0;m=5;

/*=*/

data_a=0;data_b=0;data_c=0;LCD_Write_String(0,0,table);LCD_Write_String(0,1,table);W_lcd(0,0,'0');break;/*

}

}

do{P1=0xf0;}while(P1!=0xf0);}//(0xff!=key)}//while}//main

/*等待按键松开*/

C*/

附录2. 元器件清单

器件STC89C92LCD 显示屏四脚按键40口插槽9脚排阻万用板导线

个数1117111若干

器件排针103继电器30pf 电容10uf 电容1K 电阻12Mhz 晶振杜邦线

个数若干12111一扎

序号12345678

评价指标

任务书及设计要求全面、准确方案的选择及其论证充分、合理基本原理框图的设计思路正确、有新意各功能模块的电路仿真

系统的安装调试,基本功能的实现作品的扩展功能与创新

报告结构合理、规范,条理清晰

课程设计过程中的学习态度认真、出勤率高

满分值[**************]0

得分

教师评语:

指导教师年月日


© 2024 实用范文网 | 联系我们: webmaster# 6400.net.cn