基于单片机的多功能计算器设计_第1页
基于单片机的多功能计算器设计_第2页
基于单片机的多功能计算器设计_第3页
基于单片机的多功能计算器设计_第4页
基于单片机的多功能计算器设计_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、工程设计训练设计报告 工程设计训练设计报告课题名称 基于单片机的多功能计算器设计 院系 物理与电子工程学院 年 级 专 业 电子信息工程 班 级 学 号 学生姓名 任课教师 吴正阳 设计时间 TOC o 1-3 h u 目录 HYPERLINK l _Toc21541 第一章 概述 HYPERLINK l _Toc12359 第二章 硬件设计方案 HYPERLINK l _Toc13311 第三章 程序设计 HYPERLINK l _Toc18490 第四章 软件仿真调试 HYPERLINK l _Toc9815 心得体会参考文献 附录工程设计训练基于单片机的多功能计算器设计任务书一、设计课题

2、:基于单片机的多功能计算器设计二、设计目的:运用已学课程的基本知识,在设计中加以应用,进而得到理解、巩固和提高发展,通过实践的过程学习掌握分析与解决实际问题的方法与手段,提高设计、编程与调试的实际动手能力,作为工程技术工作的一次基本训练。三、设计任务:使用AT89C51单片机设计一个多功能计算器,主要用到矩阵键盘,LCD液晶显示器。要求进行硬件、软件系统设计。四、主要任务:1、在多功能计算器上能够显示所输入的表达式,例如:(20+10)/102、在设计中,能进行加减乘除及优先级运算,例如:2+6*2,并且有清除功能用C表示。3、能够计算的最大数字位数是两位。4、程序设计完过后,进行电路设计。用

3、protues软件进行仿真。二,具体内容I-硬件设计 单片机用AT89C51,4*4矩阵键盘,显示用LCD1602,上拉电阻,74HC21与门和一些外设设备(晶振,电容)设置1AT89C51单片机2-计算器的键盘布局:计算器有16个键(0,1,2,3,4,5,6,7,8,9,/,*,+,-,=,ON/AC)组成,在单片机中正好有一个端口实现16个按键功能,这种形式在单片机系统中最常用是矩阵键盘。矩阵式结构的键盘识别要复杂一些,列线通过电阻接正电源,并将行线所接的单片机的I/O口作为输出端,而列线所接的I/O口则作为输入。这样,当按键没有按下时,所有的输入端都是高电平,代表无键按下。行线输出是低

4、电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。在 HYPERLINK /emb/danpianji/20111025226489.html 矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样,一个端口(如P1口)就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。确定矩阵式键盘上何键被按下介绍一种“行扫描法”。行扫描法 行扫描法又称为逐行(或列

5、)扫描查询法,是一种最常用的按键识别方法,如上图所示键盘,介绍过程如下。1、判断键盘中有无键按下 将全部行线Y0-Y3置低电平,然后检测列线的状态。只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。若所有列线均为高电平,则键盘中无键按下。2、判断闭合键所在的位置 在确认有键按下后,即可进入确定具体闭合键的过程。其方法是:依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。确定矩阵式键盘上何键被按下介绍一种“高

6、低电平翻转法”。首先让P1口高四位为1,低四位为0,。若有按键按下,则高四位中会有一个1翻转为0,低四位不会变,此时即可确定被按下的键的行位置。然后让P1口高四位为0,低四位为1,。若有按键按下,则低四位中会有一个1翻转为0,高四位不会变,此时即可确定被按下的键的列位置。最后将上述两者进行或运算即可确定被按下的键的位置。本设计用第一种“行扫描法”。键盘与单片机接口是P10=R1,P11=R2, P12=R3, P13=R4. P14=L1,P15=L2, P16=L3, P17=L43-74HC21与门接线图 4-上拉电阻作用是驱动LCD16025LCD1602显示模块本设计采用LCD液晶显示

