单片机计算器课程设计报告程序讲解.docx

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

单片机计算器课程设计报告程序讲解.docx

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

单片机计算器课程设计报告程序讲解.docx

单片机计算器课程设计报告程序讲解

单片机课程设计报告

一、内容摘要

用单片机做一个四则运算的计算器,首先查资料,了解各个电路的功能,事先须熟悉Keil和Proteus两个软件,及它们的联调,程序和仿真完成,就焊接电路板,焊接完,最后就系统联调,直到得出结果。

二、功能要求

利用89c51作为主控器组成一个四则运算的计算器。

三、电路原理图

电路图说明:

(1)键盘的列扫描接单片机P2口的低4位,行扫描接单片机P1口的低4位;

(2)数码管的段选通过单片机的P0口接74LS244来驱动,数码管的位选接单片机的P2口;

(3)晶振电路为单片机提供时钟频率;

(4)复位电路为单片机提供复位信号。

四、计算器功能说明

(1)通过数码管来显示键盘的按键,显示被加数(减数……),加数(……),运算结果;

(2)本计算器适合不大于八位整数的加、减、乘、除,要求结果也不大于八位整数,否则出错显示,显示(HELLO);

(3)在还没按一个数之前就按下=,+,--,*或/,则显示错误;按下+,--,*或/后,立马按下=,显示错误;

(4)若接连好了好几运算符键,实际参与运算的是最后一次按的运算键;

(5)本计算器有连加,连减,连乘,连除功能,例如:

2+5=7+5=12--5=7*5=35/5=7;

(6)减法可以实现负数,除法可以显示小数。

五、软件仿真

软件设计时,我是分一个一个模块设计的,设计顺序如下:

(1)数码管显示函数

voiddisplayljy(void)//"显示"子函数

{uchararray3[32]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,

0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,

0x79,0x71,0x00,0x40,0xbf,0x86,0xdb,

0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,

0x38,0x3e,0x6e,0xbe};

uchar*p=array,count=0xfe,i,time,time1;

F0=1;

while(F0)

{i=*p;

P2=count;

P0=array3[i];

for(time1=0x0c;time1>0x00;time1--)

for(time=0xff;time>0x00;time--);

p++;

count=_crol_(count,1);

if(count==0xfe)

F0=0;

}

}

(2)判断是否有键按下子函数

voidiskeyyou(void)//"判断是否有键按下"子函数

{P2=0x00;

P1|=0x0f;

a=P1;

a|=0xf0;

}

(3)键扫子函数

voidinkeylove(void)//"判断按下的是什么键"子函数

{ucharb=0xfe,c=0x00,d;

uchararray4[16]={0x07,0x08,0x04,0x05,0x01,0x02,0x0f,0x00,

0x09,0x0a,0x06,0x0b,0x03,0x0c,0x0e,0x0d};

F1=0;

iskeyyou();

if(a!

=0xff)

{displayljy();

displayljy();

iskeyyou();

if(a!

=0xff)

{F0=1;

while(F0)

{P2=b;

P1|=0x0f;

if(P10==0)

{a=0x00;

F1=1;

}

elseif(P11==0)

{a=0x02;

F1=1;

}

elseif(P12==0)

{a=0x04;

F1=1;

}

elseif(P13==0)

{a=0x06;

F1=1;

}

else

{a=c;

a%=4;

if(a==0x01)

{a=0x07;

c+=a;

}

else

c++;

b=_crol_(b,1);

if(b&0x10==0)

{F0=0;

a=0xff;

}

}

while(F1)

{a+=c;

a=array4[a];

d=a;

while(a!

=0xff)

{displayljy();

iskeyyou();

}

a=d;

F1=0;

F0=0;

}

}

}

}

}

(4)两个变形的子函数

voidbian1(void)//"将uchar型变量转化为ulong型变量"子函数

{uchari;

for(i=7;i>0;i--)

{if(array[i]==0x10)

array[i]=0x00;

if(array1[i]==0x10)

array1[i]=0x00;

}

num1=(ulong)array1[7]*10000000;

num1+=(ulong)array1[6]*1000000;

num1+=(ulong)array1[5]*100000;

num1+=(ulong)array1[4]*10000;

num1+=(ulong)array1[3]*1000;

num1+=(ulong)array1[2]*100;

num1+=(ulong)array1[1]*10;

num1+=(ulong)array1[0];

num2=(ulong)array[7]*10000000;

num2+=(ulong)array[6]*1000000;

num2+=(ulong)array[5]*100000;

num2+=(ulong)array[4]*10000;

num2+=(ulong)array[3]*1000;

num2+=(ulong)array[2]*100;

num2+=(ulong)array[1]*10;

num2+=(ulong)array[0];

}

