单片机课程设计 计算器课件_第1页
单片机课程设计 计算器课件_第2页
单片机课程设计 计算器课件_第3页
单片机课程设计 计算器课件_第4页
单片机课程设计 计算器课件_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

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

文档简介

1、目录第一章、概述11.1单片机及其特点概述11.2设计内容1第二章、设计思路22.1 设计方案22.2 基本原理2第三章、硬件电路设计33.1.振荡电路设计33.2.显示电路设计43.3.按键显示电路设计4第四章、软件设计64.1总体概述64.2 主程序的设计64.3 液晶显示模块74.4 键盘扫描模块8第五章、仿真10第六章、程序清单13第七章、整体电路图35第八章、体会36第1章 、概述1.1单片机及其特点概述单片机是指将CPU,存储器,定时器/计数器,输入/输出接口电路,中断,串行通信接口等主要计算机部件集成在一块大规模集成电路芯片上,组成单片微型计算机。它具有集成度高,功能强,可靠性高

2、,体积小,功耗低,使用方便,价格低廉等特点。在实时控制系统,智能仪器仪表,家用电器,网络通信等领域应用比较广泛。 随着单片机的问世,更进一步推动了计算机的发展,标志着计算机系统两大分支的正式形成,即通用计算机系统和嵌入式计算机系统,前者主要以发展海量,高速数值计算为趋势,后者主要实现面向对象的实时控制。他是计算机技术的得到了更为广泛的应用。1.2设计内容 利用单片机,设计一个简易计算器,内容包括:能够实现加、减、乘、除、平方根等基本功能;能够在0-65535范围之内计算任意次方根、任意次幂;“=“号加任意数字键清除屏幕内容。第二章、设计思路2.1 设计方案根据设计内容逐个实现其功能。首先,计算

3、器的基本功能是加减乘除等运算,需要确定两个操作数和运算符。其次就是显示部分,本次设计使用1602液晶显示器。本次设计将两个操作数和运算符显示在1602液晶的第一行,将结果显示在第二行。所以设计的思路便是:首先写入第一个操作数并保存该数,其次写入运算符并标记该运算符,再其次写入第二个操作数并保存,然后将结果显示在1602液晶的第二行。2.2 基本原理 2.2.1液晶显示用液晶显示时间的方法就是将事件的各个位写入到液晶的控制器内部带有的80*8位的RAM缓冲区。每次时间改变之后都要重新写入。1602液晶显示器的课件部分只有上下两行,每行16个字节。第三章、硬件电路设计3.1.振荡电路设计 在AT8

4、9C51单片机引脚XTAL1和XTAL2分别是反向放大器的输入端和输出端,通常,经由片外晶体振荡器或陶瓷谐振器与两个相匹配的电容构成一个自激振荡电路,为单片机提供时钟电源。 图3-1 振荡电路3.2.显示电路设计 前面简单介绍了1602液晶显示器的信息,现在介绍其工作原理。它是通过想液晶内部自带打RAM写数据来显示时间的。在这之前我们要先对它内部进行一些设置。如开关,光标,是否移动,是否清频,还有数据写在何处都要设置。图3-2显示电路 3.3.按键电路设计 键盘有两种类型,一种是独立键盘,一种是矩阵键盘 本次设计使用了一个矩阵键盘和四个是独立键盘,分别选用P3口和P2.2P2.5引脚作输入引脚

5、,作为输入。单键盘不按下时,引脚为高电平,所以在读取引脚电平是就判断引脚为高电平还是低电平。若为低电平则表示按键按下。 图3-3 按键电路第四章、软件设计4.1总体概述依照系统程序划分,将设计划分为2个模块,如图4-1所示液晶显示模块键盘扫描模块主程序模块图4-1设计方框图4.2 主程序的设计主程序的内容包括,单片机初始化,相关元器件的初始化和一些子程序的调用。定义三个个全局变量和一个标示符,三个变量分别用于保存两个操作数和计算结果,标示符用于保存运算符,调用计算函数计算结果并显示。开始初始化液晶1602初始化数据存储单元 扫描键盘并保存数据子程序调用图4-2 主程序流程图4.3液晶显示模块4

6、.3.1设计思路该模块是通过将变量写入液晶的内部RAM中显示出来,单片机将操作数1,操作数2,计算结果从P1口输出,P1口接液晶的输入端,液晶将接受的数据进行处理,并显示出来。当主程序再次调用该模块时,重新执行该过程。4.3.2流程图接收数据写指令 写数据 图4-3 显示模块流程图4.4键盘扫描模块 4.4.1设计思路 通过判断键盘是否按下,若按下,则对相关变量进行处理。处理完后,当程序再次调用该模块时,再重头开始。4.4.2流程图判断键盘是否按下 若没按下 若按下 哪个键按下退出该模块处理相关变量图4-4 调时调闹钟流程图 第五章、仿真编写好程序后,在PROTUES仿真软件上进行仿真和调试,

