计算器程序设计报告.docx

上传人:b****7 文档编号:9731999 上传时间:2023-02-06 格式:DOCX 页数:20 大小:132.94KB
下载 相关 举报
计算器程序设计报告.docx_第1页
第1页 / 共20页
计算器程序设计报告.docx_第2页
第2页 / 共20页
计算器程序设计报告.docx_第3页
第3页 / 共20页
计算器程序设计报告.docx_第4页
第4页 / 共20页
计算器程序设计报告.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

计算器程序设计报告.docx

《计算器程序设计报告.docx》由会员分享,可在线阅读,更多相关《计算器程序设计报告.docx(20页珍藏版)》请在冰豆网上搜索。

计算器程序设计报告.docx

计算器程序设计报告

运城学院

单片机课程设计报告

 

课题名称计算器设计

单位运城学院

所在院(系)计算机科学与技术系

班级0902班

指导教师赵润林

学生姓名裴立军贺琛王宇寒

 

2012年12月14日

 

目录

 

1.课程设计的目的………………………………………………3

2.课程设计题目描述和要求……………………………………3

8.硬件设计………………………………………………………10

9.软件设计………………………………………………………11

10.程序代码……………………………………………………12

11.设计总结……………………………………………………18

12.参考文献……………………………………………………20

 

人员分工:

序号姓名主要工作

1裴立军总体设计

2贺琛硬件设计

3王宇寒软件设计

 

1.课程设计目的

(1)进一步熟悉和掌握单片机的结构及工作原理。

(2)掌握单片机的接口技术及相关外围芯片的外特性,控制方法。

(3)通过课程设计,掌握以单片机核心的电路设计的基本方法和技术,了解相关电路参数的计算方法。

(4)通过实际程序设计和调试,逐步掌握模块化程序设计方法和调试技术。

(5)通过完成一个包括电路设计和程序开发的完整过程,使学生了解单片机应用系统开发及的全过程,为今后从事相应的工作打下良好的基础。

2.课程设计题目描述和要求

2.1设计题目要求

用单片机完成四位正整数的加减乘除运算,通过键盘输入使数值与结果在七段共阴极数码管上显示,并设有清零键可随时完成计算与显示的清零。

2.2原理图设计要求

(1)原理图设计要严格符合作图规范(布局、连线要正确,连线端子要有标号等)。

(2)图中所使用的各元器件要按标准正确标明序号及数值(如,电阻:

R1,100k;电容C1,30PF)。

(3)原理图要完整(电源,单片机,外围器件,扩器接口,输入/输出装置等要一应俱全)。

2.3程序设计要求

(1)根据设计要求,将总体功能分解成若干个子功能模块,每个功能模块完成一个特定的功能。

(2)根据总体要求详细分解各功能模块,并确定各功能模块之间的关系,设计出完整的程序流程图(按流程图设计标准完成设计)。

2.4程序调试要求

(1)利用C语言编写程序(按C语言书写标准完成程序设计)。

(2)通过keil调试(按步骤一步一步完成程序调试、包括断点设置、内存及代码分析等)。

(3)通过PROTEUS软件完成理论性仿真。

(4)通过实验板检验及调试。

(5)程序调试将设计完的程序输入,汇编,排除语法错误,生成HEX文件(执行、检查、修改程序,直到达到要求为止)。

8.硬件设计

8.1系统基本方案

根据题目要求,系统可以划分为显示模块、键盘模块、处理程序三个模块。

其中显示模块实现将CUNZHI中的值进行动态数码显示,包括:

P0口送显示码,P2口为公共端扫描;键盘模块进行键盘扫描;处理程序模块实现计算器加减乘除运算。

8.2方案论证与比较

方案一

将显示处理程序置于定时中断程序中实现其功能,主程序为键盘扫描程序。

方案二

主程序为显示处理程序键盘扫描程序。

取消定时中断的使用。

方案比较

方案一效率低,单片机的反应无法进行运行,方案二虽为能解决按键长按无显示的缺点,但其运算速度快,所以我们最终选择了方案二。

8.3主要电路分析

1、主要元器件选择

AT89S52单片机

AT89S52单片机是16位微机,8KB的FLASH存储器,256个字节的内部RAM,32个可编程的I/O端口,3个16位定时器/计数器,8个中断源,一个串行口,内置看门狗。

外部结构分复位部分、电源、晶振部分。

七段数码管

七段数码管采用共阴极接法,使用时,公共阴极接地,在阳极端输入高电平,发光二极管就导通发光。

七段数码管中每个LED导通电压在1.5V左右,工作电流每段约为10mA。

按键

按键采用无互锁常开按键。

8.4硬件设计原理

