单片机计算器课程设计报告

时间:2019-05-12 15:17:39下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《单片机计算器课程设计报告》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《单片机计算器课程设计报告》。

第一篇:单片机计算器课程设计报告

大连民族学院2007级电子信息工程专业单片机系统课程设计报告

机电信息工程学院

单片机系统课程设计报告

完成日期:2010年5月31日

系: 专

业: 班

级: 设计题目: 学生姓名: 指导教师:

多功能简易计算器

大连民族学院2007级电子信息工程专业单片机系统课程设计报告

一、设计任务和性能指标......................................................................2

1.1设计任务..............................................................................................................................2 1.2性能指标..............................................................................................................................2 二.设计方案.............................................................................................2 三.系统硬件设计.....................................................................................3

3.1单片机最小系统......................................................................................3 3.2键盘接口电路.....................................................................................................................3 3.3数码管显示电路.................................................................................................................4 3.4错误报警电路.....................................................................................................................5

四、系统软件设计..................................................................................6

4.1键盘扫描子程序设计..........................................................................................................6 4.2移位子程序及结果计算子程序设计................................................................................10 4.3显示子程序设计...............................................................................................................12 4.4主程序设计.......................................................................................................................13

五、调试及性能分析............................................................................13

5.1调试步骤...........................................................................................................................13 5.2性能分析...........................................................................................................................14

六、心得体会........................................................................................14 参考文献................................................................................................14 附录1 系统硬件电路图.......................................................................15 附录2 程序清单.................................................................................16

大连民族学院2007级电子信息工程专业单片机系统课程设计报告

一、设计任务和性能指标

1.1设计任务

利用单片机及外围接口电路(键盘接口和显示接口电路)设计制作一个计算器,用LED显示计算数值及结果。

要求用Protel 画出系统的电路原理图(要求以最少组件,实现系统设计所要求的功能),印刷电路板(要求布局合理,线路清晰),绘出程序流程图,并给出程序清单(要求思路清晰,尽量简洁,主程序和子程序分开,使程序有较强的可读性)。1.2性能指标

1.2.3.4.5.加法:四位加法,计算结果若超过四位则显示计算错误 减法:四位减法,计算结果若小于零则显示计算错误 乘法:个位数乘法 除法:整数除法

有清零功能,计算错误报警

二.设计方案

按照系统设计的功能的要求,初步确定设计系统由主控模块、显示模块、错误报警模块、键扫描接口电路共四个模块组成,电路系统构成框图如图1.1所示。主控芯片使用51系列AT89C52单片机,采用高性能的静态80C51设计,由先进工艺制造,并带有非易失性Flash程序存储器。它是一种高性能、低功耗的8位COMS微处理芯片,市场应用最多。

键盘电路采用4*4矩阵键盘电路。

显示模块采用4枚共阳极数码管和74ls273锁存芯片构成等器件构成。

错误报警电路采用5V蜂鸣器。

大连民族学院2007级电子信息工程专业单片机系统课程设计报告

三.系统硬件设计

3.1单片机最小系统

单片机最小系统就是支持主芯片正常工作的最小电路部分,包括主控芯片、复位电路和晶振电路。

主控芯片选取STC89C52RC芯片,因其具有良好的性能及稳定性,价格便宜应用方便。

晶振选取11.0592MHz,晶振旁电容选取30pF。

采用按键复位电路,电阻分别选取100Ω和10K,电容选取10μF。以下为单片机最小系统硬件电路图。

单片机最小系统硬件电路

3.2键盘接口电路

计算器所需按键有:

数字键:’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’,’0’ 大连民族学院2007级电子信息工程专业单片机系统课程设计报告

功能键:’+’, ’-‘ , ’*’, ’/ ’ , ’ = ’, ’ C(清零)’

共计16个按键,采用4*4矩阵键盘,键盘的行和列之间都有公共端相连,四行和四列的8个公共端分别接P1.0~P1.7,这样扫描P1口就可以完成对矩阵键盘的扫描,通过对16个按键进行编码,从而得到键盘的口地址,对比P1口德扫描结果和各按键的地址,我们就可以得到是哪个键按下,从而完成键盘的功能。

以下为键盘接口电路的硬件电路图

键盘接口电路

3.3数码管显示电路

采用4位数码管对计算数据和结果的显示,这里选取共阳数码管,利用NPN三极管对数码管进行驱动,为了节省I/O资源,采取动态显示的方法来显示计算数据及结果。

利用74273锁存器来实现数码管的动态显示,P0口输出显示值,P2.4为段选口,控制273锁存器的时钟引脚,从而得到对数码管输入数据的控制。

P2.0~P2.3用来作为位选端,控制哪几位数码管进行显示。

以下为数码显示电路的硬件电路图

大连民族学院2007级电子信息工程专业单片机系统课程设计报告

数码显示电路硬件电路图

3.4错误报警电路

错误报警电路就是在计算结果出现错误时或输入数据出现错误时,发出声音警报,提示使用者错误出现。

这里就采用5V蜂鸣器作为报警设备,利用PNP三极管对蜂鸣器进行驱动,有P2.5对其进行控制,这样在出现错误的同时用P2.5输出低,就可以使蜂鸣器工作,完成报警任务。

以下为报警电路硬件电路图

大连民族学院2007级电子信息工程专业单片机系统课程设计报告

报警电路硬件电路图

系统整体硬件电路图见附录一

四、系统软件设计

4.1键盘扫描子程序设计

要进行数据的计算就必须先进行数据的输入,也就必须确定按键输入的数值是什么,这就需要对键盘进行扫描,从而确定究竟是哪个键按下。

对于键盘的扫描,既可以用行扫描也可以用列扫描,这里采用行扫描的方法来完成对键盘的扫描。

行扫描就是逐行扫描键盘,看是哪一行有键按下,再通过返回的键码来确定究竟是哪个按键按下。如对第一行扫描就令P1.0为低,P1口其余为高,这样若第一行有键按下,则P1口的值就会由0xfe变为其他值,再由这个值来确定是哪个键按下。

以下为键盘扫描子程序的程序清单。

uchar keyscan(){

int i;

P1=0xfe;

temp=P1;

temp=temp&0xf0;大连民族学院2007级电子信息工程专业单片机系统课程设计报告

while(temp!=0xf0){

delay(5);

temp=P1;

temp=temp&0xf0;

while(temp!=0xf0)

{

temp=P1;

switch(temp)

{

case 0xee:{rdat++;num=1;left(rdat,num);}

break;

case 0xde:{rdat++;num=2;left(rdat,num);}

break;

case 0xbe:{rdat++;num=3;left(rdat,num);}

break;

case 0x7e:{rdat++;num=4;left(rdat,num);}

break;

}

while(temp!=0xf0)

{

temp=P1;

temp=temp&0xf0;

}

} } P1=0xfd;temp=P1;temp=temp&0xf0;while(temp!=0xf0){

delay(5);

temp=P1;

temp=temp&0xf0;

while(temp!=0xf0)

{

temp=P1;

switch(temp)

{

case 0xed:{rdat++;num=5;left(rdat,num);}

break;

case 0xdd:{rdat++;num=6;left(rdat,num);}

break;大连民族学院2007级电子信息工程专业单片机系统课程设计报告

}

case 0xbd:{rdat++;num=7;left(rdat,num);}

break;

case 0x7d:{rdat++;num=8;left(rdat,num);}

break;} while(temp!=0xf0){

temp=P1;

temp=temp&0xf0;} }

P1=0xfb;temp=P1;temp=temp&0xf0;while(temp!=0xf0){

delay(5);

temp=P1;

temp=temp&0xf0;

while(temp!=0xf0)

{

temp=P1;

switch(temp)

{

case 0xeb:{rdat++;num=9;left(rdat,num);}

break;

case 0xdb:{rdat++;num=10;left(rdat,num);}

break;

case 0xbb:{equ();}

break;

case 0x7b:{rdat=0;add=0;subb=0;mul=0;div=0;

result=0;

dat[0]=10;dat[1]=dat[2]=dat[3]=0;

}

break;

}

while(temp!=0xf0)

{

temp=P1;

temp=temp&0xf0;

} 大连民族学院2007级电子信息工程专业单片机系统课程设计报告

} }

P1=0xf7;temp=P1;temp=temp&0xf0;while(temp!=0xf0){

delay(5);

temp=P1;

temp=temp&0xf0;

while(temp!=0xf0)

{

temp=P1;

switch(temp)

{

case 0xe7:{rdat=0;add=1;subb=0;mul=0;div=0;

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

if(dat[i]==10){dat[i]=0;}

}

result=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3];

dat[0]=10;dat[1]=dat[2]=dat[3]=0;

}

break;

case 0xd7:{rdat=0;add=0;subb=1;mul=0;div=0;

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

if(dat[i]==10){dat[i]=0;}

}

result=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3];

dat[0]=10;dat[1]=dat[2]=dat[3]=0;

}