7、器来显示输出数据。LCD的特性有:1、+5V电压,对比可调度;2、内含复位电路;3、提供各种控制命令,如:清屏、字符闪烁、光标闪烁、显示移位等多种功能;4、有80字节显示数据存储器DDRAM;5、内建有160个5X7点阵的字型的字符发生器CGROM;6、8个可由用户自定义的5X7的字符发生器CGRAM。本设计通过D0-D7引脚向LCD写指令字或写数据以使LCD实现不同的功能或显示相应的数据。接口电路如下:II-软件设计输入数据和表达式并显示表达式。判断输入是否正确,如果输入错误显示”ERROR”,如果输入正确就进行分辨符号“*”,“/”,“+”,“-”然后按这样顺序(乘,除,加,减)进行运算

8、仿真用Keil Uvision2软件和Proteus 7软件仿真结果#include /#include#define uint signed int #define uchar unsigned char#define fuhao_1 -1/除符号#define fuhao_2 -2/乘符号#define fuhao_3 -3/减符号#define fuhao_4 -4/加符号sbit lcden=P35; /定义引脚 E 使能sbit rs=P37;sbit rw=P36;sbit busy=P07;sbit p33=P33;float arry20;int arry_1=0 x52,0

9、x4f,0 x52,0 x52,0 x45; /ERRORlong c; /结果long q; / 结果的绝对数uchar error; /错误标志uchar m; /输入新表达式的标志uchar ok_flag; /输入完毕的标志uchar fuhao;/符号标志void delay(uchar z) / 延迟函数uchar y; for(z;z0;z-) for(y=0;y110;y+);/* 判断忙或空闲*/void check() do P0=0 xFF; rs=0; rw=1; /读 rs rw 值为01时,忙标志和地址计数器读出 lcden=0; /E=0,禁止读写 delay(1

10、); /等待,液晶显示器处理数据 lcden=1; /E=1,允许读写 while(busy=1); /判断是否为空闲,1为忙,0为空闲/* 写指令函数*/void write_com(uchar com) P0=com; /com指令付给P0口 rs=0; rw=0; lcden=0; check(); lcden=1;/*写数据函数*/void write_date(uchar date) P0=date; rs=1; rw=0; lcden=0; check(); lcden=1;void init() /初始化 uchar i; lcden=1; /使能信号为高电平 write_com

11、(0 x38); /功能设置命令:8位,2行 DDRAM的地址 write_com(0 x0e); /显示开,光标开,不闪烁 write_com(0 x06); /地址计数器加1模式,显示屏不移位 write_com(0 x80); /设置访问地址 for(i=0;i20;i+) arryi=0; error=0; ok_flag=0; c=0; q=0; /结果 fuhao=0; / fuhao表征按下的是哪个符号/*键盘扫描程序*/void keyscan(void)/ 键盘扫描程序uchar temp,i,num;void int0(); if (m=1) /输入新表达式 write_c

12、om(0 x01); /清屏命令 for(i=0;i20;i+) arryi=0;m=0;ok_flag=0;fuhao=0; P1=0 xfe; if(P1!=0 xfe)/第1行有键按下 delay(20);/20ms if(P1!=0 xfe) /第1行确实有键按下 temp=P1&0 xf0; switch(temp) case 0 xe0:num=0; /确定按键为第1行第1列,置标示符num break; case 0 xd0:num=1; break; case 0 xb0:num=2; break; case 0 x70:num=3; break; while(P1!=0 xf

13、e); if(num=0) arry2*fuhao=10*(arry2*fuhao)+7;write_date(0 x30+7); /第1行第1列键值7,存在数组arry if(num=1) arry2*fuhao=10*(arry2*fuhao)+8;write_date(0 x30+8); if(num=2) arry2*fuhao=10*(arry2*fuhao)+9;write_date(0 x30+9); if(num=3) arry2*fuhao+1=fuhao_1;fuhao+;write_date(0 x2f); /第1行第4列键值/,存在数组arry P1=0 xfd; if