通过键盘输入数字和运算符,利用单片机不断扫描键盘。

图1计算器原理图

8.5硬件设计说明

1、操作显示设备

显示设备采用八片七段共阴极LED显示器,共设置16个键,其中数字键0~9共十个,接下来依次是加号键(+)、减号键(-)、乘号键(*)、除号键(/)、等于号(=)、清除键。

操作设备是四行四列共16键的简单键盘。

第一行从左至右分别为F(清除键)、E(等号键)、D(除号键)、C(乘号键),第二行从左至右分别为B(减号键)、A(加号键)、9、8,第三行分别为7、6、5、4,第四行从左至右分别为3、2、1、0,“清除键”表示程序初始化,为下次输入准备。

2、程序实现功能。

(1)十进制加减乘除法计算:

输入范围为(1~999),该程序输入两个定点数;A为加,B为减,C为乘,D为除,E等于,输出计算结果。

数据输入采用规范化输入,即输入〈=3个数才算完成一个运算数的输入,两个运算数之间输入运算符A、B、C或者D,输入完成按E显示计算结果;

(2)计算机复位功能:

F为清零重启,任何时候按下F将重新开始

3、计算器设计的PCB板

图2计算器设计的PCB板

9.软件设计

9.1软件设计原理

通过程序不断的扫描键盘并进行显示,当为数字键时用数码管显示,再进行输入当为功能键(+、-、*、/),再输入下一数字按下等于键显示前两个数字的运算结果。

9.2软件设计流程图

图3计算器的程序流程图

10.程序代码

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

程序名称:

计算器设计

功能:

完成0~9999整数的一次加减乘除运算,

减法运算结果可以实现计算结果的负数显示,

除法运算结果为0~999并保留两位小数,

按键有”嘀”音,

设有清零键,

首位零不显示,

其它的显示"E"

设计人:

裴立军,贺琛,王宇寒

创建时间:

2007.12.11

修改时间:

2007.12.14

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

#include

UnsignedcharcodeXIANSHI[]={0x3f,0x06,0x5b,0x4f,0x66,

0x6d,0x7d,0x07,0x7f,0x6f,

0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x40};

UnsignedcharcodeXIANSHIXIAOSHUDIAN[]={0xbf,0x86,0xdb,0xcf,0xe6,

0xed,0xfd,0x87,0xff,0xef,

0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x40};

UnsignedcharcodeXIANSHIWRONG[]={0x00,0x00,0x00,0x00,0x79};//错误时的显示//

UnsignedcharcodeSAOMIAO[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//共阴极扫描码表格//

UnsignedcharDANYUAN[8]={0,0,0,0,0,0,0,0};

UnsignedlongCUNZHI;

UnsignedlongSHU[2]={0,0};

Unsignedchark,key,m,n;

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

SIGN存运算符(+、-、*、/)

FLAG用第几个数组,(出现非运算符前为0,出现运算符后为1)

WRONG输入多于4个时错误标志位(0对、1错)

COUNT输入0~9数字的个数

SIZE减数大于被凑数时为1

SIGNCOUNT输入运算符的个数

XIAOSHU存一位小数的值

DIVKEY运算除法时置为1

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

UnsignedcharSIGN,FLAG,WRONG,COUNT,SIZE,SIGNCOUNT,XIAOSHU[2],DIVKEY;

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

程序名称:

显示程序

入口参数:

功能:

实现将CUNZHI中的值进行动态数码显示

局部变量:

i,j,q

全局变量:

CUNZHI,DANYUAN[0],DANYUAN[1],DANYUAN[2],DANYUAN[3]

所用端口功能:

P0口送显示码

P2口公共端扫描

返回值:

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

voiddisp(void)

{unsignedchari,j,p,q;

/**************错误时的显示*************/

if(WRONG==1)

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

{P0=XIANSHIWRONG[i];

P2=SAOMIAO[i];

for(j=6;j>0;j--)//动态显示延时程序//

for(q=248;q>0;q--);

}

}

else

{if(DIVKEY==1)

{DANYUAN[0]=XIAOSHU[1];

DANYUAN[1]=XIAOSHU[0];

DANYUAN[2]=CUNZHI%10;

DANYUAN[3]=CUNZHI/10%10;

DANYUAN[4]=CUNZHI/100%10;

DANYUAN[5]=CUNZHI/1000%10;

for(p=5;p>2;p--)

{if(DANYUAN[p]==0)DANYUAN[p]=16;

elsebreak;

}

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

{if(i==2)//倒数第三位为小数位//

{P0=XIANSHIXIAOSHUDIAN[DANYUAN[i]];

}

else

{P0=XIANSHI[DANYUAN[i]];}

P2=SAOMIAO[i];

for(j=6;j>0;j--)//动态显示延时程序//

for(q=248;q>0;q--);

}

}

else

{DANYUAN[0]=CUNZHI%10;

DANYUAN[1]=CUNZHI/10%10;

DANYUAN[2]=CUNZHI/100%10;DANYUAN[3]=CUNZHI/1000%10;

/*******************首位为零不显示*************/

for(p=3;p>0;p--)//首位为零不显示//

{if(DANYUAN[p]==0)

DANYUAN[p]=16;

elsebreak;

}

/**************为负数时的显示*****************/

if(SIZE==1)//为负数第五位数码管显示"-"//

DANYUAN[4]=17;

else//第五位数码管不显示//

DANYUAN[4]=16;

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

{P0=XIANSHI[DANYUAN[i]];

P2=SAOMIAO[i];

for(j=6;j>0;j--)//动态显示延时程序//

for(q=248;q>0;q--);

}

}

}

}

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

