单片机技术课程设计报告简单计算器.docx

上传人:b****2 文档编号:2466341 上传时间:2023-05-03 格式:DOCX 页数:18 大小:167.04KB
下载 相关 举报
单片机技术课程设计报告简单计算器.docx_第1页
第1页 / 共18页
单片机技术课程设计报告简单计算器.docx_第2页
第2页 / 共18页
单片机技术课程设计报告简单计算器.docx_第3页
第3页 / 共18页
单片机技术课程设计报告简单计算器.docx_第4页
第4页 / 共18页
单片机技术课程设计报告简单计算器.docx_第5页
第5页 / 共18页
单片机技术课程设计报告简单计算器.docx_第6页
第6页 / 共18页
单片机技术课程设计报告简单计算器.docx_第7页
第7页 / 共18页
单片机技术课程设计报告简单计算器.docx_第8页
第8页 / 共18页
单片机技术课程设计报告简单计算器.docx_第9页
第9页 / 共18页
单片机技术课程设计报告简单计算器.docx_第10页
第10页 / 共18页
单片机技术课程设计报告简单计算器.docx_第11页
第11页 / 共18页
单片机技术课程设计报告简单计算器.docx_第12页
第12页 / 共18页
单片机技术课程设计报告简单计算器.docx_第13页
第13页 / 共18页
单片机技术课程设计报告简单计算器.docx_第14页
第14页 / 共18页
单片机技术课程设计报告简单计算器.docx_第15页
第15页 / 共18页
单片机技术课程设计报告简单计算器.docx_第16页
第16页 / 共18页
单片机技术课程设计报告简单计算器.docx_第17页
第17页 / 共18页
单片机技术课程设计报告简单计算器.docx_第18页
第18页 / 共18页
亲,该文档总共18页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

单片机技术课程设计报告简单计算器.docx

《单片机技术课程设计报告简单计算器.docx》由会员分享,可在线阅读,更多相关《单片机技术课程设计报告简单计算器.docx(18页珍藏版)》请在冰点文库上搜索。

单片机技术课程设计报告简单计算器.docx

单片机技术课程设计报告简单计算器

课设报告

单片机技术

 

福建工程学院软件学院

 

题目:

简单的整形计算器

班级:

物联网2班

姓名:

孙建兴

学号:

**********

********

日期:

2013年12月24日

 

1 摘要 

 通过本课程设计使学生进一步巩固单片机原理与技术的基本概念、理论,分析问题的基本方法;增强学生的软件编程实现能力和解决实际问题的能力,使学生能有效的将理论和实际紧密结合,拓展学生在工程实践方面的专业知识和相关技能。

2  设计要求 

分别对键盘输入检测模块;LCD显示模块;算术运算模块;并用Visio画系统方框图,keil与protues仿真分析其结果。

                

2.1  功能需求 

现实生活中人们熟知的计算器,其功能主要如下:

(1)键盘输入;

(2)数值显示;(3)加、减、乘、除四则运算。

针对上述功能,计算器软件程序要完成以下模块的设计:

(1)键盘输入检测模块;

(2)LCD显示模块;(3)算术运算模块。

2.2  设计要求

本系统选用AT89C51单片机为主控机。

通过扩展必要的外围接口电路,实现对计算器的设计,具体设计如下:

(1)由于设计的计算器要进行四则运算,为了得到较好的显示效果,经综合分析后,最后采用LCD显示数据和结果。

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

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

3、主体设计部分:

3.1 系统总体框图 

图3.1 系统总体框图 

3.2、算术运算程序流程图:

图3.2算术运算程序流程图

3.3、系统总流程图:

图3.3系统总流程图

4 、 各部分硬件介绍  

(一)、总体硬件设计:

本设计选用AT89C51单片机为主控单元;显示部分:

采用LCD静态显示;按键部分:

采用4*4键盘;用LCD1602为4*4键盘扫描IC,读取输入的键值。

总体设计效果如下图:

图4.41总体设计效果如下图

(二)、LCD显示模块:

本设计采用LCD液晶显示器来显示输出数据。

通过D0-D7引脚向LCD写指令字或写数据以使LCD实现不同的功能或显示相应数据。

图4.42LCD显示模块

(三)、排阻作用

第一个是为了加大传感器驱动电流。

第二个只有在用p0口时才需要排阻作为上拉电阻

图4.43排阻

(四)、键盘接口电路:

计算器输入数字和其他功能按键要用到很多按键,如果采用独立按键的方式,在这种情况下,编程会很简单,但是会占用大量的I/O口资源,因此在很多情况下都不采用这种方式,而是采用矩阵键盘的方案。

矩阵键盘采用四条I/O线作为行线,四条I/O线作为列线组成键盘,在行线和列线的每个交叉点上设置一个按键。

这样键盘上按键的个数就为4×4个。

这种行列式键盘结构能有效地提高单片机系统中I/O口的利用率。

矩阵键盘的工作原理:

计算器的键盘布局如图1所示:

一般有16个键组成,在单片机中正好可以用一个P口实现16个按键功能,这种形式在单片机系统中也最常用。

图4.44矩阵键盘模块

(五)、AT89C51简介 

AT89C51是一种带4K字节FLASH存储器(FPEROM—FlashProgrammableandErasableReadOnlyMemory)的低电压、高性能CMOS8位微处理器,俗称单片机。

AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。

单片机的可擦除只读存储器可以反复擦除1000次。

该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。

由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。

AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。

图4.45AT89C51

 功能说明:

外部中断0调用函数,计时开始并实时显示定时计数器跳变的时间及按键的判断。

5  、功能实现(功能介绍+照片)

5.1、加法功能:

图5.1加法功能

5.2、减法功能:

图5.2减法功能

5.3、乘法功能:

图5.3乘法功能

5.4、除法功能:

图5.4除法功能

6 、心得体会 

通过本次课程设计让我更加了解了单片机各模块的功能,包括 数码管显示,4*4键盘,独立按键。

实验过程让我更加了解并进一步掌握了中断,定时计数,4*4键盘输入等程序编写。

以及掌握了通过Proteus构造自己所需要的外围电路,进行仿真实验。

通过此次课程设计,初步掌握了使单片机多个模块进行工作的原理和方法。

7 源程序   

#include

#include

#defineint8unsignedchar

#defineint16unsignedint

sbitEN=P2^3;//LCD定义引脚

sbitRS=P2^4;

sbitRW=P2^0;

sbitbusy=P0^7;

//矩阵键盘键值表

charcodenum[]={

7,8,9,'*',

4,5,6,'/',

1,2,3,'-',

'c',0,'=','+'};

charcodenum1[]={'0','1','2','3','4','5','6','7','8','9'};

staticcharckey;//当前按键字符

longa,b;//前后两数

charflag;//是否有符号键按下

charf;//判断按下的是什么符号键(+,-,*,/)

longresult;//运算结果

staticint16c=0;//字符显示位置

voiddelay_ms(int8z);//延迟函数

voidwait_busy();//忙等待

voidwrite_cmd(int8cmd);//写指令

voidwrite_data(int8dat);//写数据

voidInitialize_LCD();//LCD1602初始化

voidLCD_ShowString(int8r,int8c,int8*str);//在指定位置显示字符串

voidkeyboard();//键盘按键扫描

voiddigit_a();//加减乘除处理

voiddigit_b();//a和b运算的结果在1602上显示

voiddigit_c();//把输入的数存入到a和b

//------------------------------------------------------------------------------------------------------

//名称:

lcd1602液晶屏控制与显示程序

//------------------------------------------------------------------------------------------------------

//-------------------------------------------------------------------------------------------------------------

//延时

voiddelay_ms(int8z)//延迟函数

{

int8y;

for(z;z>0;z--)

for(y=0;y<110;y++);

}

//-------------------------------------------------------------------------------------------------------

//忙等待

voidwait_busy()

{

do{

P0=0XFF;

RS=0;

RW=1;

EN=0;

delay_ms

(1);

EN=1;

}while(busy==1);

}

//---------------------------------------------------------------------------------------------------------

//写指令

//---------------------------------------------------------------------------------------------------------

voidwrite_cmd(int8cmd)

{

P0=cmd;

RS=0;

RW=0;

EN=0;

wait_busy();

EN=1;

}

//-----------------------------------------------------------------------------------------------------------

//写数据

//-----------------------------------------------------------------------------------------------------------

voidwrite_data(int8dat)

{

P0=dat;

RS=1;

RW=0;

EN=0;

wait_busy();

EN=1;

}

//------------------------------------------------------------------------------------------------------------

//LCD1602初始化

//------------------------------------------------------------------------------------------------------------

voidInitialize_LCD()