7、通过调试,解决程序上考虑的不足,通过仿真,我们可以检验是否达到预期的结果。在调试中,主要出现以下几个问题。5.1错误1:当键盘上输入7+2时,按下等于键,结果没有显示在液晶第二行如图5-1所示图5-1液晶显示问题原因: 液晶在每次写入之前应写入你所希望出现的位置的地址,若不写地址,则会出现图5-1的情况。解决方案: 在写结果之前,先写入地址。解决后的显示: 图5-1-1 正确显示5.2 错误2: 在计算任意次幂的时候,当输入54时,结果如图5-2所 图5-1任意次幂计算问题原因:计算任意次幂时,使用for循环out=1;for(b;b0;b-)out=out*10;其中out为计算结果,b为指

8、数。应当修改为out=1;for(b;b0;b-)out=out*a;其中out为计算结果,b为指数,a为底。解决后的结果: 图5-2-1 正确结果5.3 错误3:案件在按下之后,数值并不是按预想的变化。原因分析:没有消抖,只有加消抖函数,才能使数据准确变化。第六章、程序清单#include#include#define uint unsigned int#define uchar unsigned char#define ulong unsigned longsbit rs=P20;sbit en=P21;sbit ql=P22;sbit sqr=P23;/平方根sbit xy=P24;/x

9、的y次方sbit fg=P25;uchar flag,s,ws,ws1,xs,eq;/ws1,ws表示有几位小数,eq表示等于键是否按下double sum,aa;long double out,out1,k;signed long hh,ll;void delay(uint z)uint x,y;for(x=0;xz;x+)for(y=0;y0;ws1-)a=a/(double)10;for(ws;ws0;ws-)b=b/(double)10;if(flag=0)out=b;if(flag=1)out=a+b;else if(flag=2) out=a-b;if(out0;b-)out=ou

10、t*a;elseout=pow(a,b);/计算a的b次方else if(7=flag)out=pow(a,(double)1/b);hh=(signed long)out;temp=(double)hh;if(0=d)ll=(signed long)(out-hh)*10*10*10*10*10*10);else if(d!=0|flag=6)ll=(signed long)(out*10*10*10*10*10*10)%1000000;if(temp=out)ll=0;write_com(0x80+0x40+15);if(ll!=0)for(p=6;p0;p-)f=ll%10;if(0!=

11、f|1=bz)write_data(0x30+f); bz=1;ll=ll/10;write_data(0x20+0x0e);for(p=0;p10;p+)f=hh%10;write_data(0x30+f);hh=hh/10;if(hh=0)break;if(k0)write_data(-);write_com(0x06);void qingling()flag=0;s=0;sum=0;aa=0;out=0;out1=0;k=0;ws1=0;ws=0;eq=0;write_com(0x01);write_com(0x80);write_com(0x0f);void init()flag=0;

12、write_com(0x38);write_com(0x0f);write_com(0x06);write_com(0x01);write_com(0x80);void scan()uchar temp;P3=0xfe;temp=P3;temp=temp&0xfe;if(temp!=0xfe)delay(5);temp=P3;temp=temp&0xfe;if(temp!=0xfe)switch(temp)case 0xee:if(1=eq) qingling();break;if(xs=0)&(sum=0)&(s!=0)&(flag!=6)&(flag!=7)write_com(0x04);

13、write_data( );write_com(0x06);s+;if(s8)write_data(0x30+1);sum=sum*10+1;if(1=xs)ws+;break;case 0xde:if(1=eq) qingling();break;if(xs=0)&(sum=0)&(s!=0)&(flag!=6)&(flag!=7)write_com(0x04);write_data( );write_com(0x06);s+;if(s8)write_data(0x30+2);sum=sum*10+2;if(1=xs)ws+;break;case 0xbe:if(1=eq) qingling

14、();break;if(xs=0)&(sum=0)&(s!=0)&(flag!=6)&(flag!=7)write_com(0x04);write_data( );write_com(0x06);s+;if(s8)write_data(0x30+3);sum=sum*10+3;if(1=xs)ws+;break;case 0x7e:if(1=eq) qingling();break;if(flag=0)aa=sum;sum=0;ws1=ws;ws=0;write_data(+);s=0;xs=0;flag=1;/加函数 break; while(temp!=0xfe)temp=P3;P3=0x