程序名称:

处理程序

入口参数:

key

功能:

实现加减乘除运算

全局变量:

key、CUNZHI、SHU[0]、SHU[1]、FLAG、SIGN

返回值:

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

voidCHULI(key)

{unsignedchari,j;

/*****************声音“嘀”*****************/

TR0=1;

for(i=200;i>0;i--)//延时100ms//

for(j=248;j>0;j--);

TR0=0;

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

if(key==15)//按键为清除键//

{CUNZHI=0;

SHU[0]=0;

SHU[1]=0;

COUNT=0;

WRONG=0;

SIZE=0;

SIGNCOUNT=0;

XIAOSHU[0]=0;

XIAOSHU[1]=0;

DIVKEY=0;

}

elseif((key>=0)&&(key<=9))//按键为数字键//

{COUNT++;//按下的数字键的次数//

/*****************加权运算*****************/

SHU[FLAG]=SHU[FLAG]*10+key;//加权运算//

CUNZHI=SHU[FLAG];

}

elseif((key>=10)&&(key<=13))//按键为运算键//

{SIGNCOUNT++;SIGN=key;FLAG++;

COUNT=0;

}elseif(key==14)//按键为等于键//{switch(SIGN)

{case10:

CUNZHI=SHU[0]+SHU[1];

break;

case11:

{if(SHU[0]>SHU[1])

{CUNZHI=SHU[0]-SHU[1];

}else

{SIZE=1;CUNZHI=SHU[1]-SHU[0];}

}

Break;

case12:

CUNZHI=SHU[0]*SHU[1];break;

case13:

DIVKEY=1;CUNZHI=SHU[0]*100/SHU[1];XIAOSHU[1]=CUNZHI%10;XIAOSHU[0]=CUNZHI/10%10;CUNZHI/=100;if(CUNZHI>999)

{WRONG=1;

}break;}

}

if((COUNT==5)||(SIGNCOUNT>1)||(CUNZHI>9999))//输入数字键大于5时将WRONG置1//

{WRONG=1;

}

}

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

程序名称:

键盘扫描

入口参数:

功能:

进行键盘扫描

全局变量:

k

局部变量:

i,j

调用函数:

CHULI(key)

返回值:

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

voidJIANPAN(void)

{unsignedchari,j;

P3=0xff;

P3_4=0;//扫描P3.4这条线上的四个按键//

k=P3;

k=k&0x0f;

if(k!

=0x0f)//看P3.4这条线上是否真的有按键按下//

{for(i=20;i>0;i--)//延时一段时间//

for(j=248;j>0;j--);

k=P3;//再判断一次//

k=k&0x0f;

if(k!

=0x0f)

switch(k)//通过可能发生的四种可能比较看是哪个按键按下//{case0x0e:

key=0;break;case0x0d:

key=4;break;case0x0b:

key=8;break;case0x07:

key=12;break;

}

k=P3;k=k&0x0f;while(k!

=0x0f){k=P3;

k=k&0x0f;}CHULI(key);

}

}

P3=0xff;

P3_5=0;//扫描P3.5这条线上的四个按键//

k=P3;

k=k&0x0f;

if(k!

=0x0f)//看P3.5这条线上是否有按键按下//

{for(i=20;i>0;i--)//延时等待//

for(j=248;j>0;j--);

k=P3;//再看一次//

k=k&0x0f;

if(k!

=0x0f)

{switch(k)//通过比较看是P3.5这条线上的哪一个按键按下//{case0x0e:

key=1;

break;

case0x0d:

key=5;

break;

case0x0b:

key=9;

break;

case0x07:

key=13;

break;

}

k=P3;

k=k&0x0f;

while(k!

=0x0f){k=P3;

k=k&0x0f;}CHULI(key);}

}P3=0xff;//扫描P3.6这条线上的四个按键是否按下//P3_6=0;k=P3;k=k&0x0f;if(k!

