ImageVerifierCode 换一换
格式:DOCX , 页数:29 ,大小:547.79KB ,
资源ID:4829921      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4829921.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(单片机计算器的课程设计报告.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

单片机计算器的课程设计报告.docx

1、单片机计算器的课程设计报告3.5按键监视电路5附录3、器件清单 24一、设计任务和性能指标1.1设计任务自制一个单片机最小系统,包括复位电路,采用外部小键盘输入数据,能够实现加法、乘法及一个科学计算,计算结果显示在四位一体的数码管上。要求用Protel 画出系统的电路原理图(要求以最少组件,实现系统设计所要求的功能),印刷电路板(要求布局合理,线路清晰),绘出程序流程图,并给出程序清单(要求思路清晰,尽量简洁,主程序和子程序分开,使程序有较强的可读性)。1.2性能指标1.加法:四位加法,计算结果若超过四位则显示计算错误;2.减法:四位减法,计算结果若小于零则显示计算错误;3.乘法:个位数乘法;

2、4.除法:整数除法;5.取对数;6.开平方;7.指数运算;8.有清零功能二.设计方案按照系统设计的功能的要求,初步确定设计系统由主控模块、监测模块、显示模块、键扫描接口电路共四个模块组成,电路系统构成框图如图1.1所示。主控芯片使用51系列AT89C52单片机,采用高性能的静态80C51设计,由先进工艺制造,并带有非易失性Flash程序存储器。它是一种高性能、低功耗的8位COMS微处理芯片,市场应用最多。监测模块采用二极管和扬声器(实验室用二极管代替)组成电路。键盘电路采用4*4矩阵键盘电路。显示模块采用4枚共阳极数码管和74ls273锁存芯片构成等器件构成。整个单片机的接口电路: P0用于显

3、示输出;P1用于键扫描输入;P2用于数码管位选控制;P3用于键盘扩展(部分运算符输入);三.系统硬件设计3.1单片机最小系统单片机最小系统就是支持主芯片正常工作的最小电路部分,包括主控芯片、复位电路和晶振电路。主控芯片选取STC89C52RC芯片,因其具有良好的性能及稳定性,价格便宜应用方便。晶振选取11.0592MHz,晶振旁电容选取20pF。采用按键复位电路,电阻分别选取100和10K,电容选取10F。以下为单片机最小系统硬件电路图。 单片机最小系统硬件电路3.2键盘接口电路 计算器所需按键有:数字键:1,2,3,4,5,6,7,8,9,0功能键:+, - , *, / , = , C(

4、清零)扩展键:“log”,“ln”,“x2”“小数点”,“开方” 共计25个按键,采用4*4矩阵键盘,键盘的行和列之间都有公共端相连,四行和四列的8个公共端分别接P1.0P1.7,这样扫描P1口就可以完成对矩阵键盘的扫描,通过对16个按键进行编码,从而得到键盘的口地址,对比P1口德扫描结果和各按键的地址,我们就可以得到是哪个键按下,从而完成键盘的功能。 以下为键盘接口电路的硬件电路图 键盘接口电路实物图: 扩展键接口电路:3.3数码管显示电路 采用8位数码管对计算数据和结果的显示(实验时只用到了4位),这里选取共阴数码管,利用74LS244N对数码管进行驱动,为了节省I/O资源,采取动态显示的

5、方法来显示计算数据及结果。 P0口输出显示值, P2.0P2.7(实际操作用到P2.0-P2.3)用来作为位选端,控制哪几位数码管进行显示。 以下为数码显示电路的硬件电路图74LS244N接口电路:3.4按键监视电路按键监视电路就是在按键时,发出声音提醒,以确保输入数字有效。这里就采用5V蜂鸣器作为示音设备(实际操作用发光二极管代替)。用p3.7口输出信号。以下为报警电路硬件电路图按键监视电路图 系统整体硬件电路图见附录一四、系统软件设计4.1键盘扫描子程序设计 要进行数据的计算就必须先进行数据的输入,也就必须确定按键输入的数值是什么,这就需要对键盘进行扫描,从而确定究竟是哪个键按下。 以下为

6、键盘扫描子程序的程序清单。 uchar Keyscan(void) uchar i,j, temp, Buffer4 = 0xef, 0xdf, 0xbf, 0x7f; for(j=0; j4; j+) P1 = Bufferj; /*以下三个_nop_();作用为让 P1 口的状态稳定*/ delay(); temp = 0x01; for(i=0; i4; i+) if(!(P1 & temp) return (i+j*4); temp = 1; 4.2移位程序及结果计算代码设计输入数据要存储在一四位数组内,而我们键入的值是数据的高位,后键入的值是低位,这样我们就需要在输入低位数值时将高位

7、数值从数组的低位移向数组的高位,这就是编写移位子程序的目的。对于结果计算子程序,包含加、减、乘、除四种运算。以加法运算为例,各种运算各有其标志位来代表计算类型,当加法标志位add=1是,就将输入的两个数据按照加法进行计算。首先将数组内的数按照对应的位关系,将其转化为一个十进制数,这样我们就得到了加速和被加数这样俩个十进制数,从而我们就可以简单的将两个数进行相加,结果就是我们所求的数值。但这个数值不能直接显示到数码管上,我们还要对其进行处理,使其变为对应进位的四个数存入数组内,以便显示。既通过对结果数值分别除以1000、100、10和对10取余,得到我们想要的四个数,送显示子程序显示。其余减、乘

8、、除的计算方法与加法的计算方法一样,这里不再累述。以下为移位子程序和结果计算子程序的程序清单。这部分嵌入到了主函数中。调用输入数据函数:4.3显示子程序设计 从始至终无论是输入的计算数据,还是计算后的结果值。都存储在同一数组dat 中,这样我们只要在显示时一直调用dat 中的值,就能正确的显示数据。 以下为显示子程序的程序清单。 void diaplay(void) interrupt 1 uchar len; TH0=(65536-2000)/256; TL0=(65536-2000)%256; P2=Disbufdcounter; len=dcounter; P0=xxlen; dcoun

9、ter+=1; if(dcounter=8) dcounter=0; 延时程序:void Delay_1ms(uint i)/1ms延时 uchar x,j; for(j=0;ji;j+) for(x=0;x=148;x+); void delay() int i,j; for(i=0; i=10; i+) for(j=0; j=2; j+);4.4主程序设计 主程序既把以上各子程序串连成一个整体,使整个程序循环运行。而在以上程序中也已经加入了个程序之间的连接点,首先进入程序后就立即进入显示子程序,而显示子程序内又调用键盘扫描子程序,若有键按下,则会跳转到移位子程序和结果计算子程序进行相应的处

10、理。通过计算或移位后,数组内的值发生改变,显示的值也会同时发生改变。之后再进行键盘扫描,如此反复运行,就构成了程序的整体。 整体程序清单如下:#include#include#includetypedef unsigned char uchar;typedef unsigned int uint;void delay();uchar Keyscan(void);void result_a(void);void diaplay(void);void Delay_1ms(uint i);uchar vie_a10=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x

11、7f,0x6f;uchar exchg_a16=7,8,9,13,4,5,6,12,1,2,3,11,14,0,15,10;uchar xx8;uchar xxu8;void Speak_a(void);sbit spp=P37;/响铃sbit cl3=P36;/小数点sbit cl=P31;/求lnsbit cl0=P32;/开方sbit cl1=P33;/求logsbit cl2=P34;/求e的x次幂uchar flo10=0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xef,0xef;uchar zz8=0x77,0x3f,0x77,0x77,0x7

12、9;uchar Disbuf8=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f;uchar yy8=0x3f,0,0;float a=0,b=0,c;uchar L=1;uchar cal_a=0,dcounter=0;void main(void) uchar singlp_a=1,n=1; uchar key=18; uchar all_m=0,ent_a=0,att=1; signed long s,r; TMOD=0x01; TH0=(65536-2000)/256; TL0=(65536-2000)%256; EA=1; ET0=1; TR0=1; s

13、pp=0; while(1)if(singlp_a=1) singlp_a=0; P3=0x7f; if(P3!=0x7f) Delay_1ms(2); if(cl=0) Speak_a(); cal_a=14;/求以x key=15; if(cl0=0) Speak_a(); cal_a=15;/开方 key=15; if(cl1=0) Speak_a(); cal_a=16;/求以十为底对数 key=15; if(cl2=0) Speak_a(); cal_a=17;/求e的x次幂 key=15; if(cl3=0) att=0; xx0=xx0+0x80; P1=0x0f; if(P1!

14、=0x0f) Delay_1ms(2); if(P1!=0x0f) key=exchg_aKeyscan(); Speak_a(); P1=0x0f;P3=0x7f;if(P1=0x0f&P3=0x7f) singlp_a=1; if(key=0) if(all_m=0) if(ent_a=0) uchar i; ent_a=1; for(i=0;i0;i-) xxi=xxi-1; xx0=vie_akey; key=18; else uchar i; double m; for(i=7;i0;i-) xxi=xxi-1; xx0=vie_akey; m=key; for(i=1;i0;i-)

15、 xxi=xxi-1; xx0=vie_akey; key=18; else uchar i; double m; for(i=7;i0;i-) xxi=xxi-1; xx0=vie_akey; m=key; for(i=1;i=10&key=13) uchar i; cal_a=key; for(i=0;i=7;i+) xxi=xxui; all_m=1; key=18; att=1; n=1; if(key=14) uchar i; key=18; ent_a=0; for(i=0;i=7;i+) xxi=yyi; a=0; b=0; c=0; all_m=0; L=1; att=1; n

16、=1; cal_a=0; if(key=15) uchar i; all_m=0; key=28; for(i=0;i=0.0001) r=c; s=10000*(c-r); n=0; xxn=vie_as%10; if(s%10!=0) n+; if(c=0.001) r=c; s=1000*(c-r); xxn=vie_as%10; if(n=0&s%10=0) else n+; if(c=0.01) r=c; s=100*(c-r); xxn=vie_as%10; if(n=0&s%10=0) else n+; if(c=0.1) r=c; s=10*(c-r); xxn=vie_as%

17、10; if(n=0&s%10=0) else n+; if(c=1) s=c; xxn=flos%10; n+;if(c=10) s=c/10; xxn=vie_as%10; n+;if(c=100) s=c/100; if(n=8) uchar i; for(i=0;i=1000) s=c/1000; if(n=8) uchar i; for(i=0;i=10000) s=c/10000; if(n=8) uchar i; for(i=0;i=100000) s=c/100000; if(n=8) uchar i; for(i=0;i=1000000) s=c/1000000; if(n=

18、8) uchar i; for(i=0;i=10000000) s=c/10000000; if(n=8) uchar i; for(i=0;i=100000000) for(i=0;i=7;i+) xxi=zzi; else xxn=0xbf; void result_a(void) switch(cal_a) case 0:c=a;break; case 10:c=a+b;break; case 11:if(ab) uchar i; for(i=0;i=7;i+) xxi=zzi; L=0; else c=a-b; break; case 12:c=a*b;break; case 13:c

19、=a/b;break; case 14:c=log(a); a=c;break; case 15:c=sqrt(a); a=c;break; case 16:c=log10(a); a=c;break; case 17:c=exp(a); a=c;break; default:c=0;void Delay_1ms(uint i)/1ms延时 uchar x,j; for(j=0;ji;j+) for(x=0;x=148;x+); void delay() int i,j; for(i=0; i=10; i+) for(j=0; j=2; j+);uchar Keyscan(void) ucha

20、r i,j, temp, Buffer4 = 0xef, 0xdf, 0xbf, 0x7f; for(j=0; j4; j+) P1 = Bufferj; /*以下三个_nop_();作用为让 P1 口的状态稳定*/ delay(); temp = 0x01; for(i=0; i4; i+) if(!(P1 & temp) return (i+j*4); temp = 1; void diaplay(void) interrupt 1 uchar len; TH0=(65536-2000)/256; TL0=(65536-2000)%256; P2=Disbufdcounter; len=d

21、counter; P0=xxlen; dcounter+=1; if(dcounter=8) dcounter=0; void Speak_a(void) uchar i; for(i=0;i=20;i+) spp=1; delay(); delay(); spp=0; delay(); delay(); 五、调试及性能分析5.1调试步骤 在焊接好器件后,先不要将芯片插在芯片座上,要先验证先板上电源是否好用,有无短路等。接上电源,用万用表测量个芯片座对应电源和地之间的电压值,观察电压值是否正常。一切正常后方可将芯片插入芯片座,以继续测试其他功能。 将芯片插上后,对各个模块进行调试,按键是否工作

22、正常,数码管是否显示正常等。编写相关部分的测试程序对其进行测试。 各部分硬件检测无误后,下载程序进行整体调试,一切正常后,结束调试过程。 在具体调试时首先遇到的问题是程序无法下载进入单片机,通过将电路板接线与原理电路图接线的对比发现,串口芯片与单片机连接的输入,输出接反,重新用铜线连接后,依然无法下载程序。后找到原因是由于下载串口与设计封装不符,用相对应的下载线可以下载。 成功下载程序后,发现数码管显示不正确,查看后发现有先没有连接,可能是制板时漏印,连接后显示正常。5.2性能分析 对于计算器的性能,主要的衡量指标就在于计算的精度,本次制作的计算器性能情况如下:加法运算:四位加法运算,和值不超

23、过9999,若超过上限,则显示错误提示ERROR。减法运算:四位减法运算,若结果为负,对其取绝对值。乘法运算:积不超过9999的乘法运算,若超出上限,显示错误提示Error。除法运算:整数除法,既计算结果为整数,若除数为零,则显示错误提示Error。通过对实际性能的分析,可以得到本次设计满足设计的要求。六、心得体会通过本次课程设计我真正的自己完成了对给定要求系统的硬件设计、电路设计、电路板设计、软件设计以及对成品的调试过程。从整个过程中学习到了很多方面的知识,了解到以往学习中自己知识在某方面的不足之处,是对以往学习科目的一种贯穿和承接,从而能更好的认识和学习,也对将来从事工作大有裨益。本次实验过程中,我切实体验到了,认真对待每一个细小零件的重要性。对于实验室提供的零件要具有检错能力。我做的是

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

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