4位数加法器课程设计 2.docx
- 文档编号:6517455
- 上传时间:2023-01-07
- 格式:DOCX
- 页数:17
- 大小:207.50KB
4位数加法器课程设计 2.docx
《4位数加法器课程设计 2.docx》由会员分享,可在线阅读,更多相关《4位数加法器课程设计 2.docx(17页珍藏版)》请在冰豆网上搜索。
4位数加法器课程设计2
一、设计任务和要求
1.1、任务描述:
1、系统通过4×4的矩阵键盘输入数字及运算符;
2、可以进行4位十进制数以内的加法运算,如果计算结果超过4位十进制数,则屏幕显示E;
3、可以进行加法以外的计算(乘、除、减);
4、创新功能。
1.2、任务要求:
1、理解任务书要求,明确分工,查找相关资料,制定系统方案;
2、论证系统设计方案,运用Proteus等软件绘制电路原理图;
3、根据硬件电路,确定算法,设计程序框图,编写程序代码;
4、误差分析与改进,完成设计报告。
二、方案论证
2.1、适用矩阵键盘控制作为输入电路,电路和软件稍微复杂,但是相比用独立按键,可节省I/O口,其原理图如2.1所示:
图2.1矩阵键盘控制电路
2.2、采用LED数码管显示,数码管图如图2.2.1所示:
图2.2.1LED数码管
三、电路基本单元电路设计
本电路的总体的工作框图如下所示:
下图则是加法器电路的原理图:
3.1、主控模块
该设计的核心控制电路是AT89C52单片机。
AT89C51是一种带4K字节FLASH存储器(FPEROM—FlashProgrammableandErasableReadOnlyMemory)的低电压、高性能CMOS8位微处理器,俗称单片机。
AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。
单片机的可擦除只读存储器可以反复擦除1000次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。
AT89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
其引脚图以及工作原理如下:
AT89C51芯片模型
3.1.1、主要功能特性
(1)4K字节可编程闪烁存储器。
(2)32个双向I/O口;128×8位内部RAM。
(3)2个16位可编程定时/计数器中断,时钟频率0-24MHz。
(4)可编程串行通道。
(5)5个中断源。
(6)2个读写中断口线。
(7)低功耗的闲置和掉电模式。
(8)片内振荡器和时钟电路。
3.1.2、AT89C51的引脚介绍
89C51单片机多采用40只引脚的双列直插封装(DIP)方式,下面分别简单介绍。
(1)电源引脚
电源引脚接入单片机的工作电源。
Vcc(40引脚):
+5V电源。
GND(20引脚):
接地。
(2)时钟引脚
XTAL1(19引脚):
片内振荡器反相放大器和时钟发生器电路的输入端。
XTAL2(20引脚):
片内振荡器反相放大器的输出端。
电源接入方式
(3)复位RST(9引脚)
在振荡器运行时,有两个机器周期(24个振荡周期)以上的高电平出现在此引脚时,将使单片机复位,只要这个脚保持高电平,51芯片便循环复位。
(4)
/Vpp(31引脚)
为外部程序存储器访问允许控制端。
当它为高电平时,单片机读片内程序存储器,在PC值超过0FFFH后将自动转向外部程序存储器。
当它为低电平时,只限定在外部程序存储器,地址为0000H~FFFFH。
Vpp为该引脚的第二功能,为编程电压输入端。
(5)ALE/
(30引脚)
ALE为低八位地址锁存允许信号。
在系统扩展时,ALE的负跳沿江P0口发出的第八位地址锁存在外接的地址锁存器,然后再作为数据端口。
为该引脚的第二功能,在对片外存储器编程时,此引脚为编程脉冲输入端。
(6)
(29引脚)
片外程序存储器的读选通信号。
在单片机读片外程序存储器时,此引脚输出脉冲的负跳沿作为读片外程序存储器的选通信号。
(7)pin39-pin32为P0.0-P0.7输入输出脚,称为P0口。
P0是一个8位漏极开路型双向I/O口。
内部不带上拉电阻,当外接上拉电阻时,P0口能以吸收电流的方式驱动八个LSTTL负载电路。
通常在使用时外接上拉电阻,用来驱动多个数码管。
在访问外部程序和外部数据存储器时,P0口是分时转换的地址(低8位)/数据总线,不需要外接上拉电阻。
(8)Pin1-Pin8为P1.0-P1.7输入输出脚,称为P1口,是一个带内部上拉电阻的8位双向I/0口。
P1口能驱动4个LSTTL负载。
(9)Pin21-Pin28为P2.0-P2.7输入输出脚,称为P2口。
P2口是一个带内部上拉电阻的8位双向I/O口,P2口能驱动4个LSTTL负载。
端口置1时,内部上拉电阻将端口拉到高电平,作输入用。
对内部Flash程序存储器编程时,接收高8位地址和控制信息。
在访问外部程序和16位外部数据存储器时,P2口送出高8位地址。
而在访问8位地址的外部数据存储器时其引脚上的内容在此期间不会改变。
(10)Pin10-Pin17为P3.0-P3.7输入输出脚,称为P3口。
P3口是一个带内部上拉电阻的8位双向I/O口,P2口能驱动4个LSTTL负载,这8个引脚还用于专门的第二功能。
端口置1时,内部上拉电阻将端口拉到高电平,作输入用。
对内部Flash程序存储器编程时,接控制信息。
3.2、显示模块
该电路的显示模块采用共阴极数码管显示。
共阴极数码管的位选采用低电平,而段选采用高电平控制。
LED数码管十六位进数的字形码如表3.2.1所示,而显示模块控制电路如3.2.2所示:
字型
共阳极代码
共阴极代码
字型
共阳极代码
共阴极代码
0
C0H
3FH
9
90H
6FH
1
F9H
06H
A
88H
77H
2
A4H
5BH
B
83H
7CH
3
B0H
4FH
C
C6H
39H
4
99H
66H
D
A1H
5EH
5
92H
6DH
E
86H
79H
6
82H
7DH
F
8EH
71H
7
F8H
07H
灭
FFH
00H
8
80H
7FH
表3.2.1LED数码管十六位进数的字形码
图3.2.2显示模块控制电路
3.3、操作模块
该操作模块的实际操作如下图所示:
图3.3.1矩阵键盘实际操作图
四、程序设计
本作品实现的功能全部是由C语言程序编写实现。
通过程序的编写使简单的器件实现丰富的功能。
如下所示是主程序流程图
主程序流程图
五、系统调试及结果
本设计应用Proteus6及KEIL51软件,首先根据自己设计的电路图用Proteus6软件画出电路模型,关于这个软件的使用通过查一些资料和自己的摸索学习;然后我们用KEIL51软件对所编写的程序进行编译、链接,如果没有错误和警告便可生成程序的hex文件,将此文件加到电路图上使软硬件结合运行。
下图为运行状况图,为首先输入10+990,再加上9999,最后每个数码管上为E,因为为了满足实验要求,当结果超过了9999后显示E.
刚开始为0
输入10
再加上990得到了1000
最后显示E
六、设计个人总结
经过一周的努力终于设计成功,LED数码管的显示结果与理想所保持的一样。
在这一周的设计中,完成这个简易的计算器,虽然精度不高,但是对于一般的计算,是绰绰有余。
起初,电路的设计对我们这些人来说,是一大障碍,通过查找资料,发现一个简易的计算器,似乎没有那么难,只要有心,定能成功。
后来数码管的显示一直困扰着我,但随着慢慢地了解它,在相关资料帮助之下,终于明白如何用C语言写程序去控制数码管的显示。
加之以前学过一些计算机方面的C语言,那并不是针对单片机C语言的,虽有相似之处,但差之甚大,如今已经了逐步地了解,相信若坚持下去,定能学好这一门课程。
通过此次设计课程,使我受益匪浅。
终于更深刻地体会到实践是唯一的真理。
致谢
通过这次单片机课程设计,我不仅加深了对单片机理论的理解,将理论很好地应用到实际当中去,而且我还学会了如何去培养我们的创新精神,从而不断地战胜自己,超越自己。
创新可以是在原有的基础上进行改进,使之功能不断完善,成为自己的东西。
这个设计过程中,我们通过查阅资料请教老师同学,完成了简易计算器的设计,使之成为一个更加适用,功能完备的属于自己的一个系统。
设计结果能够符合题意,成功完成了此次设计要求,我们不只在乎这一结果,更加在乎的,是这个过程。
这个过程中,我们花费了大量的时间和精力,更重要的是,我们在学会创新的基础上,同时还懂得合作精神的重要性,学会了与他人合作,在此,请允许我再次感谢我的老师和同学!
参考文献
【1】何立民,单片机系统设计【M】.北京:
北京航天大学出版社,1993.
【2】楼然笛,单片机开发【M】.北京:
人民邮电出版社,1994.
【3】付家才,单片机控制工程实践技术【M】.北京:
化学工业出版社,2004.3.
【4】李光才,单片机课程设计实力指导【M】.北京:
北京航空航天大学出版社,2004.
【5】朱定华,单片机原理机接口技术实验【M】.北京:
北方交通大学出版社,2002.11.
【6】杨居义,单片机课程设计指导【M】.北京:
清华大学出版社,2009.9.
【7】吴金戎,8051单片机实践与应用北京:
清华大学出版社,2003.8
【8】夏路易,单片机技术基础教程与实践电子工业出版社 2008.1
【9】张毅刚,单片机原理及应用高等教育出版社2012.11
【10】蒋辉平,基于Proteus的单片机系统设计与仿真实例机械工业出版社
2007.7
【11】皮大能,单片机课程设计指导书北京理工大学出版社2012.7
附录
程序:
通过用单片机MCU与矩阵及数码管的相互连接构成一个简易的数计算器--------可以进行加减乘除
#include
#defineucharunsignedchar
longFirst,End;//定义全局变量
//此表为LED的字模,共阴数码管0-9-
unsignedcharcodeDisp_Tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//段码控制
//此表为8个数码管位选控制,共阴数码管1-8个-
unsignedcharcodedispbit[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};//位选控制查表的方法控制
voiddelay(intn)/***延时程序***/
{inti,j;
for(i=0;i {for(j=0;j<50;j++) ;} } longadd(longx,longy)/***加法程序***/ {longz; z=x+y; return(z); } longsub(longx,longy)/***减法程序***/ {longz; if(x>=y) z=x-y; else {z=y-x; z=z+100000;}/***最高位用1表示负数***/ return(z); } longmul(longx,longy)/***乘法程序***/ {longz; z=x*y; return(z); } longdiv(longx,longy)/***除法程序***/ {longz; z=x/y; return(z); } ucharkbscan(void)/***键盘扫描程序***/ { ucharsccode; P0=0xf0; if((P0&0xf0)! =0xf0)//发全0行扫描码,列线输入 {delay(222);//延时去抖 if((P0&0xf0)! =0xf0) {sccode=0xfe;//逐行扫描初值 while((sccode&0x10)! =0) {P0=sccode;//输出行扫描码 if((P0&0xf0)! =0xf0) { return(P0);}//如果检测到有键按下,返回键值 else sccode=(sccode<<1)|0x01;//行扫描码左移一位 } } } return(0);//无键按下,返回值为0 } voiddisplay(void)/***显示程序***/ {inti; uchardatanum[6]; num[0]=First/100000%10;//十万 num[1]=First/10000%10;//万 num[2]=First/1000%10;//千位 num[3]=First/100%10;//百位 num[4]=First/10%10;//十位 num[5]=First%10;//个位 for(i=5;i>=0;i--) {P2=dispbit[i];//位选输出 P1=Disp_Tab[num[i]];//数据输出 delay (2);//此延时必不可少? } } voidmain(void)/***主程序***/ {intk,n; ucharf,g,key,gn1,i; n=0; f=0; //P1=0;//初始时指示灯灭 while (1)//不断查询是否有按键动作 {key=kbscan();//获取返回键值 if(key! =0) { switch(key)//译码,将对应按键返回值转换为相应数值 { case0xee: k=0;break;//0 case0xde: k=1;break;//1 case0xbe: k=2;break;//2 case0x7e: k=3;break;//3 case0xed: k=4;break;//4 case0xdd: k=5;break;//5 case0xbd: k=6;break;//6 case0x7d: k=7;break;//7 case0xeb: k=8;break;//8 case0xdb: k=9;break;//9 case0xbb: k=10;First=0;End=0;f=0;break;//清除 case0x7b: k=11;break;//等于 case0xe7: k=12;f=1;break;//加 case0xd7: k=13;f=2;break;//减 case0xb7: k=14;f=3;break;//乘 case0x77: k=15;f=4;break;//除 } //P1=1; delay(280);//有按键时,指示灯的显示时间 //P1=0;//按键指示灭 if(k<10)//为数字键时(0-9) { if(f! =0)//为数字键时,如果已经有功能键按下 { n++;//记录数字键所按次数 gn1=0;//清除标志,再次为功能键时进行运算 g=f;//保存运算标志 if(n==1)//输入为各位数时,直接赋值 First=k; elseif(n>1)//输入为多位数时,将它转化为10进制的多位数 First=First*10+k; } else//如果没有功能键按下 { n++; gn1=1;//定义标志,当下一次为功能键时,停止数据输入 if(n==1) First=k; elseif(n>1) First=First*10+k; End=First;//将第一个数保存 } } elseif(k>11)//为功能键时(+-*/) { if(gn1==1)//前一次数字键之后为功能键时 { n=0;//清除计数标志 } else//如果再次输入功能键,则进行运算 { n=0;//清除计数标志 switch(g) { case1: First=add(End,First);break; case2: First=sub(End,First);break; case3: First=mul(End,First);break; case4: First=div(End,First);break; } } End=First;//保存本次结果 } elseif(k==11)//为等于号时(=) { n=0; gn1=1;//接着输入为功能键时可以继续运算 switch(g) { case1: First=add(End,First);break; case2: First=sub(End,First);break; case3: First=mul(End,First);break; case4: First=div(End,First);break; } End=First;//保存最终运算结果 f=0;//清除运算标志 if(End>9999)/***当结果大于9999时,显示E*****/ { P1=0XF9;//显示E for(i=5;i>=0;i--) { P2=dispbit[i];//位选输出 //P1=Disp_Tab[num[i]];//数据输出 delay (1);//此延时必不可少? } } } } display();//调用显示程序 }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 4位数加法器课程设计 位数 加法器 课程设计
![提示](https://static.bdocx.com/images/bang_tan.gif)