《单片机答辩倒计时器课程设计报告(共23页).doc》由会员分享,可在线阅读,更多相关《单片机答辩倒计时器课程设计报告(共23页).doc(23页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上单片机原理及应用课程设计报告专 业 电子信息工程班 级 姓 名 黄 升 平指导老师 周莹莲、廖亦凡二0一二 年 十二 月 二十五 日专心-专注-专业 课程设计任务书一、设计题目:答辩倒计时器二、设计要求 设计一个答辩倒计时器,用2位数码管显示剩余分钟,2位数码管显示剩余秒 ,复位后显示10.00表示设定10分钟,并可加减修改,按开始/取消按钮开始倒计时,再次按开始/取消按钮则复位,时间到则蜂鸣音提示。总体要求如下:1、方案论证,确定总体电路原理图。 2、元器件选择,设计PCB图(或用万能电路实验板搭线)。3、绘制程序流程图,编写汇编语言源程序(或C语言源程序)。4、安
2、装调试,实现倒计时器的基本功能。 三、设计报告内容1、写出设计方案(包括方案对比,方案确定),给出完整的电路原理图和设计程序流程图。 2、对所设计方案的实现进行全面分析。3、编程调试方法和程序清单。4、安装调试过程,出现的各种现象,总结经验和体会。 5、进一步完善的设想。目 录一、课程设计目的 1、巩固和加深单片机原理课程知识的理解和运用。 2、进一步提高学生单片机应用系统的设计能力。 3、培养学生综合分析问题、发现问题和解决问题的能力。二、课程设计题目描述和要求设计一个答辩倒计时器,用2位数码管显示剩余分钟,2位数码管显示剩余秒 ,复位后显示10.00表示设定10分钟,并可加减修改,按开始/
3、取消按钮开始倒计时,再次按开始/取消按钮则复位,时间到则蜂鸣音提示。总体要求如下:1、方案论证,确定总体电路原理图。 2、元器件选择,设计PCB图(或用万能电路实验板搭线)。3、绘制程序流程图,编写汇编语言源程序(或C语言源程序)。4、安装调试,实现倒计时器的基本功能。 三、课程设计报告内容3.1元器件清单及所用仪器设备 表1-1 设备清单设备名称单组数量数量功能数字万用表可共用1台5V直流稳压电源可用实验箱代、可共用1台ISP下载线可共用4根计算机单片机实验室均可用40台装Keil开发软件和ISP51下载软件 元器件名称规格/型号单组数量金属膜电阻1K、1/4W1金属膜电阻10K、1/4W5
4、电阻排200*8(SIP9)1瓷片电容30pF2独石电容0.1F/63V3电解电容10F/16V2蜂鸣器10,直流5V1三极管9013 1石英晶振6MHz(矮封装)1集成电路AT89S51 DIP4017407 DIP141IC插座40PIN DIP114PIN DIP1数码管4位一体、红光、共阴极0.5”1接插件IDC10(与ISP下载线接口) DC3-10P1套按键国产欧姆龙轻触按键3万能电路板17cm*22cm1块导线0.3mm2单股导线4m焊锡丝1.0mm2m松香 表1-2 元器件清单 工具名称单组数量镊 子1把电铬铁1支铬铁架1个吸锡枪1把斜口钳1把表1-3 工具清单3.2 硬件电路
5、 倒计时器硬件电路原理图如下图所示。 图1 电路原理图3.2.1 复位电路复位电路产生复位信号,复位信号送入 RST 后还要送至片内的施密特触发器,由片内复位电路在每个机器周器的 S5P2 时刻对触发器输出采样信号,然后由内部复位电路产生复位操作所要的信号。一般的复位电路可分为上电自动复位和按键复位,我们在此选用的是上电复位。上电自动复位原理:RST 引脚是复位信号的输入端,只要高电平的复位信号持续两个机器周期以上的有效时间,就可以使单片机上电复位。上电自动复位是通过电容充电实现的,上电瞬间,RST 端 电位与Vcc 相同,随充电电流的减少,RST 的电位逐渐下降,直到复位信号无效。按键复位在
6、此不在作过多的介绍,其原理和上电复位是相同的。但其采用的是脉冲复位电路和电平复位电路两种。3.2.2 晶振电路晶振与单片机的脚XTAL0和脚XTAL1构成的振荡电路中会产生偕波(也就是不希望存在的其他频率的波),这个波对电路的影响不大,但会降低电路的时钟振荡器的稳定性。为了电路的稳定性起见,ATMEL公司只是建议在晶振的两引脚处接入两个10pf-50pf的瓷片电容接地来削减偕波对电路的稳定性的影响,所以晶振所配的电容在10pf-50pf之间都可以的。但是主流是接入两个30pf的瓷片电容,此次电路用30PF。3.2.3 单片机最小系统 最小系统就是单片机在发挥具体测控功能时所必须的组成部分。如下
7、图所示为最小系统方框图: 图2 单片机最小系统方框图 3.2.4 硬件流程图倒计时器硬件电路流程图如下图所示。图3 倒计时器硬件电路流程图3.3 源程序设计3.3.1 程序清单初始化:uchar Count = 0;uint n=0;uint m=0; uchar min = 10 ;uchar sec = 0 ; uchar table10 = 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f; /数码管的段码编码 (0-9)uchar table_d10 = 0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0
8、xff,0xef; /带点数码管的段码编码 (0-9)sbit BELL = P12; /设置P1.2口,为控制蜂鸣器发声的引脚sbit KEY1 = P32; /设置P3.2 P3.3 P3.4口为按键引脚sbit KEY2 = P33;sbit KEY3 = P34;函数名:void Delay(uint del) /延时子程序,延时时间为 1ms * delvoid Time0_Init() /初始化定时器 11.0592M 50msvoid time0() interrupt 1 /中断void display(void) /数码管每位动态显示void DisLED_1()/复位函数v
9、oid DisLED_2() /时间增加void DisLED_3() /时间减少void DisLED_4() / 时间为零的显示void KEY() /检测按键void main() /主函数主函数:void main() /主函数Time0_Init(); while(1) display(); KEY(); if(min=0 & sec=0)DisLED_4(); /调用数码管显示代码m=0;while(100-m)display();BELL = 0;Delay(1); /延时1毫秒BELL = 1;Delay(1); /延时1毫秒m+; TR0 = 0; while(KEY1!=0
10、) min = 0; sec = 0; display(); 3.3.2 程序流程图排阻单片机 程序下载口数码管驱动电路蜂鸣器外围电路 图4 倒计时器主程序流程图四、设计过程4.1实践步骤1、根据实验要求,完成电路原理图和应用程序流程图。2、编写汇编语言(或C语言)源程序。3、根据所设计的原理图,完成电路板的焊接,在进行测试。4、硬件软件综合调试,如果不能实行,在分析哪里出了问题,纠正问题在去测试,直到测试完成,完善其设计功能。4.2实践标准1、完成电路的制作,排版与焊接,并进行测量是否能正常的运行; 2、完成程序的设计,并进行程序调试是否出现错误; 3、硬件与软件结合进行调试看是否能达到课程
11、设计目的; 4、最后实现其设计要求和功能,装配工艺美观,电路运行稳定、可靠。4.3系统调试4.3.1 硬件调试在硬件调试时,先有万用表检查印制电路的焊接情况,检查是否有虚焊,是否有短路。在检查无误之后通电检查LED数码管的显示。总体电路正常,达到题目的要求。实际电路下图: 图5 实际电路图 完成了硬件的设计、制作和软件编程后,要使系统能够按设计意图正常运作,必须进行系统调试。系统调试包括软件调试和硬件调试。不过,作为一个小计算机系统,其运行是软硬件相结合的,因此,软硬件的调试也是不可能绝对分开的,硬件的调试常常需要利用调试软件,软件的调试也可能需要对硬件的测试和控制来进行。1、脱机检查。用万用
12、表逐步按照电路原理图检查印制电路中所有器件的各引脚,尤其是电源的连接是否正确:检查数据总线、地址总线和控制总线是否有短路等故障,顺序是否正确;检查各开关按键是否能正常开关,是否连接正常;各限流电阻是否短路等内容。为了保护芯片,应先对各IC电位进行检查,确定其无误后再插入芯片检查。2、联机调试。暂时拔掉89S51芯片,将仿真器的引脚插入89S51的芯片插座进行调试,检验键盘/显示接口电路是否满足要求设计。可以通过一些简单的测软件来查看接口工作是否正常。例如,我们可以设计一个软件,使89S51的P1、P2口输出55H或AAH,同时读P3口,运行后用万用表检查相应端口电平是否一高一低,在仿真器中检查
13、读入的P3口8位是否为1,如果正常则说明89S51正常工作。还可以设计一个使所有LED全显示“8.”的静态显示程序来检验LED的好坏。如果运行测试结果与预期不符,很容易根据故障现象判断故障原因并采取针对性措施排除故障。4.3.2 软件调试 软件调试的任务是利用开发工具进行在线仿真调试,发现和纠正程序错误,同时也能发现硬件故障。程序的调试应一个模块一个模块地进行,首先单独调试各功能子程序,检验程序是否能够实现预期的功能,接口电路的控制是否正常等;最后逐步将各子程序连接起来进行联调。联调需要注意的是,各程序模块间能否正常传递参数,特别要注意各子程序的现场保护与恢复。调试的基本步骤如下: 1、用仿真
14、器修改显示缓冲区内容,屏蔽拆字程序,调试动态扫描显示功能。例如将DISP0DISP3单元置为“0123”,应能在LED上从左到右显示“0123”。若显示不正确,可在显示子程序相应设置断点调试检查,然后用仿真器修改计时缓冲区内容,调试显示模块,例如,将MIN、SEC单元置为“0123”检查是否能正确显示“01.23”,若显示不正确,应在显示子程序相应位置设置断点,反复调试检验直至完全正确。2、运行主程序调试时模块,不按下任何键,检查是否从由10.00开始正确计时,若不能正确计时则应在定时器中断服务子程序中设置断点,检查MIN、SEC单元是否随断点运动而变化。然后屏蔽缓冲区初始化部分,用仿真器修改
15、计时缓冲区内容为40:33.5,运行主程序,检验能否正确进位。3、调试键盘模块扫描,先用延时10ms子程序代替显示子程序延时消抖,在求取键号后设置断点,中断后观察A累加器中的键号是否正确,然后恢复用显示子程序延时消抖,检验与显示模块能否正常连接。4、调试时间设置定时模块TIMSEF。首先屏蔽中断子程序,单独调试键盘设置模块CKECKEY,观察显示缓冲区DISP0DISP3单元的内容是否随键入的键号改变,以及键号能否在LED上显示。然后屏蔽CKECKEY子程序,分别将R1设置为时间缓冲区和闹钟值寄存区的首地址,修改显示缓冲区内容,程序运行后查看时间设置缓冲区MIN、SEC单元和闹钟值寄存区AMI
16、N、ASEC单元内容是否正确。最后联调TIMSET模块。 5、运行主程序联调,检查能否用键盘修改定时时间,能否正确计时、启闭。五、设计报告总结1、设计方案:根据设计要求,设计好硬件电路和软件程序。利用电路模拟仿真软件对设计好的电路进行模拟仿真,以确保硬件电路能够正常工作。用已经准备好的电子元器件,焊接电路。把设计好的软件程序嵌入到已经焊接好的硬件电路中,进行调试。 2、对所设计方案的实现进行全面分析 该硬件电路的核心部分是AT89S51单片机,对电路进行各方面控制和计算,用一个4位8段的共阴数码管显示,用7407作为缓冲级,提高输出电路驱动能力,使数码管能正常显示。用一个9013三极管驱动蜂鸣
17、器,当电路上电和计时时间到时响一秒提示时间到。用一个6M石英晶振和2个30pF的电容为AT89S51芯片提供时钟频率,2个30pF电容主要是为了方便晶振起振。K1、K2、K3、3个开关分别用于加时间、减时间、复位和开始。用若干电阻作为上拉电阻,增大电路输出电流。3、编程调试方法 编程与调试是C语言和Keil软件相结合的。C语言是一种国际上广泛流行的、很有发展前途的计算机高级语言。它适合作为系统描述语言,即可用来编写系统软件,也可用来编写应用软件。 Keil软件是一种目前用得比较广泛的一款单片机编程软件,它支持C和 汇编的编译,并可生成 HEX 文件,还可进行代码的软硬件仿真软件。 4、安装调试
18、过程,出现的各种现象硬件:电路在接电源后,显示器中有一个数码管不亮。主要原因:数码管的一根连接线没焊好,导致数码管不亮。软件:程序烧录到板子上后蜂鸣器一直响。主要原因:没有对BELL至低电平,只需在主程序中写上“BELL=0”就行了。程序烧录到板子上后数码管显示不稳定,亮度不一。主要原因:延时时间不准确,经过软件计算,对定时器赋合适的初值即可。六、总结经验和体会在这次的单片机程序课程设计中,学到了关于单片机的很多东西,单片机具有软硬结合,体积小,可以很容易嵌入到各种应用系统中,单片机为核心的嵌入式控制系统在工业检测与控制、仪器仪表、消费类电子产品、通信、武器装备、各种终端及计算机外部设备、汽车
19、电子设备和分布式多机系统领域中得到了广泛了应用单片机是我们的这个专业中很重要的一门课程,同时也是一门比较难学的课程,刚开始学习单片机的时候,觉得很难,特别是在学习单片机指令系统和单片机汇编语言程序设计这两章的时候,都听不懂,但是每节课都会认真听课,认真做笔记,不过后来在自己的摸索中慢慢的有点懂了,其实单片机主要是难在写程序和写代码,程序主要是用C语言编程,有时候脑子里没有一点思绪,什么都想不出来,所以,如果想要把单片机学好的话,首先就要把C语言学好,单片机主要是建立在C语言的基础上的,不过单片机也可以用汇编语言编译。我相信在我不断的摸索中,我一定会把它给搞懂的。在这次的课程设计中,我很感谢我们
20、的指导老师周莹莲,廖亦凡老师,还有我的组员,他们让我学了很多东西,让我知道了团队合作有多么的重要,在做硬件的过程中,也遇到了很多困难,比如说电路的连接线很复杂,我和另一个组员就会想一下该怎么布线,所以每一个步骤都要做的很细心,我们在连接线路的过程中,我们是没连接一根线都会用万用表测量一次,以免没有导通,我们在做的过程中还会了解每一个元器件能实现什么样的功能,这次实践让我对单片机有了更深一步的了解,让我们真正做到了理论联系实践,把我们所学的知识都运用到实践中去,这样就能把单片机学的更好。虽然我们的单片机课程结束了,我们的课程设计也顺利地做完了,但是我对学单片机的热情只增不减,还是想要更深一步的去
21、了解单片机,我永远也不会忘记老师对我的教悔,让我受益终身。七、进一步完善的设想A、新增一段程序,对硬件的按键进行防抖,使计时器计时更加的精确;B、对于硬件的导线线路,尽量在线路比较短的地方不使用导线,使用焊锡进行导通,这样就会比较的美观;C、硬件元器件的排版要进行比较的规律,尽量做到导线排版的时候不会出现重叠的现象;D、计算每一条语句的时间,提高执行的定时器的精度。八、参考书目1 赵伟军,Protel99se教程,北京,人民邮电出版社,1996年2 谭浩强,C程序设计教程,北京,清华大学出版社,2007年3 张毅刚,单片机原理及应用,北京,高等教育出版社,2010年 4 胡汉才,单片机原理及系
22、统设计,北京,清华大学出版社,2002年 5 沈红卫,单片机应用系统设计实例与分析,北京,北京航空航天大学出版社,2003年 附录一:成品效果图 图六 成品效果图附录二:倒计时器源程序(C语言) #include#define uchar unsigned char#define uint unsigned intuchar Count = 0;uint n; uint fs=0;sbit BELL = P10; /设置P1.0口,为控制蜂鸣器发声的引脚sbit K1 = P32;sbit K2 = P33;sbit K3 = P35;uchar min = 10 ;uchar sec = 0
23、 ;uchar ws4 = 0xfe,0xfd,0xfb,0xf7; uchar table10 = 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f; /数码管的段码编码 (0-9)uchar table_d10 = 0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef; /带点数码管的段码编码 (0-9)void delay(void) /误差 0us unsigned char a,b; for(b=1;b0;b-) for(a=7;a0;a-);void Delay(uint del) /
24、延时子程序,延时时间为 1ms * deluint x,j; for(j=0;jdel;j+)for(x=0;x=148;x+); void beep()/产生1KHZ频率声音的函数unsigned char k=0; while(100-k) BELL=1;Delay(1);BELL=0;Delay(1);k+; void Time0_Init() /初始化定时器 11.0592M 50ms EA = 1; TMOD = 0x01; TH0= 0x9E; TL0=0x58; TR0 = 0; ET0 = 1;void time0() interrupt 1 /*定时器0中断程序*/ TH0=
25、 0x9E; TL0=0x58; if (Count = 20) Count = 0;if(sec = 0) if(min = 0) min = 10; else min-; sec = 59;else sec-; else Count+;if(min=0&sec=0) /*调用蜂鸣器程序*/ beep(); min=0; sec=0;TR0=0; void display(void)/数码管每位动态显示 P2 = 0xfe; P0 = tablemin/10; Delay(2); P2 = 0xfd; P0 = table_dmin%10; Delay(2); P2 = 0xfb; P0 =
26、 tablesec/10; Delay(2); P2 = 0xf7; P0 = tablesec%10; Delay(2); P2=0XF0; delay(); void key1() /按键功能函数 if(K1=0|K2=0|K3=0) /判断是否有按键按下 display(); /*调用显示函数*/if(K3=0) if(K3=0) if(fs=0) /*如果K3按下判定如果fs为0,开始计时*/ TR0 = 1; else /*如果fs为1,计时器复位*/ min=10;sec=0;TR0=0; while(!K3) ;/*按键消抖,每按一次只执行一次*/ Delay(10); whil
27、e(!K3) ; fs=(!fs); else if (K1=0) /*按键K1判定函数*/ if(K1=0) if(TR0!=1) min+; if(min=100) min=0; while(!K1); 、/*按键K1消抖*/ delay(); while(!K1); else /*按键K2判定函数*/ display(); /*调用显示函数*/if(K2=0) if(TR0!=1) min-; if(min=-1) min=99; while(!K2); /*按键K2消抖*/ delay(); while(!K2); void main()/主函数 BELL = 0; Time0_Init(); while(1) display();key1(); if(K3=0) key1();