break;

case 0xb7:{rdat=0;add=0;subb=0;mul=1;div=0;

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

if(dat[i]==10){dat[i]=0;}

}

result=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3];

dat[0]=10;dat[1]=dat[2]=dat[3]=0;

}

break;

case 0x77:{rdat=0;add=0;subb=0;mul=0;div=1;大连民族学院2007级电子信息工程专业单片机系统课程设计报告

} return num;}

} while(temp!=0xf0){

temp=P1;

temp=temp&0xf0;} }

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

if(dat[i]==10){dat[i]=0;}

}

result=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3];

dat[0]=10;dat[1]=dat[2]=dat[3]=0;

} break;4.2移位子程序及结果计算子程序设计

输入数据要存储在一四位数组内,而我们键入的值是数据的高位,后键入的值是低位,这样我们就需要在输入低位数值时将高位数值从数组的低位移向数组的高位,这就是编写移位子程序的目的。

对于结果计算子程序,包含加、减、乘、除四种运算。以加法运算为例,各种运算各有其标志位来代表计算类型,当加法标志位add=1是,就将输入的两个数据按照加法进行计算。

首先将数组内的数按照对应的位关系,将其转化为一个十进制数,这样我们就得到了加速和被加数这样俩个十进制数,从而我们就可以简单的将两个数进行相加,结果就是我们所求的数值。但这个数值不能直接显示到数码管上,我们还要对其进行处理,使其变为对应进位的四个数存入数组内,以便显示。既通过对结果数值分别除以1000、100、10和对10取余,得到我们想要的四个数,送显示子程序显示。其余减、乘、除的计算方法与加法的计算方法一样,这里不再累述。

以下为移位子程序和结果计算子程序的程序清单。

void left(uchar rx,uchar date){

switch(rx)

{

case 1:dat[0]=date;break;大连民族学院2007级电子信息工程专业单片机系统课程设计报告

void equ(){

int i,j,k;

long int s;

if(add==1){for(i=0;i<5;i++){

if(dat[i]==10){dat[i]=0;}

}

s=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3];

result=result+s;add=0;}

if(subb==1){for(i=0;i<5;i++){

if(dat[i]==10){dat[i]=0;}

}

s=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3];

result=result-s;subb=0;}

if(mul==1){for(i=0;i<5;i++){

if(dat[i]==10){dat[i]=0;}

}

s=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3];

result=result*s;mul=0;

}

if(div==1){for(i=0;i<5;i++){

if(dat[i]==10){dat[i]=0;}

}

s=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3];

result=result/s;div=0;

}

If(result>9999){dat[0]=11;dat[3]=dat[2]=dat[1]=0;}

if(result<=9999)

{

dat[0]=result%10;

dat[1]=(result/10)%10;

dat[2]=(result/100)%10;

dat[3]=(result/1000)%10;

} for(j=3;j>0;j--)

{ if(dat[j]>0)

{

case 2:dat[1]=dat[0],dat[0]=date;break;

case 3:dat[2]=dat[1],dat[1]=dat[0],dat[0]=date;break;

case 4:dat[3]=dat[2],dat[2]=dat[1],dat[1]=dat[0],dat[0]=date;break;

} } 大连民族学院2007级电子信息工程专业单片机系统课程设计报告

for(k=j-1;k>=0;k--)

{

if(dat[k]==0){dat[k]=10;}

}

}

} if(dat[0]==0){dat[0]=10;} } 4.3显示子程序设计

从始至终无论是输入的计算数据,还是计算后的结果值。都存储在同一数组dat[ ]中,这样我们只要在显示时一直调用dat[ ]中的值,就能正确的显示数据。

以下为显示子程序的程序清单。

void display(){

uchar aa;

keyscan();

P2=0x07;

aa=dat[0];

P0=table[aa];

P2=0x27;

delay(3);

P2=0x0b;

aa=dat[1];

P0=table[aa];

P2=0x2b;

delay(3);

P2=0x0d;

aa=dat[2];

P0=table[aa];

P2=0x2d;

delay(3);

P2=0x0e;

aa=dat[3];

P0=table[aa];

P2=0x2e;

delay(3);

} 大连民族学院2007级电子信息工程专业单片机系统课程设计报告

4.4主程序设计

主程序既把以上各子程序串连成一个整体,使整个程序循环运行。而在以上程序中也已经加入了个程序之间的连接点,首先进入程序后就立即进入显示子程序,而显示子程序内又调用键盘扫描子程序,若有键按下,则会跳转到移位子程序和结果计算子程序进行相应的处理。通过计算或移位后,数组内的值发生改变,显示的值也会同时发生改变。之后再进行键盘扫描,如此反复运行,就构成了程序的整体。

以下为主程序清单。

void main(){ num=0;

while(1)

{

display();

} }

整体程序清单见附录二。

五、调试及性能分析

5.1调试步骤

在焊接好器件后,先不要将芯片插在芯片座上,要先验证先板上电源是否好用,有无短路等。接上USB电源,用万用表测量个芯片座对应电源和地之间的电压值,观察电压值是否正常。一切正常后方可将芯片插入芯片座,以继续测试其他功能。

将芯片插上后,对各个模块进行调试,按键是否工作正常,数码管是否显示正常等。编写相关部分的测试程序对其进行测试。

各部分硬件检测无误后,下载程序进行整体调试,一切正常后,结束调试过程。

在具体调试时首先遇到的问题是程序无法下载进入单片机,通过将电路板接线与原理电路图接线的对比发现,串口芯片与单片机连接的输入,输出接反,重新用铜线连接后,依然无法下载程序。后找到原因是由于下载串口与设计封装不符,用相对应的下载线可以下载。

成功下载程序后,发现数码管显示不正确,查看后发现有先没有连接,可能是制板时漏印,连接后显示正常。大连民族学院2007级电子信息工程专业单片机系统课程设计报告

5.2性能分析

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

加法运算:四位加法运算,和值不超过9999,若超过上限,则显示错误提示E,蜂鸣器报警提示。

减法运算:四位减法运算,若结果为负,对其取绝对值。