=0x0f){for(i=20;i>0;i--)

for(j=248;j>0;j--);

k=P3;

k=k&0x0f;

if(k!

=0x0f){switch(k)

{case0x0e:

key=2;break;case0x0d:

key=6;break;case0x0b:

key=10;break;case0x07:

key=14;break;}k=P3;k=k&0x0f;while(k!

=0x0f){k=P3;k=k&0x0f;}CHULI(key);}

}P3=0xff;//扫描P3.7这条线上的四个按键是否按下//

P3_7=0;k=P3;k=k&0x0f;if(k!

=0x0f){for(i=20;i>0;i--)

for(j=248;j>0;j--);

k=P3;

k=k&0x0f;

if(k!

=0x0f)

{switch(k)

{case0x0e:

key=3;break;case0x0d:

key=7;break;case0x0b:

key=11;break;case0x07:

key=15;break;}k=P3;k=k&0x0f;while(k!

=0x0f){k=P3;

k=k&0x0f;}CHULI(key);}

}

}

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

程序名称:

主程序

功能:

实现计算器加减乘除运算并显示

全局变量:

CUNZHI、FLAG、SIGN

调用函数:

disp()、JIANPAN()

返回值:

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

voidmain(void)

{TMOD=0X02;

ET0=1;

EA=1;

TR0=0;

TH0=(256-200)%256;

TL0=(256-200)/256;

CUNZHI=0;

FLAG=0;

SIGN=0;

WRONG=0;

SIZE=0;

XIAOSHU[0]=0;

while

(1)

{disp();

JIANPAN();

}

}

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

定时中断

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

voidt0(void)interrupt1using1

{P1_0=~P1_0;

}

11.设计总结

通过本次单片机原理及应用课程设计我们充分认认到了课程设计的重要性和必要性,本次设计使们对已学过的基础知识有了更深入的理解,独立思考、独立工作以及应用所学基本理化分析和解决实际问题的能力有了很大的提高。

另外,本次设计使我们的实际操作技能得到了训练,同时也培养了我们严谨的科学作风。

11.1实验方法及手段

11.1.1实验方法

(1)利用C语言编写程序

(2)通过keil调试

(3)通过PROTEUS软件仿真

(4)通过实验板实验及调试

11.1.2实验手段及环境

(1)计算机一套

(2)单片机实验板一套

(3)keil调试软件及PROTEUS仿真软件各一套

11.2焊接常识及其注意事项

新烙铁使用前,应用细砂纸将烙铁头打光亮,通电烧热,蘸上松香后用烙铁头刃面接触焊锡丝,使烙铁头上均匀地镀上一层锡。

这样做,可以便于焊接和防止烙铁头表面氧化。

旧的烙铁头如严重氧化而发黑,可用钢挫挫去表层氧化物,使其露出金属光泽后,重新镀锡,才能使用。

  电烙铁要用220V交流电源,使用时要特别注意安全。

应认真做到以下几点:

  

(1)电烙铁插头最好使用三极插头。

要使外壳妥善接地。

  

(2)使用前,应认真检查电源插头、电源线有无损坏。

并检查烙铁头是否松动。

  (3)电烙铁使用中,不能用力敲击。

要防止跌落。

烙铁头上焊锡过多时,可用布擦掉。

不可乱甩,以防烫伤他人。

  (4)焊接过程中,烙铁不能到处乱放。

不焊时,应放在烙铁架上。

注意电源线不可搭在烙铁头上,以防烫坏绝缘层而发生事故。

  (5)使用结束后,应及时切断电源,拔下电源插头。

冷却后,再将电烙铁收回工具箱。

焊接电路板时,一定要控制好时胡间太长,电路板将被烧焦,或造成铜箔脱落。

从电路板上拆卸元件时,可将电烙铁头贴在焊点上,待焊点上的锡熔化后,将元件拔出。

焊接时,要保证每个焊点焊接牢固、接触良好。

要保证焊接质量。

 

12.参考文献

(1)老虎工作室.电路设计与制版:

PROTEL99高级应用.北京:

人民邮电出版社,2001

(2)胡汉才.单片机原理及其接口技术.北京:

清华大学出版社,1996

(3)张筑生.微分半动力系统的不变集[D].北京:

北京大学数学系数学研究所,1983.

(4)冯西桥.核反应堆压力管道与压力容器的LBB分析[R].北京:

核能技术设计研究院,1997.

(5)KeilSoftware-MacroAssemblerandUtiliti

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

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1