(此文档为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,同理,每个按键都会有一个对应的十六进制值,我把它们列出来进行一一对应就行了,下面是扫描按键图。
以下为键盘扫描子程序的程序清单。
uint kescan(){uint com;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取余,得到我们想要的四个数,送显示子程序显示。
其余减、乘、除的计算方法与加法的计算方法一样,这里不再累述。
void dis(uint n){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;}}else if(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;}}else if(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;}}else if(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;}}else if(n%10){if(fu==1)P2=~(DSY_CODE[n]&0x7f);if(fu==0)P2=~DSY_CODE[n];P3=0x20;delay(4);}运算子程序设计显示加减乘除四个运算符void calculate(uint z){ 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; 码管}}除法子程序设计除法的运算,可以显示小数点void div(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;}}else if(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;}}else if(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;}}else if(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;}}}主程序见附录14.程序主框图主程序流程四、课程设计原理分析及相关知识概述本次课程设计用的STC12C54具有速度快、功耗低、抗干扰强的特点,有多种IO端口模式,它默认为准双向口弱上拉,最大灌电流为20mA,拉电流为230uA,所以在三极管和芯片管脚间要接15k的电阻,(5v-1.8v)300欧=10mA,八个led就为80 mA,超过50 mA的总电流,所以电阻选用511欧。