乘法运算:积不超过9999的乘法运算,若超出上限,显示错误提示E,蜂鸣器报警提示。

除法运算:整数除法,既计算结果为整数,若除数为零,则显示错误提示E,蜂鸣器报警提示。

通过对实际性能的分析,可以得到本次设计满足设计的要求。

六、心得体会

通过本次课程设计我真正的自己完成了对给定要求系统的硬件设计、电路设计、电路板设计、软件设计以及对成品的调试过程。从整个过程中学习到了很多方面的知识,了解到以往学习中自己知识在某方面的不足之处,是对以往学习科目的一种贯穿和承接,从而能更好的认识和学习,也对将来从事工作大有裨益。

从本次课设中我也看到了自身的很多不足之处,对知识的掌握不够扎实,有一知半解的现象。有时做事不够稳定,过于毛躁,不能平心静气的去分析所遇到的问题和错误。这在以后的工作和生活中是不可取的,通过对自身问题的认识与改正相信再遇到同样问题时会更好的解决。以后的设计实验也会更好的完成。

参考文献

[1] 徐维祥、刘旭敏.单片微型机原理及应用.大连:大连理工大学出版社,1996 [2] 李光飞、楼然苗、胡佳文、谢象佐.单片机课程设计与实例指导.北京: 北京航空航天大学出版社,2004

[3] 余永权.89系列FLASH单片机原理及应用.北京:电子工业出版社,2002 [4] 李群芳,黄建.单片机微型计算机与接口技术.北京:电子工业出版社,2001 [5] 楼然苗、李光飞.51系列单片机设计实例.北京:北京航空航天大学出版社,2003 大连民族学院2007级电子信息工程专业单片机系统课程设计报告

附录1 系统硬件电路图 大连民族学院2007级电子信息工程专业单片机系统课程设计报告

附录2 程序清单

#include #define uint unsigned int #define uchar unsigned char sbit dula=P2^6;sbit wela=P2^7;sbit key1=P3^4;uchar code table[]={ 0xff,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8, 0x80,0x90,0xc0,0x86};uchar dat[]={10,0,0,0,0};uchar s[],a[];uchar num,temp,num1,rdat,add,subb,mul,div;unsigned long int result;void left(uchar rx,uchar date);uchar keyscan();void equ();void delay(uint z){ uint x,y;for(x=z;x>0;x--)

for(y=110;y>0;y--);}

void display();void main(){ num=0;

while(1)

{

display();

} } void display(){

uchar aa;

keyscan();

P2=0x07;

aa=dat[0];大连民族学院2007级电子信息工程专业单片机系统课程设计报告

P0=table[aa];

P2=0x27;

delay(3);

P2=0x0b;

aa=dat[1];

P0=table[aa];

P2=0x2b;

delay(3);

P2=0x0d;

aa=dat[2];

P0=table[aa];

P2=0x2d;

delay(3);

P2=0x0e;

aa=dat[3];

P0=table[aa];

P2=0x2e;

delay(3);

} uchar keyscan(){

int i;

P1=0xfe;

temp=P1;

temp=temp&0xf0;

while(temp!=0xf0)

{

delay(5);

temp=P1;

temp=temp&0xf0;

while(temp!=0xf0)

{

temp=P1;

switch(temp)

{

case 0xee:{rdat++;num=1;left(rdat,num);}

break;

case 0xde:{rdat++;num=2;left(rdat,num);}

break;

case 0xbe:{rdat++;num=3;left(rdat,num);}

break;大连民族学院2007级电子信息工程专业单片机系统课程设计报告

}

case 0x7e:{rdat++;num=4;left(rdat,num);}

break;} while(temp!=0xf0){

temp=P1;

temp=temp&0xf0;} } P1=0xfd;temp=P1;temp=temp&0xf0;while(temp!=0xf0){

delay(5);

temp=P1;

temp=temp&0xf0;

while(temp!=0xf0)

{

temp=P1;

switch(temp)

{

case 0xed:{rdat++;num=5;left(rdat,num);}

break;

case 0xdd:{rdat++;num=6;left(rdat,num);}

break;

case 0xbd:{rdat++;num=7;left(rdat,num);}

break;

case 0x7d:{rdat++;num=8;left(rdat,num);}

break;

}

while(temp!=0xf0)

{

temp=P1;

temp=temp&0xf0;

}

} }

P1=0xfb;temp=P1;大连民族学院2007级电子信息工程专业单片机系统课程设计报告

temp=temp&0xf0;while(temp!=0xf0){

delay(5);

temp=P1;

temp=temp&0xf0;

while(temp!=0xf0)

{

temp=P1;

switch(temp)

{

case 0xeb:{rdat++;num=9;left(rdat,num);}

break;

case 0xdb:{rdat++;num=10;left(rdat,num);}

break;

case 0xbb:{equ();}

break;

case 0x7b:{rdat=0;add=0;subb=0;mul=0;div=0;

result=0;

dat[0]=10;dat[1]=dat[2]=dat[3]=0;

}

break;

}

while(temp!=0xf0)

{

temp=P1;

temp=temp&0xf0;

}

} }

P1=0xf7;temp=P1;temp=temp&0xf0;while(temp!=0xf0){

delay(5);

temp=P1;

temp=temp&0xf0;

while(temp!=0xf0)

{

temp=P1;

switch(temp)大连民族学院2007级电子信息工程专业单片机系统课程设计报告

{

case 0xe7:{rdat=0;add=1;subb=0;mul=0;div=0;

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

if(dat[i]==10){dat[i]=0;}

}

result=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3];

dat[0]=10;dat[1]=dat[2]=dat[3]=0;

}

break;

case 0xd7:{rdat=0;add=0;subb=1;mul=0;div=0;

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

if(dat[i]==10){dat[i]=0;}

}

result=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3];

dat[0]=10;dat[1]=dat[2]=dat[3]=0;

}

break;

case 0xb7:{rdat=0;add=0;subb=0;mul=1;div=0;

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

if(dat[i]==10){dat[i]=0;}

}

result=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3];

dat[0]=10;dat[1]=dat[2]=dat[3]=0;

}

break;

case 0x77:{rdat=0;add=0;subb=0;mul=0;div=1;

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

if(dat[i]==10){dat[i]=0;}

}

result=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3];

dat[0]=10;dat[1]=dat[2]=dat[3]=0;

}

break;

}

while(temp!=0xf0)

{

temp=P1;

temp=temp&0xf0;

}

} 大连民族学院2007级电子信息工程专业单片机系统课程设计报告

} return num;}

void left(uchar rx,uchar date){

switch(rx)

{

case 1:dat[0]=date;break;

case 2:dat[1]=dat[0],dat[0]=date;break;

case 3:dat[2]=dat[1],dat[1]=dat[0],dat[0]=date;break;

case 4:dat[3]=dat[2],dat[2]=dat[1],dat[1]=dat[0],dat[0]=date;break;

} }

void equ(){ int i,j,k;long int s;

if(add==1){for(i=0;i<5;i++){

if(dat[i]==10){dat[i]=0;}

}

s=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3];

result=result+s;add=0;} if(subb==1){for(i=0;i<5;i++){

if(dat[i]==10){dat[i]=0;}

}

s=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3];

if(s>result){result=s-result;} else result=result-s;subb=0;} if(mul==1){for(i=0;i<5;i++){

if(dat[i]==10){dat[i]=0;}

}

s=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3];

result=result*s;mul=0;

} 大连民族学院2007级电子信息工程专业单片机系统课程设计报告

