收藏 分销(赏)

单片机应用课程设计-九九乘法表判断器.docx

上传人:a199****6536 文档编号:2564693 上传时间:2024-06-01 格式:DOCX 页数:23 大小:1.41MB
下载 相关 举报
单片机应用课程设计-九九乘法表判断器.docx_第1页
第1页 / 共23页
单片机应用课程设计-九九乘法表判断器.docx_第2页
第2页 / 共23页
点击查看更多>>
资源描述
信息与电气工程学院 课程设计说明书 (2015/2016学年第二学期) 课程名称 : 单片机应用课程设计 题 目 : 九九乘法表判断器 专业班级 : 自动化三班 学生姓名 : 学 号 : 指导教师 ; 设计周数 : 2周 设计成绩 : 2016年 07 月 07 日 目录 摘要 - 2 - 1. 课程设计任务及目的 - 3 - 1.1 课程设计任务 - 3 - 1.1.1 技术要求: - 3 - 1.1.2 原始数据及主要任务: - 3 - 1.2课程设计目的 - 3 - 2、课程设计正文 - 4 - 2.1 硬件设计 - 4 - 2.1.1 系统工作原理: - 4 - 2.1.2单元电路设计 - 4 - 2.1.3系统调试 - 8 - 2.1.4系统调试 - 9 - 2.2 软件设计 - 9 - 2.2. 1 系统分析 - 9 - 2.2.2 系统设计 - 10 - 2.2.3 系统实施 - 10 - 3、课程设计总结 - 11 - 4、参考文献 - 11 - 附录一 原理图 - 12 - 附录二 九九乘法表C语言程序 - 13 - 5.教师评语 - 22 - 摘要 近年来随着计算机在社会领域的渗透和大规模集成电路的发展,单片机的应用正在不断地走向深入,由于它具有功能强,体积小,功耗低,价格便宜,工作可靠,使用方便等特点,因此特别适合于与控制有关的系统,越来越广泛地应用于自动控制,智能化仪器,仪表,数据采集,军工产品以及家用电器等各个领域,单片机往往是作为一个核心部件来使用,在根据具体硬件结构,以及针对具体应用对象特点的软件结合,以作完善。 而51系列单片机是各单片机中最为典型和最有代表性的一种,通过本次课程设计进一步对单片机学习和应用,从而更熟悉单片机的原理和相关设计并提高了开发软、硬件的能力。本设计主要设计一个基于MCS-51单片机的九九乘法表判断器,通过四个控制键来实现对九九乘法表中每一条乘法语句的输入以及复位等功能。详细描述了以单片机最小系统为基础,,应用Proteus软件实现单片机九九乘法表判断器系统的设计与仿真,利用Protel设计硬件电路原理图和PCB图。用Keil C51 uVision4集成开发环境进行软件程序的编写,并进行电路焊接、电路仿真和电路调试等一系列过程。 关键字:51单片机 Proteus Keil 九九乘法表判断器 1. 课程设计任务及目的 1.1 课程设计任务 1.1.1 技术要求: 以MCS-51单片机为核心,设计出一个九九乘法表判断器。2个数码管显示输入答案;一个数字加1循环按键,一个乘按键,一个输入答案按键,一个清零按键。若输入正确,蜂鸣器鸣响2秒;答案错误,则清零重新输入。 1.1.2 原始数据及主要任务: 1、确定总体设计法案; 2、设计键盘输入电路; 3、设计显示电路; 4、合理分配地址,编写系统程序; 5、利用Protues设计硬件电路原理图和PCB; 6、 软硬件联机调试。 1.2课程设计目的 1、巩固《单片机原理与应用》和《单片机接口技术》理论课的理论知识; 2、将《单片机原理与应用》理论课的理论知识应用于实际的应用系统中; 3、通过九九乘法表判断器的设计,掌握单片机接口技术中的键盘输入电路和数码管显示电路; 4、通过单片机课程设计,熟练掌握Proteus和Keil软件的使用方法,提高自己的动手能力; 5、完成系统的硬件设计、软件设计、仿真调试,学会将硬件知识和软件知识结合起来,使两者相互补充,共同实现一个系统的功能; 6、通过课程设计加深理解课堂教学内容,掌握单片机的基本应用方法。通过课程设计熟悉单片机基本接口芯片的外型、引脚、编程结构。熟悉使用、支持串口下载程序(ISP)的单片机,例如STC90C52AD,做到理论联系实际。 2、课程设计正文 2.1 硬件设计 2.1.1 系统工作原理: 数码管显示模块 单片机 键盘输入模块 蜂鸣器模块 系统通过键盘输入模块向单片机输入数据,经过单片机的计算按条件再向数码管显示模块和蜂鸣器输出指令,使之执行相应的动作。 2.1.2单元电路设计 (一)单片机基本系统 1、电路说明 课程设计配发的小电路板(ISP-MCU Basic circuit)电路原理图。该板作为课程设计的核心电路板使用,板上有单片机及附属电路,RS-232通信驱动电路,高低电平测试电路等。课程设计电路中需要的其他电路在此基础上扩展,通过插孔连接。 单片机基本配置板电路原理图 STC90C52AD说明 STC90C52AD的引脚图 STC90C52AD的引脚说明和功能说明如下: XTAL1 :接外部晶振的一个引脚。在单片机内部,它是一反相放大器输入端,这个放大器构成了片内振荡器。采用外部振荡器时,此引脚应接地。 XTAL2 :接外部晶振的一个引脚。在片内接至振荡器的反相放大器输出端和内部时钟发生器输入端。当采用外部振荡器时,则此引脚接外部振荡信号的输入。 RST :AT89C51的复位信号输入引脚,高电位工作,当要对芯片复位时,只要将此引脚电位提升到高电位,并持续两个机器周期以上的时间,AT89C51便能完成系统复位的各项工作,使得内部特殊功能寄存器的内容均被设成已知状态。 P0口(P0.0~P0.7)是一个8位漏极开路双向输入输出端口,当访问外部数据时,它是地址总线(低8位)和数据总线复用。外部不扩展而单片应用时,则作一般双向I/O口 用。P0口每一个引脚可以推动8个LSTTL负载。 P2口(P2.0~P2.7)口是具有内部提升电路的双向I/0端口(准双向并行I/O口),当访问外部程序存储器时,它是高8位地址。外部不扩展而单片应用时,则作一般双向I/O口用。每一个引脚可以推动4个LSTL负载。 P1口(P1.0~P1.7)口是具有内部提升电路的双向I/0端口(准双向并行I/O口),其输出可以推动4个LSTTL负载。仅供用户作为输入输出用的端口。 P3口(P3.0~P3.7)口是具有内部提升电路的双向I/0端口(准双向并行I/O口),它还提供特殊功能,包括串行通信、外部中断控制、计时计数控制及外部随机存储器内容的读取或写入控制等功能。 (二)按键输入单元设计 1、电路说明 按键输入单元的电路图如图。 该单元作为系统的输入,采用了四个独立按键,分别为数字加一循环按键S1(接P3.2口)、乘按键S2(接P3.3口)、答案输入按键S3(接P3.4键)、清零按键S4按键(接P3.5口)。当按键按下,电源与地短路,使单片机端口电平被拉低,从而检测出一个输入。各个接口通过插针与单片机相连。 (三)数码管显示单元 数码管显示单元的电路原理图如图。 该单元作为系统的输出显示,采用两个共阳极数码管动态显示。两数码管段选信号引脚并联通过1KΩ的限流电阻接到单片机的P0.0到P0.7一次接数码管的a—g脚。由于采用了共阳极的数码管,因此不需要驱动芯片来驱动数码管显示,只需单片机引脚给出低电平相应断即可点亮。两个数码管的片选端分别接两个PNP型三级管的集电极,三级管的射极接电源,基极接单片机P2.2、P2.3端。该三极管起到了控制以及放大电流的作用,使得单片机可以通过给相应端口送低电平而使数码管点亮。 通过查询得到数码管的引脚排序,找出响应的引脚。在单片机端口外接1KΩ的限流电阻,以防止电流过大损坏数码管。两个数码管的片选端分别接两个PNP型三极管的集电极,三极管的射极接电源,基极接单片机。注意数码管、三极管的引脚不能接错。 (三)蜂鸣器输出单元 蜂鸣器输出单元的电路图如图。 该单元作为系统的输出,在计算结果正确时鸣响。蜂鸣器通过一个PNP型三极管与电源和单片机P3.6口相连。三极管的放大作用避免了蜂鸣器驱动电流的不足,也使得单片机可以通过给P3.6口低电平使蜂鸣器鸣响,注意三级管的极性,以及限流电阻的接法。 2.1.3系统调试 硬件调试:硬件调试开发系统、基本测试仪器(万用表、示波器等),检查用户系统硬件中存在的故障。硬件调试可分为静态调试与动态调试两步进行。 静态调试:是在用户系统未工作时的一种硬件检测。 第一步:目测。检查外部的各种元件或者是电路是否有断点。 第二步:用万用表测试。先用万用表复核目测中有疑问的连接点,再检测各种电源线与地线之间是否有短路现象。 第三步:加电检测。给板加电,检测所有插座或是器件的电源端是否符合要求的值 第四步:联机检查。因为只有用单片机开发系统才能完成对用户系统的调试。 动态调试:是在用户系统工作的情况下发现和排除用户系统硬件中存在的器件内部故障、器件连接逻辑错误等的一种硬件检查。 动态调试的一般方法是由近及远、由分到合。由分到合是指首先按逻辑功能将用户系统硬件电路分为若干块,当调试电路时,与该元件无关的 器件全部从用户系统中去掉,这样可以将故障范围限定在某个局部的电路上。当各块电路无故障后,将各电路逐块加入系统中,在对各块电路功能及各电路间可能存在的相互联系进行调试。由分到合的调试既告完成。由近及远是将信号流经的各器件按照距离单片机的逻辑距离进行由近及远的分层,然后分层调试。调试时,仍采用去掉无关元件的方法,逐层调试下去,就会定位故障元件了。 2.1.4系统调试 在焊接完毕附加电路以后,可通过肉眼做初步的观察,看是否存在虚焊、漏焊等明显缺陷,确认没有以后,可以通电对蜂鸣器单元、数码管显示单元进行调试:将蜂鸣器的使能端接到5V电源负极,正常鸣响则该单元合格。再将每个数码管的使能端和段选端接到电源负极,如果每段都正常点亮则该单元合格。若某单元不正常,则需找出错误改正后在调试,直到合格为止。对于按键单元则可以通过万用表测其通态与断态的电阻来确定其实否合格。合格时,通态电阻接近0,断态电阻接近无穷。 2.2 软件设计 2.2. 1 系统分析 本系统是一个九九乘法表判断器,要有乘数及答案的输入。在硬件电路中设置了4个按键,S1、S2、S3、S4分别作为数字加一循环、乘、答案输入、清零按键。两个数码管显示输入的数字。而蜂鸣器则在答案正确的时候作提示用。 在按键方面,由于只有一个数字加一循环键,所以,将乘按键和答案输入键设置为多功能按键。在第一次按下S2时再按S1则可输入第一个乘数,第二次按下S2键的时候按S1键可以输入第二个乘数。在S3第一次按下后,按S1输入答案的十位数,S3第二次按下后输入答案的个位数,S3第三次按下则判断并显示结果:正确则蜂鸣2秒,错误则清零重来。 在此技术要求下,程序流程图如下: N 开始 初始化 S2(乘)按键功能子程序 S4(清零)按键子程序 乘数输入子程序 答案输入子程序 S3是否按下 S4是否按下 S2键是否按下 Y Y N Y N 2.2.2 系统设计 在九九乘法表判断器的系统设计中,可以将其分为多个模块来进行设计。有按键输入模块、数码管显示模块、蜂鸣器单元以及晶振单元。在设计按键时可以将四个按键独立设计子程序,以免干扰混淆。在根据系统流程图来编写完整的程序。 2.2.3 系统实施 将程序下载到单片机中,给电路上电。此时,数码管显示 0,加一按键、答案输入按键皆为无效。按一次乘按键,加一键生效,可按加一键输入第一个乘数,数码管显示输入值;再按一次乘按键后,该键失效,答案输入按键生效,数码管显示“0”,按加一键输入第二个乘数。按一次答案输入按键,数码管显示“00”,此时可按加一键输入答案的十位数,第一个数码管显示输入数值,第二个数码管显示“0”;再按一次答案输入按键,数码管显示“x0”(x为此前输入的答案十位数),按加一键可以输入答案的个位,第二个数码管显示输入值;第三次按下答案输入按键判断答案是否正确,如果正确,则蜂鸣器响2秒数码管显示正确答案,否则数码管显示“0”,从新输入数据;在整个过程中,都可以按清零键重新输入数据。 3、课程设计总结 在这两个星期的学习,发现了自己的很多不足,自己单片机知识上的很多漏洞,看到了自己的实践经验还是比较缺乏,理论联系实际的能力还急需提高。从理论设计,到系统调试。整个过程都需要我们充分利用所学的知识进行思考、借鉴。通过这次课程设计,对以前学过的知识进行了巩固,加深了理解,提高了应用的能力,而且提高了我们的发现、分析、解决问题的能力。经历了从最初的设计到最后做出产品的开发过程,提高了对专业的认识及兴趣,对于我们工科来说,对以后就业有及其重大的影响。在项目制作过程中的困难和喜悦、希望和失望、失败和成功等也都将成为我们心中宝贵的精神财富。在与同学们交流以及程序编写过程中,我认识到合作的重要性,我认为我们的工作是一个团队的工作,团队需要个人,个人也离不开团队,必须发扬团结协作的精神。 这次实践对我而言,知识上的收获重要,精神上的丰收更加可喜。让我知道了学无止境的道理。我们每一个人永远不能满足于现有的成就,人生就像在爬山,一座山峰的后面还有更高的山峰在等着你。挫折是一份财富,经历是一份拥有。这次课程设计必将成为我人生旅途上一个非常美好的回忆! 最后,衷心的感谢帮助过我们的各位指导老师,谢谢你们对我们热情细致的解答说明,如果没有你们,我们是根本不可能完成课设的。谢谢各位老师。 4、参考文献 [1]张毅刚,彭喜元,彭宇编著. 单片机原理及应用.北京:高等教育出版社,2012. [2]徐爱钧,徐阳编著.智能化测量控制仪表原理与设计.北京:北京航空航天大学出版社,2004. [3]陈伟人编著.MCS-51系列单片机实用子程序集锦[M].北京:清华大学出版社.1993. [4]龚运新, 罗惠敏, 彭建军编著.单片机接口C语言开发技术.北京:清华大学出版社.2009 附录一 原理图 附录二 九九乘法表C语言程序 #include<reg52.h> //包含52头文件 #define uchar unsigned char //定义无符号符号型变量 #define uint unsigned int //定义无符号整型变量 sbit key1=P3^5; sbit key2=P3^4; sbit key3=P3^3; sbit key4=P3^2; sbit key5=P1^4; sbit gewei=P2^3; sbit shiwei=P2^2; sbit buzzer=P3^6; uchar i,j,k,pd1,Count1,Count2; uchar ans_ten,ans_one,mul_ten,mul_one; uchar mul_flag,ans_flag,mul_end_flag; uint answer,result,pp,flag; /**数码管段码表**/ unsigned char code table[]= { 0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8, 0x80,0x90 }; /*****延时子函数*****/ void delay(uint i) { for(j=i;j>0;j--) for(k=110;k>0;k--); } /**显示子函数1**/ /**显示答案十位**/ void display1() { shiwei=0; gewei=1; P0=table[ans_ten]; } /**显示子函数2**/ /**显示答案个位**/ void display2() { gewei=0; shiwei=1; P0=table[ans_one]; } /**显示子函数3**/ /**显示第一个乘数**/ void display3() { shiwei=0; gewei=1; P0=table[mul_ten]; } /**显示子函数4**/ /**显示第二个乘数**/ void display4() { gewei=0; shiwei=1; P0=table[mul_one]; } /**答案清零子函数**/ /**若答案输入错误,则将答案清零,重新输入答案**/ void clear_ans() { EA=0; gewei=0; shiwei=0; P0=table[0]; ans_one=0; ans_ten=0; ans_flag=0; mul_flag=0; buzzer=1; } /**清零子函数**/ /**若按下清零键,则复位清零**/ void clear_all() { EA=0; pd1=0; gewei=0; shiwei=0; P0=table[0]; mul_one=0; mul_ten=0; ans_one=0; ans_ten=0; ans_flag=0; mul_flag=0; mul_end_flag=0; } /*判断子函数*/ /*若答案输入正确,则蜂鸣器蜂鸣2秒*/ /*若答案输入错误,答案清零*/ void pd() { result=mul_ten*mul_one; answer=10*ans_ten+ans_one; Count1=0x00; Count2=0x00; buzzer=1; flag=0; TMOD=0x01; //定时器T0为方式1 TH0=0xfc; //设置定时器初值 TL0=0x66; EA=1; //开总中断 ET0=1; //开定时器T0中断 while(1) { if(answer==result) { TR0=1; //启动定时器T0 pd1=1; break; } else { clear_ans(); pd1=0; break; } } } /*输入答案子函数*/ /*按下key4按键,清零答案*/ /*第一次按下key3按键,输入答案个位*/ /*第二次按下key3按键,输入答案十位*/ /**第三次按下key3按键,答案输入完成,调用判断子函数*/ void answer_in() { P0=0xff; while(!pd1) { if(key4==0) break; if(key3==0) { delay(10); if(key3==0) { while(!key3); ans_flag=ans_flag+1; if(ans_flag>3) ans_flag=0; } } switch(ans_flag) { case 1: { if(key1==0) { delay(5); if(key1==0) { while(!key1); ans_one=ans_one+1; if(ans_one>9) ans_one=0; display2(); } } }break; case 2: { if(key1==0) { delay(5); if(key1==0) { while(!key1); ans_ten=ans_ten+1; if(ans_ten>9) ans_ten=0; display1(); } } }break; case 3: pd(); break; } } } /**主函数**/ void main() { buzzer=0; while(1) { if(key4==0) //按下key4按键,清零复位 { delay(5); if(key4==0) { while(!key4); clear_all(); } } else if(key2==0) { mul_end_flag=0; while(!mul_end_flag) { if(key4==0) break; else if(key2==0) { delay(5); while(!key2); mul_flag=mul_flag+1; if(mul_flag>3) mul_flag=0; } switch(mul_flag) { case 1: //第一次按下key2按键,输入第一个乘数 { if(key1==0) { delay(5); if(key1==0) { while(!key1); mul_one=mul_one+1; if(mul_one>9) mul_one=1; display4(); } } }break; case 2: //第二次按下key2按键,输入第二个乘数 { if(key1==0) { delay(5); if(key1==0) { while(!key1); mul_ten=mul_ten+1; if(mul_ten>9) mul_ten=1; display3(); } } }break; case 3: //第三次按下key2按键,乘数输入结束 mul_end_flag=1; break; } } //调用输入答案子函数 answer_in(); } } } /**定时器0中断子函数**/ void Time0(void) interrupt 1 using 0 { TH0=0xfc; //重赋初值 TL0=0x66; Count1++; if(Count1==200) { Count2++; if(Count2==10) { Count1=0; Count2=0; flag=~flag; TR0=0; //关定时器 } } if(!flag) { buzzer=~buzzer; } } 5.教师评语 课程设计 评 语 课程设计 成 绩 指导教师 (签字) 年 月 日 - 22 -
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传
相似文档                                   自信AI助手自信AI助手

当前位置:首页 > 教育专区 > 小学数学

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服