voidbian2(void)//声明"将ulong型变量转化为uchar型变量"子函数

{uchari=7,F0=1;

if(num1>99999999)

error();

else

{array[7]=(uchar)(num1/10000000);

array[6]=(uchar)(num1%10000000/1000000);

array[5]=(uchar)(num1%1000000/100000);

array[4]=(uchar)(num1%100000/10000);

array[3]=(uchar)(num1%10000/1000);

array[2]=(uchar)(num1%1000/100);

array[1]=(uchar)(num1%100/10);

array[0]=(uchar)(num1%10);

while(i>0&&F0)

{if(array[i]==0x00)

{array[i]=0x10;

i--;

}

else

F0=0;

}

}

}

(5)主函数

voidmain()

{ucharr7=0x00,i;

while

(1)

{displayljy();

inkeylove();

if(a!

=0xff)//如果有键输入,继续往下执行,否则从新开始

{if(a==0x0f)//如果输入的是"清除"键,将显示器清屏,同时清存放运算符号的单元

{r7=0x00;

for(i=0;i<8;i++)

{array[i]=0x10;

array1[i]=0x10;

}

}

elseif(a==0x0e)//如果输入的是"=",继续往下执行,否则从新开始

{if(array1[0]==0x10)//如果未按下第二个数之前就按下“=”,则出错显示

error();

elseif(r7==0x0d)//如果r7中存放的是"+",则执行加运算

{bian1();

jia();

bian2();

r7=0x00;

for(i=0;i<8;i++)

array1[i]=0x10;

}

elseif(r7==0x0c)//如果r7中存放的是"-",则执行减运算

{bian1();

jian();

r7=0x00;

for(i=0;i<8;i++)

array1[i]=0x10;

}

elseif(r7==0x0b)//如果r7中存放的是"*",则执行乘运算

{bian1();

cheng();

bian2();

r7=0x00;

for(i=0;i<8;i++)

array1[i]=0x10;

}

elseif(r7==0x0a)//如果r7中存放的是"÷",则执行除运算

{bian1();

chu();

r7=0x00;

for(i=0;i<8;i++)

array1[i]=0x10;

}

else

error();//如果r7没有存进运算符,则转出错处理

}

else

{if(r7!

=0x00)//如果已按过运算键,往下执行,否则转else

{if(a>0x09&&a<0x0e)//如果还按下运算键,则后按的取代前面按的

r7=a;

elseif(array1[0]==0x10)//判断是不是输入加数(减数...)的第一个数

{for(i=0;i<8;i++)//是的话,将被加数(被减数...)存入array1中

array1[i]=array[i];

for(i=0;i<8;i++)

array[i]=0x10;

for(i=7;i>0;i--)//array中存入加数(减数...)

array[i]=array[i-1];

array[0]=a;

}

else//不是输入加数(减数...)的第一个数

{if(array[7]!

=0x10)//如果加数(减数...)已是八位整数,则转出错处理

error();

else

{for(i=7;i>0;i--)//否则将加数左移

array[i]=array[i-1];

array[0]=a;

}

}

}

else//之前还没有运算键按下

{if(a>0x09)//有运算键按下

{if(array[0]==0x10)//但是在运算键按下之前没有输入被加数,则转出错

error();

else

r7=a;//否则将运算键输入r7中保存

}

elseif(array[7]!

=0x10)//如果被加数已是八位整数,则转出错

error();

else//否则将被加数左移

{for(i=7;i>0;i--)

array[i]=array[i-1];

array[0]=a;

}

}

}

}

}

}

(6)加、减、乘、除、出错显示子函数

voidjia(void)//"加运算"子函数

{num1+=num2;

}

voidjian(void)//"减运算"子函数

{uchari;

if(num1>num2)

{num1-=num2;

bian2();

}

elseif(num1==num2)

{for(i=1;i<8;i++)

array[i]=0x10;

array[0]=0x00;

}

else

{num1=num2-num1;

bian2();

if(array[7]!

=0x10)

error();

else

array[7]=0x11;

}

}