if(div==1){for(i=0;i<5;i++){

if(dat[i]==10){dat[i]=0;}

}

s=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3];

if(s==0)result=10000;

else result=result/s;div=0;

} if(result>9999){dat[0]=11;dat[3]=dat[2]=dat[1]=0;} if(result<=9999){ dat[0]=result%10;dat[1]=(result/10)%10;dat[2]=(result/100)%10;dat[3]=(result/1000)%10;} for(j=3;j>0;j--)

{ if(dat[j]>0)

{

for(k=j-1;k>=0;k--)

{

if(dat[k]==0){dat[k]=10;}

}

}

}

if(dat[0]==0){dat[0]=10;} } 22

第二篇:单片机计算器课程设计报告

基于单片机的简易计算器设计

基于单片机的简易计算器设计

一、设计任务和性能指标

1.1设计任务

利用单片机及外围接口电路(键盘接口和显示接口电路)设计制作一个计算器,用四位一体数码管显示计算数值及结果。要求用Protel 画出系统的电路原理图(要求以最少组件,实现系统设计所要求的功能),绘出程序流程图,并给出程序清单(要 求思路清晰,尽量简洁,主程序和子程序分开,使程序有较强的可读性)。1.2性能指标

1加法:能够计算四位以内的数的加法。2减法:能计算四位数以内的减法。3乘法:能够计算两位数以内的乘法。

4除法:能够计算四位数的乘法

5有清零功能,能随时对运算结果和数字输入进行清零。

二、系统设计方案

按照系统设计的功能的要求,初步确定设计系统由单片机主控模块、四位一体数码管显示模块、键扫描接口电路共三个主要模块组成。主控芯片使用51系列AT89C51单片机,采用高性能的静态80C51设计,它由先进工艺制造,并带有非易失性Flash程序存储器。它是一种高性能、低功耗的8位COMS微处理芯片,市场应用最多。

键盘电路采用4*4矩阵键盘电路。

显示模块采用四位一体共阳极数码管和SN74LS244锁存芯片构成等器件构成。

三、硬件系统设计

1.单片机最小系统

单片机最小系统就是支持主芯片正常工作的最小电路部分,包括主控芯片、复位电路和晶振电路。

主控芯片选取STC89C51RC芯片,因其具有良好的性能及稳定性,价格便宜应用方便。

晶振选取11.0592MHz,晶振旁电容选取30pF。

采用按键复位电路,电阻分别选取100Ω和10K,电容选取10μF。单片机最小系统硬件电路图如图(1)所示。

图(1)单片机最小系统

2.键盘接口电路

计算器所需按键有:

数字键:’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’,’0’

功能键:’+’, ’-‘ , ’*’, ’/ ’ , ’ = ’, ’ C(清零)’

共计16个按键,采用4*4矩阵键盘,键盘的行和列之间都有公共端相连,四行采用端口P0.0~P0.3,四列采用端口P3.0~P3.3,通过8个端口的的高低电平完成对矩阵键盘的控制。通过对16个按键进行编码,从而得到键盘的口地址,对比P1口德扫描结果和各按键的地址,我们就可以得到是哪个键按下,从而完成键盘的功能。

3.数码管显示电路

采用4位一体的数码管对计算数据和结果进行显示,这里选取共阳数码管,利用NPN三极管对数码管进行驱动,为了节省I/O资源,采取动态显示的方法来显示计算数据及结果。

利用SN74LS244N锁存器来实现数码管的动态显示,P1口输出显示值,P2.0~P2.3为位选端口。通过锁存器对段选信号的锁存,最终得到对数码管输入数据的控制。

以下为数码显示电路的硬件电路图,左图为数码管驱动电路,右图为段选信号锁存电路。

四.软件设计部分

根据选题要求,系统编程如下所示: #include “reg51.h” sbit P3_0=P3^0;sbit P3_1=P3^1;sbit P3_2=P3^2;sbit P3_3=P3^3;sbit P3_4=P3^4;sbit P3_5=P3^5;sbit P3_6=P3^6;sbit P3_7=P3^7;unsigned char sz[11],xs1[4],xs2[4],sj;int i,cs,bb,t1,t2,fh,s1,s2;void chushihua(){

} void xianshi(unsigned char xs[4]){ int i,j;unsigned char zy;bb=1;xs1[0]=10;xs1[1]=10;xs1[2]=10;xs1[3]=10;xs2[0]=10;xs2[1]=10;xs2[2]=10;xs2[3]=10;t1=0;t2=0;s1=s2=0;fh=0;cs=1;

// zy=0x08;for(i=0;i<4;i++){ P2=(0xff-zy);

P1=sz[xs[i]];

} zy=(zy>>1);for(j=0;j<100;j++);

for(i=0;i<100;i++);return;} unsigned char saomiao(){

int i,j;unsigned char pp;for(i=0;i<1000;i++);P0=0xfe;P3=0x0f;pp=P3;if(P3_0==0)if(P3_1==0)if(P3_2==0)if(P3_3==0)

{P3=0x0f;pp=P3;while(P3_0==0);for(i=0;i<1000;i++);return 7;} {P3=0x0f;pp=P3;while(P3_1==0);for(i=0;i<1000;i++);return 8;} {P3=0x0f;pp=P3;while(P3_2==0);for(i=0;i<1000;i++);return 9;} {P3=0x0f;pp=P3;while(P3_3==0);for(i=0;i<1000;i++);return 11;} //==========1 P0=0xfd;P3=0x0f;pp=P3;if(P3_0==0){P3=0x0f;pp=P3;while(P3_0==0);for(i=0;i<1000;i++);return 4;} if(P3_1==0){P3=0x0f;pp=P3;while(P3_1==0);for(i=0;i<1000;i++);return 5;} if(P3_2==0){P3=0x0f;pp=P3;while(P3_2==0);for(i=0;i<1000;i++);return 6;} if(P3_3==0){P3=0x0f;pp=P3;while(P3_3==0);for(i=0;i<1000;i++);return 12;} //==========2 P0=0xfb;P3=0x0f;pp=P3;if(P3_0==0){P3=0x0f;pp=P3;while(P3_0==0);for(i=0;i<1000;i++);return 1;} if(P3_1==0){P3=0x0f;pp=P3;while(P3_1==0);for(i=0;i<1000;i++);return 2;} if(P3_2==0){P3=0x0f;pp=P3;while(P3_2==0);for(i=0;i<1000;i++);return 3;} if(P3_3==0){P3=0x0f;pp=P3;while(P3_3==0);for(i=0;i<1000;i++);return 13;} //==========3 P0=0xf7;P3=0x0f;

pp=P3;if(P3_0==0)if(P3_1==0)if(P3_2==0)if(P3_3==0)return 10;

{P3=0x0f;pp=P3;while(P3_0==0);for(i=0;i<1000;i++);return 16;} {P3=0x0f;pp=P3;while(P3_1==0);for(i=0;i<1000;i++);return 0;} {P3=0x0f;pp=P3;while(P3_2==0);for(i=0;i<1000;i++);return 15;} {P3=0x0f;pp=P3;while(P3_3==0);for(i=0;i<1000;i++);return 14;} //===========4 } void chuli(unsigned char x){

int i;if(x==16){

} cs=0;return;if(x>=0 && x<10){ if(bb==1)

{

} if(s1= =4){cs=0;return;} else { for(i=3;i>0;i--)xs1[i]=xs1[i-1];

} xs1[0]=x;s1++;t1=t1*10+x;if(bb==2){

if(s2==4){cs=0;return;} else {

} for(i=3;i>0;i--)xs2[i]=xs2[i-1];xs2[0]=x;s2++;t2=t2*10+x;} } if(x>10)

{

if(bb==1){fh=x;bb=2;return;} if(bb==2){ if(fh==11)t1=t1/t2;

if(fh==12)t1=t1*t2;if(fh==13)t1=t1-t2;if(fh==14)t1=t1+t2;if(t1>=10000){cs=0;return;} else { if(t1>=0 && t1<10)

{xs1[0]=t1;xs1[1]=10;xs1[2]=10;xs1[3]=10;}

if(t1>=10 && t1<100){xs1[0]=t1%10;xs1[1]=t1/10;xs1[2]=10;xs1[3]=10;}

if(t1>=100 && t1<1000)

{xs1[0]=t1%10;xs1[1]=(t1-(t1/100)*100)/10;xs1[2]=t1/100;xs1[3]=10;}

if(t1>=1000 && t1<10000)

{xs1[0]=t1%10;xs1[1]=t1%100/10;xs1[2]=(t1-(t1/1000)*1000)/100;xs1[3]=t1/1000;}

bb=2;

}

}

} s2=0;t2=0;xs2[0]=10;xs2[1]=10;xs2[2]=10;xs2[3]=10;fh=x;} void main(){

sz[0]=0xfc;sz[1]=0x60;sz[2]=0xda;sz[3]=0xf2;sz[4]=0x66;sz[5]=0xb6;sz[6]=0xbe;sz[7]=0xe0;sz[8]=0xfe;sz[9]=0xf6;sz[10]=0x00;cs=0;

for(;;)

{

if(cs==0)chushihua();if(cs==1)sj=saomiao();if(cs==1 && sj!=10)chuli(sj);if(cs==1 &&(bb==1 || bb==2 && s2==0))xianshi(xs1);if(cs==1 &&(bb==2 && s2!=0))xianshi(xs2);

} } 软件设计好后,在KEIL上面进行仿真,把仿真得到的文件下载到Proteus里面进行仿真,得到Proteus仿真电路图如下所示:

图(2)

计算器Proteus仿真电路图

五.硬件电路焊接及调试

根据电路图纸,焊接好硬件电路,把程序下载到单片机芯片,接通好电源,进行调试。在焊接好器件后,先不要将芯片插在芯片座上,要先验证先板上电源是否好用,有无短路等。接上USB电源,用万用表测量个芯片座对应电源和地之间的电压值,观察电压值是否正常。一切正常后方可将芯片插入芯片座,以继续测试其他功能。

将芯片插上后,对各个模块进行调试,按键是否工作正常,数码管是否显示正常等。编写相关部分的测试程序对其进行测试。

各部分硬件检测无误后,下载程序进行整体调试,一切正常后,结束调试过程。

用所设计的单片机进行数字计算,显示结果与任务要求一致,焊接电路符合要求。六.课程设计心得

两周的时间,终于把单片机课程设计搞完了。整个体会还是比较多的。首先是题目的选择,各方面的原因,自己还是想选个简单点的题目,不过最后选来选去,还是选择了计算器。由于自己对单片机编程还不是很熟悉,结果在设计的时候遇到了一系列问题,程序总是调试部处理,不过还好,最后在同学的帮助下终于把程序调试出来了,虽然程序设计实现的功能与老师要求的不尽相同,不过勉强还算可以。从这里我知道了基本知识的重要性。其实进行程序设计的时候主要是对各功能模块的把握。计算器里面最难的一部分是矩阵键盘的扫描和编码,那个费了很大力气。

另外一点就是硬件焊接调试部分。焊接的时候到时轻松,一个下午就焊接好了,然后是调试部分。调试花费的时间还是比较长的。不过有了上个学期数字电路焊接调试的经验,这次单片机调试还算是比较顺利。我也是从电路板的正负电源检测起,一步一步来,最终得到了想要的结果。调试的时候主要遇到了两个问题。一个是键盘总是没有反应,为了这个自己调试了很久,前前后后把电路板检查了几次,最后才发现是键盘本身的问题,和同学们换了个好键盘才行。另一个问题是总是显示不出来1、4、7这三个数字。检测来检测去,发现来是在测试最小系统时在一个位选端接了高电平,对位选信号产生了影响。当把那个高电平去掉后,终于得到了正确的结果。

总的来说这次课程设计达到了完成了基本任务,达到了基本要求。通过亲身对程序设计和电路焊接调试的体会,自己对单片机有了进一步的了解,单片机编程能力也得到了提高。电路板的焊接与调试,使自己电路调试的方法和思想进一步加强了。这次单片机课程设计应该说是比较成功的。

参考文献:

【1】徐维祥、刘旭敏:,《单片微型机原理及应用》,大连理工大学出版社,1996年。【2】李光飞、楼然苗、胡佳文、谢象佐.,《单片机课程设计与实例指导.》,北京航空航天大学出版社,2004年。

【3】余永权,《89系列FLASH单片机原理及应用.》,电子工业出版社,2002。【4】杨恢先、黄辉先,《单片机原理及应用》,人民邮电出版社,2006年。【5】常敏、王涵、范江波,《单片机应用程序开发与实践》,电子工业出版社,2009年。

第三篇:基于AT89C51单片机的电子计算器的课程设计

C51单片机电子计算器课程设计

一.课程设计背景

当今时代,是一个新技术层出不穷的时代。在电子领域,尤其是自动化智能控制领域,传统的分立元件或数字逻辑电路构成的控制系统正以前所未见的速度被单片机智能控制系统所取代。单片机具有体积小、功能强、成本低、应用面广等优点,可以说,智能控制与自动控制的核心就是单片机。目前,一个学习与应用单片机的高潮正在工厂、学校及企事业单位大规模地兴起。过去习惯于传统电子领域的工程师、技术员正面临着全新的挑战,如不能在较短时间内学会单片机,势必会被时代所遗弃,只有勇敢地面对现实,挑战自我,加强学习,争取在较短的时间内将单片机技术融会贯通,才能跟上时代的步伐。

它所给人带来的方便也是不可否定的,它在一块芯片内集成了计算机的各种功能部件,构成一种单片式的微型计算机。20世纪80年代以来,国际上单片机的发展迅速,其产品之多令人目不暇接,单片机应用不断深入,新技术层出不穷。20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。本设计是由单片机实现的模拟计算器,它不仅能实现数据的加减乘除运算,而且还能使数据及其计算结果在数码管上显示出来,能够实现0-256的数字四则运算。本设计是用单片机AT89C51来控制,采用共阳极数码显示,软件部分是由C语言来编写的。设计任务

二、元器件清单及简介

89c51型芯片 一片

排阻 两个

晶振12MHZ 一个

电容22uf 两个

面包板 三个

导线 若干

三、设计原理及分析

根据功能和指标要求,本系统选用MCS 51 单片机为主控机。通过扩展必要的外围接口电路,实现对计算器的设计。具体设计考虑如下: ①由于要设计的是简单的计算器,可以进行四则运算,对数字的大小范围要求不高,故我们采用可以进行四位数字的运算,选用8 个LED 数码管显示数据和结果。

②另外键盘包括数字键(0~9)、符号键(+、-、×、÷)、清除键和等号键,故只需要16 个按键即可。系统模块图:

2.1 输入模块:

键盘扫描计算器输入数字和其他功能按键要用到很多按键,如果采用独立按键的方式,在这种情况下,编程会很简单,但是会占用大量的I/O 口资源,因此在很多情况下都不采用这种方式。为此,我们引入了矩阵键盘的应用,采用四条I/O 线作为行线,四条I/O 线作为列线组成键盘。在行线和列线的每个交叉点上设置一个按键。这样键盘上按键的个数就为4×4个。这种行列式键盘结构能有效地提高单片机系统中I/O 口的利用率。矩阵键盘的工作原理:计算器的键盘布局如图所示:一般有16 个键组成,在单片机中正好可以用一个P 口实现16 个按键功能,这种形式在单片机系统中也最常用。

以上键盘从上到下依次编号为1,2,3,4,D,C,B,A 1

由图 3 矩阵键盘内部电路图可以知道,当无按键闭合时,P10~P13 与P14~P17 之间开路。当有键闭合时,与闭合键相连的两条I/O 口线之间短路。判断有无按键按下的方法是:第一步,置列线P14~P17 为输入状态,从行线P10~P13 输出低电平,读入列线数据,若某一列线为低电平,则该列线上有键闭合。第二步,行线轮流输出低电平,从列线P14~P17 读入数据,若有某一列为低电平,则对应行线上有键按下。综合一二两步的结果,可确定按键编号。但是键闭合一次只能进行一次键功能操作,因此须等到按键释放后,再进行键功能操作,否则按一次键,有可能会连续多次进行同样的键操作。2.2 运算模块:(单片机控制)AT89C51 单片机是在一块芯片中集成了CPU、RAM、ROM、定时器/计数器和多功能I/O等一台计算机所需要的基本功能部件。如果按功能划分,它由如下功能部件组成,即微处理器(CPU)、数据存储器(RAM)、程序存储器(ROM/EPROM)、并行I/O 口、串行口、定时器/计数器、中断系统及特殊功能寄存器(SFR)。[3][5]单片机是靠程序运行的,并且可以修改。通过不同的程序实现不同的功能,尤其是特殊的独特的一些功能,通过使用单片机编写的程序可以实现高智能,高效率,以及高可靠性!因此我们采用单片机作为计算器的主要功能部件,可以进行很快地实现运算功能。2.3 显示模块:

LED 显示发光二极管LED 是单片机应用系统中的一宗简单而常用的输出设备,其在系统中的主要作用是显示单片机的输出数据、状态等。因而作为典型的外围器件,LED 显示单元是反映系统输出和操作输入的有效器件。LED 具备数字接口可以方便的和大年纪系统连接;它的优点是价格低,寿命长,对电压电流的要求低及容易实现多路等,因而在单片机应用系统中获得了广泛的应用。[2][4]通常的数码显示器是由7 段条形的LED 组成(如图4 所示),点亮适当的字段,就可显示出不同的数字。我们采用8 段数码管,其中位于显示器右下角的LED 作小数点用。LED 显示器有两种不同的形式:共阴极和共阳极。本次设计采用共阴极接法(如图5所示)。

3、软件设计

在程序设计方法上,模块化程序设计是单片机应用中最常用的程序设计方法。设计的中心思想是把一个复杂应用程序按整体功能划分成若干相对独立的程序模块,各模块可以单独设计、编程和调试,然后组合起来。这种方法便于设计和调试,容易实现多个程序共存,但各个模块之间的连接有一定的难度。根据需要我们可以采用自上而下的程序设计方法,此方法先从主程序开始设计,然后再编制各从属程序和子程序,层层细化逐步求精,最终完成一个复杂程序的设计。这种方法比较符合人们的日常思维,缺点是一级的程序错误会对整个程序产生影响。功能流程图如下:

4、硬件原理 以下为简易计算器的总体电路图

加运算:

减运算:

乘运算:

除运算:

清零: 四.总结

通过此次单片机实训设计,我们学到了很多东西,在器件的了解和器件选择上有个明确的认识,并在程序的设计,及理论在实践反面的运用能力有巨大的提高。

这次单片机课程设计由我们六位同学经过一周努力设计得到。软件的编程要我们不断的调试,最终我们终于完成了单片机实训课程设计,很高兴它能按着设计思想与要求运动起来。

当然,这其中也有很多的问题。第一、不够细心,由于对课本理论的不熟悉导致的编程错误,对于器件的实际情况的不了解,理论与实践的差距导致我们在设计实际电路时出现了很多错误,使得实验不能一次通过。第二、是在学习态度上,这次课程设计是对我们的学习态度的一次体验。对于这次单片机综合课程实习,我们的第一大心得体会就是作为一名工程技术人员,要求具备的首要素质绝对应该是严谨,这次的课程设计我们所遇到的问题多半是由于我们不够严谨。第三、在做人上,我们认识到,无论做什么事情,只要你足够坚强,有足够的毅力和决心,有足够的挑战困难的勇气,就没什么办不到的。还有就是团队的合作精神。

在这次难得的课程设计过程中我们锻炼了自己的思考能力和动手能力,加强了我们思考问题的完整性和实际生活联系的可行性。在方案设计选择和芯片的选择上,培养了我们综合应用单片机的能力,对单片机的各个管脚的功能也有了进一步的认识。还锻炼我们个人的查阅技术资料的能力,动手能力,发现问题、解决问题的能力。

五.参考文献

《单片机原理及应用》 张毅刚 高等教育出版社

《MCS—51单片机应用设计》 张毅刚 哈尔滨工业大学出版社 《MCS—51系列单片机实用接口技术》 李华 北京航空航天大学出版社 《单片机应用技术选集》 何立民 北京航空航天大学出版社 《单片机原理及其接口技术》 胡汉才 《数码管显示驱动和键盘扫描控制器CH451及其应用》

清华大学出版社 施隆照 /*********************************************** **实现说明:

1:变量flag_fuhao为键入+、-、*、/运算符标志

(即当前一个键值为+、-、*、/运算符时,flag_fuhao为1,其他键值则flag_fuhao置零,其用在显示时)

2:变量flag_shu数输入情况,flag_shu为0时,输入的符号无效(flag_shu为2时,变量fuhao更新为新键值)

*********************************************/ #include #define uchar unsigned char #define uint unsigned int #define duan P0//数码管显示段选定义 #define wei P2//数码管显示位选定义 #define key P3//键盘接口定义

sbit OFF = P1^0;//关机键定义

float shu1,shu2;//进行运算的两个变量数 uchar num;////键盘扫描返回值

char flag1,flag_shu,flag_fuhao,fuhao,newkey,update;

//flag1开机标志newkey新按键标志,fuhao运算符,update表示等于号 //之后紧接着输入的是数的话则清零shu1

char key_shu;//按键值 char ge=0xdf;//char code Wela[]={0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//六位数码管的位选

unsigned char code Duan[]={0x3f,0x06,0x5b, //

0 1 2 0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};// 3 4 5 6 7 8 9 无显示

共阴极数码管

// 函数声明

uchar keyscan();//键盘扫描函数

void display(float);//数码管显示函数

void delay(uint i)//延时函数 {

while(i--);}