14、(P1!=0 xfd) /第2行有键按下 delay(20); if(P1!=0 xfd)/第2行确实有键按下 temp=P1&0 xf0; switch(temp) case 0 xe0:num=4; /确定按键为第2行第1列, 置标示符num break; case 0 xd0:num=5; break; case 0 xb0:num=6; break; case 0 x70:num=7; break; while(P1!=0 xfd); if(num=4) arry2*fuhao=10*(arry2*fuhao)+4;write_date(0 x30+4); /第2行第1列键值为4,存在

15、数组arry if(num=5) arry2*fuhao=10*(arry2*fuhao)+5;write_date(0 x30+5); if(num=6) arry2*fuhao=10*(arry2*fuhao)+6;write_date(0 x30+6); if(num=7) arry2*fuhao+1=fuhao_2;fuhao+;write_date(0 x2a); /第2行第4列键值为*,存在数组arry P1=0 xfb;/第3行有键按下if(P1!=0 xfb)delay(20);if(P1!=0 xfb) /第3行确实有键按下temp=P1&0 xf0;switch(temp)

16、case 0 xe0:num=8; /确定按键为第3行第1列,置标示符numbreak;case 0 xd0:num=9;break;case 0 xb0:num=10;break;case 0 x70:num=11;break;while(P1!=0 xfb);if(num=8) arry2*fuhao=10*(arry2*fuhao)+1;write_date(0 x30+1); /第3行第1列键值为1,存在数组arryif(num=9) arry2*fuhao=10*(arry2*fuhao)+2;write_date(0 x30+2);if(num=10) arry2*fuhao=10

17、*(arry2*fuhao)+3;write_date(0 x30+3);if(num=11) arry2*fuhao+1=fuhao_3;fuhao+;write_date(0 x2d); /第3行第4列键值为-,存在数组arryP1=0 xf7;if(P1!=0 xf7)delay(20);if(P1!=0 xf7)temp=P1&0 xf0;switch(temp)case 0 xe0:num=12;break;case 0 xd0:num=13;break;case 0 xb0:num=14;break;case 0 x70:num=15;break;while(P1!=0 xf7);

18、if (num=12) /第4行第1列ON/C键,清屏 write_com(0 x01); for(i=0;i20;i+) arryi=0; fuhao=0; ok_flag=0; if(num=13) arry2*fuhao=10*(arry2*fuhao);write_date(0 x30); /第4行第2列键值为0,存在数组arryif(num=14) ok_flag=1;m=1; / 第4行第3列j键值=,输入完毕,输入新表达式if(num=15) arry2*fuhao+1=fuhao_4;fuhao+;write_date(0 x2b); / /第2行第4列键值为*,存在数组arr

19、yP1=0 xf0; /置第一行全部按下 /*条件运算条件*/void stop(void)uchar k,h; h=2*fuhao; for (k=0;k=h;k+) if(arryk)0) if(arryk+1)=0) if(arryk+20) error=1;if (arryk=fuhao_1) if(arryk+1=0) error=1; /*运算*/void process(void) uchar h,k,i,j; for(k=0;k=(2*fuhao);k+) if (arryk=fuhao_2) /乘符号/ j=k-1;h=2*fuhao-2;arryj=arryj*arryj+

20、2;for(i=(j+1);i=h;i+)arryi=arryi+2;fuhao=fuhao-1;k=k-1; for(k=0;k=(2*fuhao);k+) if (arryk=fuhao_1) /除符号/ j=k-1;h=2*fuhao-2;arryj=arryj/arryj+2;for(i=(j+1);i=h;i+) arryi=arryi+2;fuhao=fuhao-1;k=k-1; h=fuhao; for(k=1;k=h;k+) if(arry1=fuhao_3) /减符号/ arry0=arry0-arry2; fuhao=fuhao-1; for(i=1;i=(2*fuhao);i+) arryi=arryi+2; else if(arry1=fuhao_4) /加符号/ arry0=arry0+arry2; fuhao=fuhao-1; for(i=1;i=(2*fuhao);i+) arryi=arryi+2; /*显示运算结果*/if(fuhao=0)c=arry0; /小位数取三位/ write_com(0 x80+0 x4f); /按下等于键,光标前进至第二行最后一个显示处/ write_com(0 x04); /设置从后住前写数据每写

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论