单片机简易计算器毕业课程设计报告.docx

上传人:b****0 文档编号:9465711 上传时间:2023-05-19 格式:DOCX 页数:27 大小:313.68KB
下载 相关 举报
单片机简易计算器毕业课程设计报告.docx_第1页
第1页 / 共27页
单片机简易计算器毕业课程设计报告.docx_第2页
第2页 / 共27页
单片机简易计算器毕业课程设计报告.docx_第3页
第3页 / 共27页
单片机简易计算器毕业课程设计报告.docx_第4页
第4页 / 共27页
单片机简易计算器毕业课程设计报告.docx_第5页
第5页 / 共27页
单片机简易计算器毕业课程设计报告.docx_第6页
第6页 / 共27页
单片机简易计算器毕业课程设计报告.docx_第7页
第7页 / 共27页
单片机简易计算器毕业课程设计报告.docx_第8页
第8页 / 共27页
单片机简易计算器毕业课程设计报告.docx_第9页
第9页 / 共27页
单片机简易计算器毕业课程设计报告.docx_第10页
第10页 / 共27页
单片机简易计算器毕业课程设计报告.docx_第11页
第11页 / 共27页
单片机简易计算器毕业课程设计报告.docx_第12页
第12页 / 共27页
单片机简易计算器毕业课程设计报告.docx_第13页
第13页 / 共27页
单片机简易计算器毕业课程设计报告.docx_第14页
第14页 / 共27页
单片机简易计算器毕业课程设计报告.docx_第15页
第15页 / 共27页
单片机简易计算器毕业课程设计报告.docx_第16页
第16页 / 共27页
单片机简易计算器毕业课程设计报告.docx_第17页
第17页 / 共27页
单片机简易计算器毕业课程设计报告.docx_第18页
第18页 / 共27页
单片机简易计算器毕业课程设计报告.docx_第19页
第19页 / 共27页
单片机简易计算器毕业课程设计报告.docx_第20页
第20页 / 共27页
亲,该文档总共27页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

单片机简易计算器毕业课程设计报告.docx

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

单片机简易计算器毕业课程设计报告.docx

单片机简易计算器毕业课程设计报告