/***********************************************

主函数

************************************************/ void main(){

flag1=0;//标志关机

while(1){

if(keyscan()==15)//开机检测

{

flag1=1;//标志开机

shu1=shu2=fuhao=flag_shu=newkey=0;//初始化变量

while(flag1)//判断是否已开机

{

if(!flag_fuhao)

display(shu1);//如果输入的不是

else

display(shu2);

key_shu=keyscan();

if(newkey==1)//有新键值

{

if(key_shu==15)//按下ON/C键,清零

{

flag_fuhao=update=0;

shu1=shu2=fuhao=flag_shu=newkey=0;

}

else if(key_shu==14&&flag_shu==1&&fuhao)//按下“=”

{

switch(fuhao)

{

case 10:shu1=shu2+shu1;break;

case 11:shu1=shu2-shu1;break;

case 12:shu1=shu2*shu1;break;

case 13:shu1=shu2/shu1;break;

}

flag_fuhao=0;

fuhao=0;

update=1;

} 10

else if((key_shu>=0)&&(key_shu<=9))//按下数字键

{

if(update)

shu1=0;

if(shu1<100000)

{

shu1=key_shu+shu1*10;

flag_shu=1;

}

update=0;

flag_fuhao=0;

}

else if((key_shu>=10)&&(key_shu<=13))//按下运算符

{

flag_fuhao=1;//表示按下了运算符号键

update=0;

if(flag_shu==1)//表示之前有数字键按下

{

if(fuhao==0)//表示计算时只有一次按下运算符,如1*8=8,第二个数字后面是=,而不是其他运算符

{

shu2=shu1;

shu1=0;

fuhao=key_shu;//将按下的运算符号的键的值赋值给fuhao,记录前一个运算符,以便按=后实现相应的计算。

flag_shu=2;

}

else

//表示计算时按了多次运算符,如1*8*9=72,第二个数字后面并没有=,而是*

{

switch(fuhao)

{

case 10:shu2=shu2+shu1;break;

case 11:shu2=shu2-shu1;break;

case 12:shu2=shu2*shu1;break;

case 13:shu2=shu2/shu1;break;

}

shu1=0;

fuhao=key_shu;//将按下的运算符号的键的值赋值给fuhao,记录前一个运算符,以便按=后实现相应的计算。

}

}

else if(flag_shu==2)

fuhao=key_shu;//将按下的运算符号的键的值赋值给fuhao,记录前一个运算符,以便按=后实现相应的计算。

}

newkey=0;

}

}

} } }

/***********************************************

数码管显示函数

************************************************/ void display(float dis_shu){

long zhengshu=(long)dis_shu;char dis_flag,dis_aa,dis_zero=0;uchar dis_data[6]={0,0,0,0,0,0},xiaoshu[6]={0,0,0,0,0,0};

ge=0xdf;//11 01 111 if(zhengshu>99999)dis_flag=6;else if(zhengshu>9999)dis_flag=5;else if(zhengshu>999)dis_flag=4;else if(zhengshu>99)dis_flag=3;else if(zhengshu>9)dis_flag=2;else dis_flag=1;

dis_shu=dis_shu-zhengshu;

for(dis_aa=0;(dis_aa<6-dis_flag)&&(dis_shu=(dis_shu-(char)dis_shu)*10);dis_aa++){

xiaoshu[dis_aa]=(long)dis_shu;}

for(dis_aa=0;(dis_aa<6-dis_flag);dis_aa++){

if(dis_zero||xiaoshu[5-dis_flag-dis_aa])12

{

duan=Duan[xiaoshu[5-dis_flag-dis_aa]];

wei=ge;

ge>>=1;

delay(100);

wei=0xff;

dis_zero=1;

} }

// for(dis_aa=0;dis_aa

dis_data[dis_aa]=zhengshu%10;

zhengshu=zhengshu/10;} //数码管段选

for(dis_aa=0;dis_aa

if(0xdf!=ge&&dis_aa==0)

{

duan=Duan[dis_data[dis_aa]]|0x80;

wei=ge;

ge>>=1;

delay(100);

wei=0xff;

}

else

{

duan=Duan[dis_data[dis_aa]];

wei=ge;

ge>>=1;

delay(100);

wei=0xff;

}

} //数码管位选 }

/***********************************************

键盘扫描函数

************************************************/ uchar keyscan()// 函数返回按键的值

{

//将第一行线置低电平,其余行线全部为高电平,即扫描第一行

key=0xfe;

if(key!=0xfe){

delay(500);//延时消抖操作

if(key!=0xfe)

{

switch(key)

{

case 0xee:num=7;break;//7

case 0xde:num=8;break;//8

case 0xbe:num=9;break;//9

case 0x7e:num=13;break;//除号 ”/”

}

newkey=1;

delay(500);

while(key!=0xfe)

{

if(flag1)//如果已开机

if(!shu1&&num>=0&&num<=9)//如果输入的第一个数不为0且第二个数为数字,则显示第二个数字,否则显示第一个数字

display(num);

else

display(shu1);

}

return num;

} }

//将第二行线置低电平,其余行线全部为高电平,即扫描第二行

key=0xfd;if(key!=0xfd){

delay(500);//延时消抖操作

if(key!=0xfd)

{

switch(key)

{

case 0xed:num=4;break;//4

case 0xdd:num=5;break;//5

case 0xbd:num=6;break;//6

case 0x7d:num=12;break;//*

}

newkey=1;

delay(500);

while(key!=0xfd)

{

if(flag1)

if(!shu1&&num>=0&&num<=9)//如果输入的第一个数不为0且第二个数为数字,则显示第二个数字,否则显示第一个数字

display(num);

else

display(shu1);

}

return num;

} }

//将第三行线置低电平,其余行线全部为高电平,即扫描第三行

key=0xfb;if(key!=0xfb){

delay(500);

if(key!=0xfb)

{

switch(key)

{

case 0xeb:num=1;break;//1

case 0xdb:num=2;break;//2

case 0xbb:num=3;break;//3 15

case 0x7b:num=11;break;//-

}

newkey=1;

delay(500);

while(key!=0xfb)

{

if(flag1)

if(!shu1&&num>=0&&num<=9)//如果输入的第一个数不为0且第二个数为数字,则显示第二个数字,否则显示第一个数字

display(num);

else

display(shu1);

}

return num;

} }

//将第四行线置低电平,其余行线全部为高电平,即扫描第四行

key=0xf7;if(key!=0xf7){

delay(500);

if(key!=0xf7)

{

switch(key)

{

case 0xe7:num=15;break;// ON/C:开关机按键

case 0xd7:num=0;break;// 0

case 0xb7:num=14;break;// =

case 0x77:num=10;break;// +

}

newkey=1;

delay(500);

while(key!=0xf7)

{

if(flag1)

if(!shu1&&num>=0&&num<=9)//如果输入的第一个数不为0且第二个数为数字,则显示第二个数字,否则显示第一个数字

display(num);

else

display(shu1);

} 16

return num;

} }

//判断关机按键是否被按下 if(!OFF){

delay(500);//延时消抖操作

if(!OFF)

{

flag1=0;//

}

} return 100;

}

若关机按键被按下,则将关机标志位flag1置1 17

第四篇:单片机课程设计报告格式

《单片机课程设计》报告格式

一、封面(注明:单片机课程设计报告、课题名称、班级、姓名、指导教师、日期)

二、摘要(课题简要说明)

三、课题设计目标(功能、性能指标)、方案论证(要求作两种以上方案比较)

四、设计过程(关键电路工作原理、元器件参数选用、程序流程图、程序)

五、软硬件的安装、调试方法

六、完整电路图、性能参数测试

七、存在的问题和改进方向

八、参考文献资料

第五篇:单片机课程设计报告格式

单片机课程设计报告格式要求

统一的A4纸打印。每页约44行,每行约34字;打印正文用宋体小四号字;版面页边距上空2.5cm,下空2cm,左空2.5cm,右空2cm;页码用小五号字,底端居中。