voidcheng(void)////声明"乘运算"子函数

{num1*=num2;

}

voidchu(void)//"除运算"子函数

{uchari,j=0x00,k;

doublenum3;

num3=(double)(num1)/(double)(num2);

num1=(ulong)(num3);

num3-=num1;

if(num3==0||num1>9999999)

bian2();

else

{bian2();

while(array[7]==0x10)

{j++;

for(i=7;i>0;i--)

array[i]=array[i-1];

array[0]=0x10;

}

array[j]+=0x12;

k=j-1;

while(k>0)

{num3*=10;

num2=(ulong)(num3);

num3-=num2;

array[k]=(uchar)(num2);

k--;

}

num3*=10;

num2=(ulong)(num3);

array[0]=(uchar)(num2);

while(array[0]==0x00)

{for(i=0;i<7;i++)

array[i]=array[i+1];

array[7]=0x10;

}

}

}

voiderror(void)//"出错显示"子函数(出错显示"HELLO")

{array[7]=0x10;

array[6]=0x10;

array[5]=0x10;

array[4]=0x1d;

array[3]=0x0e;

array[2]=0x1c;

array[1]=0x1c;

array[0]=0x12;

}

(7)全局变量定义,函数声明等

#include

#include//循环左右移要用该头文件(-cror-(),-crol-())

#defineucharunsignedchar

#defineulongunsignedlong

uchararray[8]={0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10};

uchararray1[8]={0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10};

uchara;

ulongnum1=0,num2=0;

sbitP10=P1^0;

sbitP11=P1^1;

sbitP12=P1^2;

sbitP13=P1^3;

sbitF1=PSW^1;//定义一个标志位,F0在头文件里已定义

voiddisplayljy(void);//声明"显示"子函数

voidinkeylove(void);//声明"判断按下的是什么键"子函数

voidiskeyyou(void);//声明"判断是否有键按下"子函数

voidbian1(void);//声明"将uchar型变量转化为ulong型变量"子函数

voidbian2(void);//声明"将ulong型变量转化为uchar型变量"子函数

voidjia(void);//声明"加运算"子函数

voidjian(void);//声明"减运算"子函数

voidcheng(void);//声明"乘运算"子函数

voidchu(void);//声明"除运算"子函数

voiderror(void);//声明"出错显示"子函数

六、系统联调

在焊接完板子后,我首先并没有把整个计算器的程序下进去,只是下了个显示的小程序,结果数码管的第四位没显示,首先我想段选肯定不会有错的,检查了程序对应的那个数和程序中位选的设置都没错,我想应该是接线中的位选错了,结果我用万用表检查电路发现也没错,这下我就纠结了,搞不清状况了,可是无意之中我按了板子,发下那个数码管显示了正确的数,但是只是一瞬间的事,我想肯定是我有个地方没焊稳,我就一个地方一个地方的按,最终定位在了单片机,单片机的底座我用的是单排母不是专门配的底座,因为用排母取下放上都比那个专门配的底座容易,我就重新认真的把底座补焊了下,结果就行了,接下来我就把计算器的程序下进去了,成功了,太开心了。

七、收获和体会

我觉得我这次最大的收获,就是编程能力有了较大的提高,因为以前一般小程序编得多,大程序编得少,所以学到了很多东西。

通过这次我真实体会到了编程应该一个模块一个模块编,这样真的很有好处,自己的思路也会很清晰。

编程的时候也要仔细认真,可能一个很小的错误,最后可能要找很久才能找出来,或者根本就找不出来。

现在对Keil和Proteus两个仿真软件已能灵活运用,我觉得这两个软件真的太好了,太强大了,让我们开发51系统省了很多事。

八、附录

(1)参考文献:

单片机原理及应用,人民邮电出版社,杨辉先,黄辉先主编

单片机原理及应用实验教程,湘潭大学出版社,胡洪波主编

上网查资料

(2)元器件清单:

51单片机

一块

74LS244芯片

1个

共阴极四连七段数码管

2个

集成键盘

1个

发光二极管

1个

电阻

100(2个),10K(1个)

瓷片电容

20pF(2个)

电解电容

10uF(1个)

按键

1个

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

当前位置:首页 > 自然科学 > 物理

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

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