(此文档为word格式,下载后您可任意编辑修改!

中南林业科技大学

课程设计报告

设计名称:

单片机计算器课程设计

姓名:

汪琦学号:

专业班级:

电子信息工程一班

院(系):

计算机与信息工程学院

设计时间:

2010年12月28日星期二

设计地点:

中南林业科技大学电子信息楼

指导教师评语:

成绩:

签名:

年月日

目录

一、题目……………………………………………………………………………

二、任务与要求(老师完成)…………………………………………………

三、课程设计摘要及整体方框图…………………………………………………

1..总体设计思路简述····················································

2.硬件设计简述························································

3.软件设计简述························································

4.程序主流程图························································

四、课程设计原理分析及相关知识概述…………………………………………

五、结论……………………………………………………………………………

六、体会与收获……………………………………………………………………

附件:

1、源程序代码(根据需要选择)……………………………………………

2、整体电路原理图(根据需要选择)………………………………………

2、元件表(根据需要选择)…………………………………………………

3、PCB板制作(根据需要选择)……………………………………………

4、焊接与调试(根据需要选择)…………………………………………………

一、题目

利用单片机芯片STC12C54、四位八段共阴数码管,已制作好的电路板等器件设计制作一个计算器,用LED显示计算数值及结果。

二、任务与要求

要求计算器能实现加减乘除四种运算,具体如下:

1.加法:

四位整数加法,计算结果若超过四位则显示计算错误

2.减法:

四位整数减法,计算结果若小于零则显示计算错误

3.乘法:

多位整数乘法,计算结果若超过四位则显示计算错误

4.除法:

整数除法

5.有清除功能

三、课程设计简述及整体方框图

1.总体设计思路简述

按照系统设计的功能的要求,初步确定设计系统由主控模块、显示模块、键扫描接口电路共三个模块组成,电路系统构成框图如图1.1所示。

主控芯片使用STC12C54单片机,比80C51速度更快,功能更强,由先进工艺制造,并带有非易失性Flash程序存储器。

它是一种高性能、低功耗的8位COMS微处理芯片,市场应用最多。

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

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

2.硬件设计简述

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

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

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

采用按键复位电路,电阻分别选取560Ω和10K,电容选取10μF。

键盘接口电路

计算器所需按键有:

数字键:

’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’,’0’

功能键:

’+’,’-‘,’*’,’’,’=’,’C(清零)’

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

数码管显示电路

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

为了实现数码管的动态显示,P2口输出显示值,通过P2口的二进制代码送到数码管进行显示。

P3.2~P3.5用来作为位选端,控制哪几位数码管进行显示。

比如当P3.2为高电平时,其他位全给0,具体的在软件中会有说明。

此时就将扫描的数据送给指定数码管显示。

3.软件设计简述

键盘扫描子程序设计

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

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

原理就是先确定按键在哪一行,接着再确定是哪一列,这样就可以知道是哪个按键被按下了。

我是将P1口作为按键扫描口的,比如开始先给P1口设置为0xf0,即P1.0~P1.7为,将它定义为e,再给P1口设置为0x0f,即P1.0~P1.7为,将它定义为f,并且定义temp=e|f,好了,接下来若按下的是按键sw1,则P1口变为,e就是0xe0,并在非常短的时间内P1口变为,则f就是0x0e,那么temp就为0xee,同理,每个按键都会有一个对应的十六进制值,我把它们列出来进行一一对应就行了,下面是扫描按键图。

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

uintkescan()

{

uintcom;

P1=0xf0;

e=P1;

P1=0x0f;

f=P1;

temp=e|f;

while(P1!

=0x0f);

if(temp==0xb7)com=0;

if(temp==0x7e)com=1;

if(temp==0xbe)com=2;

if(temp==0xde)com=3;

if(temp==0x7d)com=4;

if(temp==0xbd)com=5;

if(temp==0xdd)com=6;

if(temp==0x7b)com=7;

if(temp==0xbb)com=8;

if(temp==0xdb)com=9;

if(temp==0x77)com=10;

if(temp==0xd7)com=11;

if(temp==0xe7)com=12;

if(temp==0xeb)com=13;

if(temp==0xed)com=14;

if(temp==0xee)com=15;

return(com);

}

数码管显示电路

采用4位数码管对计算数据和结果的显示,这里选取共阴极数码管,利用NPN三极管对数码管进行驱动,利用来实现数码管的动态显示,P2口输出显示值,P2口为段选,P3.2~P3.5用来作为位选端,控制哪几位数码管进行显示。

下面根据程序来阐述。

n是一个运算中产生的值,若它大于10000,执行第一个if语句,如果则显示FFFF,若在10000以内,则将n分别除以1000、100、10和对10取余,得到我们想要的四个数,送显示子程序显示。

其余减、乘、除的计算方法与加法的计算方法一样,这里不再累述。

voiddis(uintn)

{

if(n10000)

{

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

{if(fu==1)

P2=~(DSY_CODE[15]&&0x7f);

if(fu==0)

P2=~DSY_CODE[15];

P3=bit[3-i];

n=n10;

delay(4);

P3=0x00;

}

}

elseif(n1000)

{

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

{if(fu==1)

P2=~(DSY_CODE[n%10]&0x7f);

if(fu==0)

P2=~DSY_CODE[n%10];

P3=bit[3-i];

n=n10;

delay(4);

P3=0x00;

}

}

elseif(n100)

{

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

{if(fu==1)

P2=~(DSY_CODE[n%10]&0x7f);

if(fu==0)

P2=~DSY_CODE[n%10];

P3=bit[3-i];

n=n10;

delay(4);

P3=0x00;

}

}

elseif(n10)

{

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

{if(fu==1)

P2=~(DSY_CODE[n%10]&0x7f);

if(fu==0)

P2=~DSY_CODE[n%10];

P3=bit[3-i];

n=n10;

delay(4);

P3=0x00;

}

}

elseif(n%10)

{if(fu==1)

P2=~(DSY_CODE[n]&0x7f);

if(fu==0)

P2=~DSY_CODE[n];

P3=0x20;

delay(4);

}

运算子程序设计

显示加减乘除四个运算符

voidcalculate(uintz)

{if(z==10)

{

P2=0x76;加法显示’H’,并且点亮最高位的数码管

P3=0x20;

}

if(z==11)

{

P2=0x40;减法显示‘-’,并且点亮最高位的数码管

P3=0x20;

}

if(z==12)

{

P2=0x80;乘法显示‘.’,并且点亮最高位的数码管

P3=0x20;

}

if(z==13)

{

P2=0x49;除法显示‘’并且点亮最高位的数

P3=0x20;码管

}

}

除法子程序设计

除法的运算,可以显示小数点

voiddiv(void)

{

d=bc;

if(d1000)

{

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

{

P2=~DSY_CODE[d%10];

P3=bit[3-i];

d=d10;

delay(4);

P3=0x00;

}

}

elseif(d100)

{d=10*bc;

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

{if(i==1)

P2=~(DSY_CODE[d%10]&0x7f);

if(i!

=1)

P2=~DSY_CODE[d%10];

P3=bit[3-i];

d=d10;

delay(4);

P3=0x00;

}

}

elseif(d10)

{d=100*bc;

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

{if(i==2)

P2=~(DSY_CODE[d%10]&0x7f);

if(i!

=2)

P2=~DSY_CODE[d%10];

P3=bit[3-i];

d=d10;

delay(4);

P3=0x00;

}

}

elseif(d%10)

{d=1000*bc;

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

{

if(i==3)

P2=~(DSY_CODE[d%10]&0x7f);

if(i!

=3)

P2=~DSY_CODE[d%10];

P3=bit[3-i];

d=d10;

delay(4);

P3=0x00;

}

}

else

{

d=(1000*b)c;

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

{if(i==3)

P2=~(DSY_CODE[0]&0x7f);

if(i!

=3)

P2=~DSY_CODE[d%10];

P3=bit[3-i];

d=d10;

delay(4);

P3=0x00;

}

}

}

主程序见附录1

4.程序主框图

主程序流程

四、课程设计原理分析及相关知识概述

本次课程设计用的STC12C54具有速度快、功耗低、抗干扰强的特点,有多种IO端口模式,它默认为准双向口弱上拉,最大灌电流为20mA,拉电流为230uA,所以在三极管和芯片管脚间要接15k的电阻,(5v-1.8v)300欧=10mA,八个led就为80mA,超过50mA的总电流,所以电阻选用511欧。

若改为强推挽输出模式,则根据拉电流最大为20mA可计算出,电阻选为1k

五、结论

完成硬件和软件的设计和制作后,进行系统的调试,并处理不断出现的问题。

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

加法运算:

四位整数加法运算,和值不超过9999,若超过上限,则显示错误提示FFFF。

减法运算:

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

乘法运算:

积不超过9999的整数乘法运算,若超出上限,显示错误提示FFFF。

除法运算:

整数除法,既计算结果为可显示小数。

六、体会与收获

通过这次课程设计,最大的一点体会是单片机学的不够扎实,不会的很多啊,当然这次的课程设计做计算器程序用的是c语言,不是课上初学的汇编,所以很难适应,尽管大家都知道汇编编这个程序也很困难,但还是互相学习,到处找资料看,问同学,所以我的软件主程序才能编译成功,系统才能调试出结果。

很感谢那些热心教导我的同学和指导我的老师。

首先在硬件电路的制作中,也就是焊板子,由于我的粗心,我芯片插槽的一个管脚没焊进去,别的都好了,就这个脚没有用了,后来在老师的帮助下,我将插槽里德那个管脚拔出来,换了个脚在插进去,然后用万用表测试后证明是有效的,心里还是很高兴的。

整个硬件电路还是做得令自己比较满意的。

在软件方面,感觉困难更多一些,一开始真的很着急,毫无头绪啊,一时间,XX,论坛,贴吧逛了个遍,找了很多资料,也参考了同学的程序,其中每一个子程序模块都认真去读,去分析,化为己用,最重要的按键扫描和显示程序,还有包括加减乘除的运算程序,还了解了c语言在单片机编程中的一些特点,包括函数的声明和调用等等。

而且在用uvison编译的时候出了很多问题,其中一个就是关于头文件的,要加上“#include”,不仅如此,还要将有关STC12C5410AD的文件覆盖在uvison安装路径下,这样头文件才有效啊,所以,一开始找不出问题所在,极其郁闷。

但是总的来说,软件设计能够把结果调出来还是很激动的,尽管还有很多未知的问题没有出现。

附录1程序源代码

#include

#include

{

uintcom;

P1=0xf0;

e=P1;

P1=0x0f;

f=P1;

temp=e|f;

while(P1!

=0x0f);

if(temp==0xb7)com=0;

if(temp==0x7e)com=1;

if(temp==0xbe)com=2;

if(temp==0xde)com=3;

if(temp==0x7d)com=4;

if(temp==0xbd)com=5;

if(temp==0xdd)com=6;

if(temp==0x7b)com=7;

if(temp==0xbb)com=8;

if(temp==0xdb)com=9;

if(temp==0x77)com=10;

if(temp==0xd7)com=11;

if(temp==0xe7)com=12;

if(temp==0xeb)com=13;

if(temp==0xed)com=14;

if(temp==0xee)com=15;

return(com);

}

voiddis(uintn)

{

if(n10000)

{

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

{if(fu==1)

P2=~(DSY_CODE[15]&&0x7f);

if(fu==0)

P2=~DSY_CODE[15];

P3=bit[3-i];

n=n10;

delay(4);

P3=0x00;

}

}

elseif(n1000)

{

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

{if(fu==1)

P2=~(DSY_CODE[n%10]&0x7f);

if(fu==0)

P2=~DSY_CODE[n%10];

P3=bit[3-i];

n=n10;

delay(4);

P3=0x00;

}

}

elseif(n100)

{

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

{if(fu==1)

P2=~(DSY_CODE[n%10]&0x7f);

if(fu==0)

P2=~DSY_CODE[n%10];

P3=bit[3-i];

n=n10;

delay(4);

P3=0x00;

}

}

elseif(n10)

{

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

{if(fu==1)

P2=~(DSY_CODE[n%10]&0x7f);

if(fu==0)

P2=~DSY_CODE[n%10];

P3=bit[3-i];

n=n10;

delay(4);

P3=0x00;

}

}

elseif(n%10)

{if(fu==1)

P2=~(DSY_CODE[n]&0x7f);

if(fu==0)

P2=~DSY_CODE[n];

P3=0x20;

delay(4);

}

}

voidcaculate(uintz)

{if(z==10)

{

P2=0x76;

P3=0x20;

}

if(z==11)

{

P2=0x40;

P3=0x20;

}

if(z==12)

{

P2=0x80;

P3=0x20;

}

if(z==13)

{

P2=0x49;

P3=0x20;

}

}

voiddiv(void)

{

d=bc;

if(d1000)

{

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

{

P2=~DSY_CODE[d%10];

P3=bit[3-i];

d=d10;

delay(4);

P3=0x00;

}

}

elseif(d100)

{d=10*bc;

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

{if(i==1)

P2=~(DSY_CODE[d%10]&0x7f);

if(i!

=1)

P2=~DSY_CODE[d%10];

P3=bit[3-i];

d=d10;

delay(4);

P3=0x00;

}

}

elseif(d10)

{d=100*bc;

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

{if(i==2)

P2=~(DSY_CODE[d%10]&0x7f);

if(i!

=2)

P2=~DSY_CODE[d%10];

P3=bit[3-i];

d=d10;

delay(4);

P3=0x00;

}

}

elseif(d%10)

{d=1000*bc;

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

{

if(i==3)

P2=~(DSY_CODE[d%10]&0x7f);

if(i!

=3)

P2=~DSY_CODE[d%10];

P3=bit[3-i];

d=d10;

delay(4);

P3=0x00;

}

}

else

{

d=(1000*b)c;

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

{if(i==3)

P2=~(DSY_CODE[0]&0x7f);

if(i!

=3)

P2=~DSY_CODE[d%10];

P3=bit[3-i];

d=d10;

delay(4);

P3=0x00;

}

}

}

voidmain()

{

P3M1=0xff;

P2M1=0xff;

P2M0=0x00;

P3M0=0x00;

P1M0=0x00;

P1M1=0x00;

flag=0;cru=0;bru=0;dyh=0;

while

(1)

{

P1=0xf0;

if(P1!

=0xf0)

{

delay(30);

if(P1!

=0xf0)

a=kescan();

}

if(a>9&&a<14)

{flag=1;key=a;fuhao=1;}

if(a>=0&&

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

当前位置:首页 > 解决方案 > 学习计划

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

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