A、封面;B、课程设计任务书;C、摘要; D、目录; E、正文;F、参考文献;G、附录(源程序代码);H、有关图纸(系统的总体原理图)

摘要(内容提要)

摘要是论文内容的简要陈述,应尽量反映主要信息,内容包括研究目的、方法、成果和结论,不含图表,不加注释,具有独立性和完整性,‚摘要‛字样位置居中。

目录

目录按三级标题编写,要求层次清晰,且要与正文标题一致。主要包括绪论、正文主体、结论、主要参考文献及附录等。

题序层次大致有以下几种格式:

1、绪论

1.1课题背景

ˉˉˉˉˉˉ(正文)ˉˉˉˉˉˉˉˉˉ

1.2交会对接技术发展概况

ˉˉˉˉˉˉˉ(正文)ˉˉˉˉˉˉˉˉˉ

1.2.1俄罗斯空间交会对接发展概况

ˉˉˉˉˉˉˉ(正文)ˉˉˉˉˉˉˉˉˉ

1.2.2美国空间交会对接发展概况

ˉˉˉˉˉˉˉ(正文)ˉˉˉˉˉˉˉˉˉ

2、空间飞行器

2.1引言

ˉˉˉˉˉˉˉ(正文)ˉˉˉˉˉˉˉˉˉ

结论

ˉˉˉˉˉˉˉ(正文)ˉˉˉˉˉˉˉˉˉ

主要参考文献

为了反映报告的科学依据和作者尊重他人研究成果的严肃态度,同时向读者提供有关信息的出处,正文之后一般应列出主要参考文献(只限于那些作者亲自阅读过的,最重要的且发表在公开出版物上的文献或网上下载的资料)。报告中被引用的参考文献序号置于所引用部分的右上角。参考文献所列著作按报告中引用顺序排列,著作按如下格式著录:序号、著作者、书名、出版地、出版社、出版日期。

例1(著作):1.宋尚桂.大学通识教育的理论和模式.青岛:中国海洋大学出版社,2007年9月

例2(文章):2.朱晓刚.以人为本----美国大学通识教育理念和实践的解读.民办教育研究,2005(5)

设计报告装订顺序

(一)课程设计封面

(二)课程设计任务书

(三)摘要

(四)目录

例:

1、绪论ˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉ

11.1课题背景ˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉ1

1.2交会对接技术发展概况ˉˉˉˉˉˉˉˉˉˉˉˉˉ

31.2.1俄罗斯空间交会对接发展概况ˉˉˉˉˉˉˉˉˉ

51.2.2美国空间交会对接发展概况ˉˉˉˉˉˉˉˉˉˉ72、空间飞行器ˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉ20

2.1引言ˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉ20

2.2空间飞行器姿态表示ˉˉˉˉˉˉˉˉˉˉˉˉˉˉ23 结论ˉˉˉˉˉˉˉˉˉˉˉˉ ˉˉˉˉˉˉˉˉˉˉ50 主要参考文献ˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉ

51(五)正文

(六)参考文献

(七)附录

(八)有关图纸

撰写设计报告的几点要求

1、文字

设计中汉字应采用《简化汉字总表》规定的简化字,并严格执行汉字的规范,所有文字字面清晰,不得涂改。

第一层次(章)题序和标题居中放置,其余各层次(节、条、款)题序和标题一律沿版面左侧边线顶格排列。第一层次(章)题序和标题距下文双倍行距。段落开始后缩两个字。行与行之间,段落和层次标题以及各段落之间均为单倍行距。

第一层次(章)题序和标题用小二号黑体字。题序和标题之间空两个字,不加标点,下同。

第二层次(节)题序和标题用小三号黑体字。

第三层次(条)题序和标题用四号黑体字。

第四层次及以下层次题序及标题一律用小四号黑体字。

结论(结束语)作为单独一章排列,但标题前不加‚第XXX‛字样。结论是整个设计的总结,应以简练的文字说明所做的工作。

2、表格

设计中的表格可以统一编序,也可以逐章单独编序,方式应与插图及公式的编序方式统一。表序必须连续,不得重复或跳跃。表格的结构应简洁,各栏都应标注量和相应的单位。表格内数字须上下对齐,相邻栏内的数值相同时,不能用‘同上’、‘同左’和其它类似用词,应一一重新标注。表序和表题置于表格上方中间位置,无表题的表序置于表格的左上方或右上方(同一篇论文位置应一致)。

3、插图

插图要精选,图序可以连续编序,也可以逐章单独编序,方式应与表格、公式的编序方式统一,图序必须连续,不得重复或跳跃。仅有一图时,在图题前加‘附图’字样。设计中的插图以及图中文字符号应打印,无法打印时一律用钢笔绘制和标出。由若干个分图组成的插图,分图用a,b,c,……标出。图序和图题置于图下方中间位置。

4、公式

设计中重要的或者后文中须重新提及的公式应注序号并加圆括号,序号一律用阿拉伯数字连续编序或逐章编序,序号排在版面右侧,且距右边距相等。公式与序号之间不加虚线。

5、数字用法

公历世纪、年代、年、月、日、时间和各种计数、计量,均用阿拉伯数字。年份不能简写(如1999年不能写成99年)。数值的有效数字应全部写出,如:0.50∶20.0不能写作0.5∶20。

6、软件

软件流程图和原程序清单要按软件文档格式附在报告后面,特殊情况可在答辩时展示,不附在报告内。

7、计量单位的定义和使用方法按国家计量标准执行。

下载单片机计算器课程设计报告word格式文档
下载单片机计算器课程设计报告.doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    单片机课程设计报告

    《单片机原理与接口技术》 课程设计报告 设计题目: 基于80C51单片机系统实验板的制作 与程序设计专业:应用电子专业班级: 11应电班姓名: 丁文俊指导教师: 余静老师2013 年 5 月2......

    单片机课程设计报告

    课程设计报告 题 目: 自动滴灌系统设计 课程名称: 单片机原理及应用 学 院: 信息工程学院专 业: 计算机科学与技术 班 级: 2014 级计本 1 班学生姓名: *** 学 号: 201403031......

    单片机课程设计报告

    单片机课程设计报告题目:小直流电机调速实验教学单位: 机 电 工 程 系专业: 机械设计制造及其自动化班级: 0803班学号: 0811050342姓名: 程怀虎2011 年 11月(以下内容用宋体,五号,单......

    单片机课程设计报告(范文)

    片 机 课 程 设 计 报学号、姓名:年级、专业:培养层次:课程名称:授课学时学分:考试成绩:授课或主讲教师签字:单 告1 单片机最小系统功能说明单片机的最小系统是由组成单片机系统必......

    单片机课程设计报告

    单片机课程设计报告 课程名称:单片机原理及接口课程设计 题目:基于 学院:电气信息学院 专业班级:测控技术与仪器 姓名:江让 学号: 指导老师:刘升老师  时间: C51单片机的ADC0809数模......

    单片机课程设计报告

    DS18B20测温及按键控制 课 程 设 计 课程名称 单片机基础课程设计 题目名称 18B20测温及按键控制 学生学院 **** 专业班级 **** 班号 **** 学生组员 ****** 指导教师 *****......

    java课程设计报告—计算器

    1 --计算器 Java实习报告目录一、课程设计目的 ................................................................................................................. 2......

    Matlab课程设计报告(简单计算器)

    1、设计目的 运用MATLAB实现MATLAB的GUI程序设计。 2、题目分析 2.1课程设计的基本要求: A. 熟悉和掌握MATLAB 程序设计方法。 B. 掌握MATLAB GUI程序设计。 2.2课程设计的内......