{

write_cmd(0x38);

write_cmd(0x0c);

write_cmd(0x06);

write_cmd(0x80);

write_cmd(0x01);

a=0;b=0;

flag=0;

result=0;

c=0;

ckey=0;

}

//-----------------------------------------------------------------------------------------------------------

//在指定位置显示字符串

//----------------------------------------------------------------------------------------------------------

voidLCD_ShowString(int8r,int8c,int8*str)

{

int8i=0;

codeint8DDRAM[]={0X80,0XC0};

write_cmd(DDRAM[r]|c);

for(i=0;str[i]&&i<16;i++)

write_data(str[i]);

for(;i<16;i++)

write_data('');

}

//------------------------------------------------------------------------------

//键盘按键扫描

//------------------------------------------------------------------------------

voidkeyboard()

{

int16h_code,l_code,key_code;

P3=0xf0;

h_code=P3;

h_code=h_code&0xf0;

delay_ms(200);

P3=0x0f;

l_code=P3;

l_code=l_code&0x0f;

delay_ms(200);

key_code=h_code|l_code;

if(key_code!

=0xFF)

{

switch(key_code)

{

case0xee:

LCD_ShowString(0,c++,"7");ckey=num[0];digit_c();break;//输入字符7

case0xde:

LCD_ShowString(0,c++,"8");ckey=num[1];digit_c();break;//输入字符8

case0xbe:

LCD_ShowString(0,c++,"9");ckey=num[2];digit_c();break;//输入字符9

case0x7e:

LCD_ShowString(0,c++,"*");flag=1;f=0;break;//输入字符*

case0xed:

LCD_ShowString(0,c++,"4");ckey=num[4];digit_c();break;//输入字符4

case0xdd:

LCD_ShowString(0,c++,"5");ckey=num[5];digit_c();break;//输入字符5;

case0xbd:

LCD_ShowString(0,c++,"6");ckey=num[6];digit_c();break;//输入字符6

case0x7d:

LCD_ShowString(0,c++,"/");flag=1;f=1;break;//输入字符/

case0xeb:

LCD_ShowString(0,c++,"1");ckey=num[8];digit_c();break;//输入字符1

case0xdb:

LCD_ShowString(0,c++,"2");ckey=num[9];digit_c();break;//输入字符2

case0xbb:

LCD_ShowString(0,c++,"3");ckey=num[10];digit_c();break;//输入字符3

case0x7b:

LCD_ShowString(0,c++,"-");flag=1;f=2;break;//输入字符-

case0xe7:

flag=0;f=4;digit_a();break;//输入字符c

case0xd7:

LCD_ShowString(0,c++,"0");ckey=num[13];digit_c();break;//输入字符0

case0xb7:

digit_a();break;//输入字符=

case0x77:

LCD_ShowString(0,c++,"+");flag=1;f=3;break;//输入字符+

default:

break;

}

if(c>15)

{

c=0;

}

}

}

voiddigit_c()//把输入的数存入到a和b

{

if(flag==0)

{

a=ckey+a*10;

}

else

{

b=ckey+b*10;

}

}

//-------------------------------------------------------------------------------

//数据处理

//-------------------------------------------------------------------------------

voiddigit_a()//加减乘除处理

{

switch(f)

{

case0:

result=a*b;

digit_b();

break;

case1:

result=a/b;

digit_b();

break;

case2:

result=a-b;

digit_b();

break;

case3:

result=a+b;

digit_b();

break;

case4:

Initialize_LCD();

break;

default:

break;

}

}

voiddigit_b()//a和b运算的结果在1602上显示

{

int8i=0,j=0,k;

longr;

r=result;

while(0!

=result)

{

result/=10;

i++;

}

if(result==0)

{

write_cmd(0x80+0x4f);

write_data(num1[0]);

}

for(;j

{

k=r/10;

r%=10;

write_cmd(0x80+0x4f-j);

write_data(num1[r]);

r=k;

}

write_cmd(0x80+0x4f-i-1);

write_data('=');

}

//----------------------------------------------------------------------------

//主函数

//-------------------------------------------------------------------------------

voidmain()

{

Initialize_LCD();

while

(1)

{

keyboard();

}

}

delay

(2);

P2=0x06;

P0=number[SS1];

delay

(2);

P2=0x07;

P0=number[ss];

if(P33==0)

{

TR0=0;

while

(1)

{

P3_3();

if(P32==0)

P3_2();

}

}

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2