15、fd;temp=P3;temp=temp&0xfd;if(temp!=0xfd)delay(5);temp=P3;temp=temp&0xfd;if(temp!=0xfd)switch(temp)case 0xed:if(1=eq) qingling();break;if(xs=0)&(sum=0)&(s!=0)&(flag!=6)&(flag!=7)write_com(0x04);write_data( );write_com(0x06);s+;if(s8)write_data(0x30+4);sum=sum*10+4;if(1=xs)ws+;break;case 0xdd:if(1=eq)

16、 qingling();break;if(xs=0)&(sum=0)&(s!=0)&(flag!=6)&(flag!=7)write_com(0x04);write_data( );write_com(0x06);s+;if(s8)write_data(0x30+5);sum=sum*10+5;if(1=xs)ws+;break;case 0xbd:if(1=eq) qingling();break;if(xs=0)&(sum=0)&(s!=0)&(flag!=6)&(flag!=7)write_com(0x04);write_data( );write_com(0x06);s+;if(s8)

17、write_data(0x30+6);sum=sum*10+6;if(1=xs)ws+;break;case 0x7d:if(1=eq) qingling();break;if(flag=0)aa=sum;sum=0;ws1=ws;ws=0;write_data(-);s=0;xs=0;flag=2;/减函数break; while(temp!=0xfd)temp=P3;P3=0xfb;temp=P3;temp=temp&0xfb;if(temp!=0xfb)delay(5);temp=P3;temp=temp&0xfb;if(temp!=0xfb)switch(temp)case 0xeb:

18、if(1=eq) qingling();break;if(xs=0)&(sum=0)&(s!=0)&(flag!=6)&(flag!=7)write_com(0x04);write_data( );write_com(0x06);s+;if(s8)write_data(0x30+7);sum=sum*10+7;if(1=xs)ws+;break;case 0xdb:if(1=eq) qingling();break;if(xs=0)&(sum=0)&(s!=0)&(flag!=6)&(flag!=7)write_com(0x04);write_data( );write_com(0x06);s

19、+;if(s8)write_data(0x30+8);sum=sum*10+8;if(1=xs)ws+;break;case 0xbb:if(1=eq) qingling();break;if(xs=0)&(sum=0)&(s!=0)&(flag!=6)&(flag!=7)write_com(0x04);write_data( );write_com(0x06);s+;if(s8)write_data(0x30+9);sum=sum*10+9;if(1=xs)ws+;break;case 0x7b:if(1=eq) qingling();break;if(flag=0)aa=sum;sum=0

20、;ws1=ws;ws=0;write_data(*);s=0;xs=0;flag=3;/乘函数 break; while(temp!=0xfb)temp=P3;P3=0xf7;temp=P3;temp=temp&0xf7;if(temp!=0xf7)delay(5);temp=P3;temp=temp&0xf7;if(temp!=0xf7)switch(temp)case 0xe7:if(1=eq) qingling();break;if(xs=0)&(sum=0)&(s!=0)&(flag!=6)&(flag!=7)write_com(0x04);write_data( );write_co

21、m(0x06);s+;if(s8)write_data(0x30+0);sum=sum*10+0;if(1=xs)ws+;break;case 0xd7:if(1!=xs)if(1=eq) qingling();break;write_data(0x20+0x0e);xs=1;/小数点s=0;break;case 0xb7:if(1=eq) qingling();break;equalfun(aa,sum);/等于函数 flag=0;xs=0;eq=1;break;case 0x77:if(1=eq) qingling();break;if(flag=0)aa=sum;sum=0;ws1=ws

22、;ws=0;write_data(/);s=0;xs=0;flag=4;/除函数 break; while(temp!=0xf7)temp=P3;if(ql=0)delay(5);if(ql=0)qingling();while(!ql);if(sqr=0)delay(5);if(sqr=0)while(!sqr);if(1=eq)qingling();return;if(flag=0)flag=5;aa=sum;sum=0;ws1=ws;equalfun(aa,sum);flag=0;xs=0;eq=1;if(xy=0)delay(5);if(xy=0)while(!xy);if(1=eq)qingling();return;if(flag=0)write_data(0x5e);aa=sum;sum=0;ws1=ws;ws=0;flag=6;xs=0;if(fg=0)delay(5);if(fg=0)while(!fg);if(1=eq)qingling();return;if(flag=0)write_data(0x20);write_data

温馨提示

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

评论

0/150

提交评论