1、目录1课程设计的目的和意义21.1设计目的21.2设计意义22系统方案设计及确定33系统硬件设计43.1AT89S51最小系统设计43.1.1时钟电路硬件设计43.1.2复位电路硬件设计43.2键盘电路硬件设计53.3显示电路硬件设计63.4蜂鸣器电路硬件设计64系统软件设计74.1系统主程序设计74.2定时器设计84.3秒表设计94.4闹钟设计94.5其他主要子程序设计105系统调试116总结12参考文献13附录14附录一 程序清单14附录二 系统硬件原理图141课程设计的目的和意义1.1设计目的灵活运用单片机的基础知识,依据课程设计内容,能够完成从硬件电路图设计,到PCB制版,再到软件编程
2、及系统调试实现系统功能,完成课程设计,加深对单片机基础知识的理解,并灵活运用,将各门知识综合应用。能够上网查询器件资料,培养对新知识新技术的独立的学习能力和应用能力。独立完成一个小的系统设计,从硬件设计到软件设计,增强分析问题、解决问题的能力,为日后的毕业设计及科研工作奠定良好的基础。1.2设计意义单片机课程设计过程中,我们通过查阅资料、硬件设计、程序设计、安装调试等环节,完成了一个涉及89S51单片机多种资源应用并具有综合功能的小系统目标板的设计与编程应用。使我们不但能够将课堂上学到的理论知识与实际应用结合起来,而且能够对电子电路、电子元器件、原理图绘制等方面的知识进一步加深认识,同时在软件
3、编程、排错调试、焊接技术、相关软件及仪器设备的使用技能等方面得到较全面的锻炼和提高。使我们增进对单片机的感性认识,加深对单片机理论方面的理解。使我们了解和掌握单片机应用系统的软硬件设计过程、方法及实现,强化单片机应用电路的设计与分析能力。提高我们在单片机应用方面的实践技能和科学作风;培育学生综合运用理论知识解决问题的能力,实现理论结合实际,学以致用的原则。2系统方案设计及确定本次课程设计,要求用单片机及6位LED数码管显示时、分、秒,以24时计时方式运行,能整点提醒(短蜂鸣,次数代表整点时间),使用按键开关可实现时、分调整,秒表(或闹钟)/时钟功能转换,以及实现省电(关闭显示)功能。1时钟功能
4、 利用单片机片内定时器(如T0)产生1s计时,自行设定时钟计数单元地址,包括秒单元、分单元、时单元,最大计数值为23时59分59秒。用6位LED数码管显示时、分、秒,以24时计时方式运行; 使用按键开关可实现时、分调整,可增加“熄灭符”用于时间调整时的闪烁功能; 能整点提醒(短蜂鸣,次数代表整点时间); 可通过按键使系统进入省电状态(数码管不亮,时钟不停)。2秒表功能 能通过按键实现秒表/时钟功能之间的转换; 利用单片机内部定时器(如T1)实现秒表的计时,自行设定秒表计数单元地址,包括10ms单元、秒单元、分单元, 通过6位LED数码管显示,最大计数值为99分59.99秒。 可通过按键实现秒表
5、的暂停、清零、启动。 3闹钟功能 能通过按键实现闹钟/时钟功能之间的转换; 可通过按键设定闹钟时间,在定时闹铃时精确到分,可通过6位LED数码管显示闹钟设定时间。 可通过按键实现闹铃有效、无效,以及在设定闹钟后取消闹时功能。在闹铃时,可通过按键开关使蜂鸣停止。4系统设计方案框图如下:图2-1系统设计方案框图3系统硬件设计3.1AT89S51最小系统设计单片机最小系统单片机,或者称为最小应用系统,是指用最少的元件组成的单片机可以工作的系统.对51系列单片机来说,最小系统一般应该包括:单片机、晶振电路、复位电路.下面给出一个51单片机的最小系统电路图:图3-1 51单片机最小系统原理图3.1.1时
6、钟电路硬件设计时钟电路是计算机最核心的部分,它控制着计算机的工作。AT 89 S51单片机内部有一个高增益反相放大器,用于构成振荡器。反相放大器的输入端为XTAL1,输出端为XTAL2,分别是单片机的19脚和18脚。在XTAL1和XTAL2两端跨接石英晶体及两个电容就可以构成稳定的自激振荡器。石英晶振起振后要能在XTAL2线上输出一个3V左右的正弦波,使片内的OCS电路按石英晶振相同频率自激震荡。通常,OCS的输出时钟频率fosc为0.5MHZ16MHZ,典型值为12MHZ电容器C1和C2通常取30pF左右,对震荡频率有微调作用。调节它们可以达到微调震荡周期fosc的目的。时钟电路如下:图3-
7、2 时钟电路电路图3.1.2复位电路硬件设计单片机的RST管脚为主机提供一个外部复位信号输入端口。复位信号是高电平有效,高电平有效的持续时间应为2个机器周期以上。单片机的复位方式有上电自动复位和手工复位两种。图4-2所示是51系列单片机常用的上电复位电路,只要Vcc上升时间不超过1ms,它们都能很好地工作。复位以后,单片机内各部件恢复到初始状态。电阻电容器件的参考值:R1=200,R2=1K,C3=22F。RET按键可以选择专门的复位按键,也可以选择轻触开关。复位电路如下图3-3 复位电路电路图3.2键盘电路硬件设计单片机中常见的键盘有独立式键盘和矩阵式键盘,独立式键盘适用于实现功能较少的场合
8、、矩阵式键盘适用于功能复杂的场合。本次课程设计,采用独立式键盘即可。键盘电路如下:图3-4 键盘电路电路图上拉电阻保证按键释放时,输入检测线上有稳定的高电平。当某一按键按下时,对应的检测线就变成了低电平,与其他按键相连的检测线仍为高电平,只需读入I/O输入线的状态,判别哪一条I/O输入线为低电平,很容易识别哪个键被按下。键的闭合与否,输出电压上就是呈现高电平或低电平。高电平,表示键断开,低电平则表示键闭合,通过对电平的高低状态的检测,可确认按键按下以及按键释放与否。为了确保对一次按键动作只确认一次按键有效,必须消除抖动的影响,去抖有硬件去抖和软件去抖,本次设计采用软件去抖。3.3显示电路硬件设
9、计本次课程设计,采用LED数码管作为显示装置。LED数码管有共阴极、共阳极两种结构,本次采用共阳极数码管。共阳极LED数码管的发光二极管的阳极连接在一起,公共阳极接正电压,当某个发光二极管的阴极接低电平时,发光二极管被点亮,相应的段被显示。8段共阳极LED段码如下:表3-1 8段共阳极LED段码表显示字符012345678段码C0HF9HA4HB0H99H92H82HF8H80H显示字符9ABCDEF全灭全亮段码90H88H83HC6HA1H86H8EHFFH00HLED数码管有静态显示和动态显示两种显示方式。静态显示方式,数码管亮度高、软件编程简单,但是需要占用大量的I/O口,一般在多位显示
10、时不采用此种方法。动态显示方式,数码管亮度稍低、软件编程复杂,但是占用的I/O口少,在显示多位数字的时候适合采用此种方法。考虑到本次课程设计需要显示六位数字,故采用动态显示方式。LED数码管段选、位选驱动电路均采用DM74LS244作为驱动芯片。3.4蜂鸣器电路硬件设计蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。蜂鸣器的工作原理是,接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场。振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。本次课程设计中,由于单片机
11、的I/O口驱动能力不够让蜂鸣器发出声音,所以我们通过三极管放大驱动电流,从而可以让蜂鸣器发出声音。蜂鸣器电路如下:图3-5 蜂鸣器电路电路图4系统软件设计4.1系统主程序设计程序中,采用按键1作为主功能切换键,按键2、按键3、按键4作为子功能控制键。在主程序中,开始即进入定时器子程序,显示当前时间,并同时对按键1进行扫描。如果按键1第一次被按下,则进入调整时间子程序,并同时对按键2 、按键3、按键4进行扫描,此时按键2 、按键3、按键4分别作为调整时、分、秒按钮使用;如果按键1第二次被按下,则进入秒表子程序,并同时对按键2 、按键3、按键4进行扫描,按键2 、按键3、按键4分作为秒表启动、暂停
12、、停止并清理按钮使用;如果按键1第三次被按下,则进入闹钟子程序,并同时对按键2 、按键3、按键4进行扫描,按键2 、按键3、按键4分作为闹钟的启动/关闭、调整时、调整分按钮使用;如果按键1第四次被按下,则进入节能子程序,此时将不对按键2 、按键3、按键4分进行扫描;如果按键1第五次被按下,则重新回到定时器子程序,如此循环。主程序流程图4.2定时器设计在定时器子程序当中,采用定时器T0产生定时中断。定时器T0工作于方式2,初值为TH0=0x9C,TL0=0x9C,时钟电路采用12MHZ晶振,所以每0.1ms产生一次中断,再在中断中对时间进位进行判断处理,使之产生较为精准的定时。定时器子程序4.3
13、秒表设计在秒表子程序当中,采用定时器T1产生定时中断。定时器T1同意工作于方式2,初值为TH0=0x9C,TL0=0x9C,时钟电路采用12MHZ晶振,所以每0.1ms产生一次中断,再在中断中对时间进位进行判断处理,使之产生较为精准的定时。秒表子程序4.4闹钟设计在闹钟子程序里,按键2被按下奇数次时,闹钟打开并在第一位数码管上显示标志位;按键2被按下偶数次时,闹钟关闭并熄灭第一位数码管上的标志位。按下按键3,则定时时间的小时位加一;按下按键4,则定时时间的分钟位加一。闹钟子程序4.5其他主要子程序设计在时钟设置子程序中,按键2被按下,则当前时间的小时位加一;按键3被按下,则当前时间的分钟位加一
14、;按键4被按下,则当前时间的秒位被清零。时钟设置子程序当进入节能子程序时,数码管将全部被熄灭,此时按键2、按键3、按键4即使被按下也不采取任何操作。节能子程序其他说明:当时间的小时位进一时,蜂鸣器将响起,响的“嘀”次数等于当前时间小时位的值。当当前时间等于闹钟定时时间时,蜂鸣器将不断响起“嘀”声,按下按键1后,“嘀”声停止。5系统调试本次课程设计采用伟福仿真器进行程序的调试,下面介绍伟福仿真器的调试及使用。进入WAVE软件后,第一步要进行仿真器设置,在仿真器选项卡中,仿真器为选择“E6000/S”,仿真头选择“POD-H8X5X”,CPU选择“89C51RX”; 在目标文件选项卡中,将所有选项
15、前均打钩,;在通讯设置选项卡中,将“使用伟福软件模拟器”的“”勾掉,然后选择“COM1”口,点击“测试串行口”,测试成功后,就完成了所有的仿真器设置。第二步,开始创建项目工程,在C盘根目录下创建“Project”文件夹,双击打开,再创建“program . c”文件。注意,这里“Project”文件夹为工程项目所存放的文件夹,文件夹名必须是英文,汉字不能用。 “program . c”文件为程序源文件,若是用汇编语言,则相应的改为“program . asm”文件。这里文件夹名和原文件名可以是任意英文字符。点击菜单栏“文件(F)”“新建项目”找到刚才创建的源文件(以C语言源文件为例),点击“打
16、开”,然后键入工程项目文件名字(以project为例,项目文件名可以任意),并点击“保存”保存。 双击左侧源文件“program . c”,此时即可开始编写程序了。(WAVE6000集成开发软件是基于C语言内核的,仅支持“ /* */ ”注释方式,不支持“ / ”注释方式)。最后介绍程序的编译及执行,点击菜单栏“项目”“编译”,无语法错误,编译通过。点击菜单栏上“执行”“全速执行”,进行硬件仿真调试。按停止按钮则退出调试状态。本次课程设计,我主要是参考了郭天祥老师的一些例子程序,从而逐步掌握了有关单片机数码管动态显示、按键的扫描及去抖、时钟定时赋值等一些内容。然后根据老师的原理图,参照例子程序
17、,利用C语言进行编程。程序调试过程中难免出现各种各样的问题,通过请教老师、网络查询、同学之间相互帮助,都逐一得到了解决。6总结为期三周的课程设计就这样结束了,通过这次课程设计,我们不仅对单片机的学习有了更多的认识和理解,而且又填补了很多以前的知识漏洞。本次课程设计,收获最多的当然是单片机方面,但是同时我们又一次学习了C语言、Protel制图等,熟悉掌握了WAVE6000的使用。课程设计是培养我们综合运用所学知识,发现、提出、分析和解决实际问题,锻炼实践能力的重要环节,是对我们实际工作能力的具体训练和考察过程. 回顾起此次课程设计,至今我仍感慨颇多。通过这次课程设计使我懂得了理论与实际相结合是很
18、重要的,只有理论知识是远远不够的,唯有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正提高我们自己的实际动手能力和独立思考的能力。在设计的过程中,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的很多的不足,自己知识的很多漏洞,对以前所学过的知识理解得不够深刻,掌握得不够牢固,看到了自己基础知识还是不够扎实,实践经验还是比较缺乏,理论联系实际的能力还待急需提高。通过这次课程设计之后,一定把以前所学过的知识重新温故。在这个过程中,我真切的感到了,我又知道了很多,同时也掌握了很多以后在工作和生活中能真正用到的很多东西。但是我不会因此而骄傲,相反以后我将会更加虚心,因为我知道这只
19、是个简单的开始,以后还有很多的路要走。在此,再次感谢带领我们课程设计的王老师、杜老师、张老师和蔡老师,正是有了老师们的细心教导、耐心指导、苦心监督,我们才能够顺利完成各项学习任务、收获真知识、锻炼真本领。参考文献【1】单片机原理与接口技术M胡汉才.清华大学出版社【2】MCS-51系列单片机原理及应用M. 王瑾、杜波等.中国电力出版社【3】新概念51单片机C语言教程M郭天祥.电子工业出版社【4】跟我学用单片机M. 肖洪兵. 北京航空航天大学出版社【5】单片机实验与实践教程M. 夏继强. 北京航空航天大学出版社,【6】Protel DXP 电路设计技术M. 孙玉军. 冶金工业出版社【7】单片机应用
20、设计200 例.下(第一版)M. 张洪润. 北京航空航天大学出版社【8】C语言程序设计M.杨忠宝、董晓明. 北京大学出版社附录附录一 程序清单/*头文件*/#include#define uint unsigned int#define uchar unsigned char/*定义按键*/sbit key1=P10;sbit key2=P11;sbit key3=P12;sbit key4=P13;/*定义蜂鸣器*/sbit bell=P17;/*定义数码管位控*/sbit LED1=P25;sbit LED2=P24;sbit LED3=P23;sbit LED4=P22;sbit LED
21、5=P21;sbit LED6=P20;/*定义变量*/uchar miao,fen,shi,shm,sec,min,nshi,nfen;uchar d1,d2,d3,d4,d5,d6,m1,m2,m3,m4,m5,m6,n1,n2,n3,n4;uint num,num1,num2,num3,ge,ss;/*共阴极段选码(0-9)*/uchar code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;/*延时函数*/void delay(uint x)uint i,j;for(i=80;i0;i-)for(j=x;j0;j-);
22、/*时钟显示函数*/void display()d1=shi/10;/*高低位分离*/d2=shi%10;d3=fen/10;d4=fen%10;d5=miao/10;d6=miao%10;LED1=1;/*时高位*/P0=tabled1;delay(1);LED1=0;LED2=1;/*时低位*/P0=tabled2;delay(1);LED2=0;LED2=1;/*时低位小数点显示*/P0=0x80;delay(1);LED2=0;LED3=1;/*分高位*/P0=tabled3;delay(1);LED3=0;LED4=1;/*分低位*/P0=tabled4;delay(1);LED4=
23、0;LED4=1;/*分低位小数点显示*/P0=0x80;delay(1);LED4=0;LED5=1;/*秒高位*/P0=tabled5;delay(1);LED5=0;LED6=1;/*秒低位*/P0=tabled6;delay(1);LED6=0;/*时钟调整函数*/void tiaozheng()if(key2=0)/*时+*/delay(10);if(key2=0)while(!key2);shi+;delay(20);if(shi=24)shi=0;if(key3=0)/*分+*/delay(10);if(key3=0)while(!key3);fen+;delay(20);if(
24、fen=60)fen=0;if(key4=0)/*秒清零*/delay(10);if(key4=0)miao=0;/*时钟调整数码管闪烁显示函数*/void display1()d1=shi/10;d2=shi%10;d3=fen/10;d4=fen%10;d5=miao/10;d6=miao%10;if(ss=1)LED1=1;/*时高位*/P0=tabled1;delay(1);LED1=0;LED2=1;/*时低位*/P0=tabled2;delay(1);LED2=0;LED2=1;/*时低位小数点显示*/P0=0x80;delay(1);LED2=0;LED3=1;/*分高位*/P0
25、=tabled3;delay(1);LED3=0;LED4=1;/*分低位*/P0=tabled4;delay(1);LED4=0;LED4=1;/*分低位小数点显示*/P0=0x80;delay(1);LED4=0;LED5=1;/*秒高位*/P0=tabled5;delay(1);LED5=0;LED6=1;/*秒低位*/P0=tabled6;delay(1);LED6=0;/*整点报时功能函数*/void baoshi()if(fen=59)&(miao=59)/*整点报时功能*/uchar bs;bs=shi;bs+;while(bs0)/*报时次数等于小时数*/bs-;bell=0;
26、delay(100);bell=1;delay(100);/*秒表功能控制函数*/void miaobiao()if(key2=0)/*秒表开始计时*/delay(10);if(key2=0)while(!key2);TR1=1;if(key3=0)/*秒表暂停*/delay(10);if(key3=0)while(!key3);TR1=0;if(key4=0)/*秒表清零*/delay(10);if(key4=0)while(!key4); TR1=0;shm=0;sec=0;min=0; /*秒表显示函数*/void display2()m1=min/10;m2=min%10;m3=sec
27、/10;m4=sec%10;m5=shm/10;m6=shm%10;LED1=1;/*分高位*/P0=tablem1;delay(1);LED1=0;LED2=1;/*分低位*/P0=tablem2;delay(1);LED2=0;LED2=1;/*分低位小数点显示*/P0=0x80;delay(1);LED2=0;LED3=1;/*秒高位*/P0=tablem3;delay(1);LED3=0;LED4=1;/*秒低位*/P0=tablem4;delay(1);LED4=0;LED4=1;/*秒低位小数点显示*/P0=0x80;delay(1);LED4=0; LED5=1;/*10ms高位
28、*/P0=tablem5;delay(1);LED5=0;LED6=1;/*10ms低位*/P0=tablem6;delay(1);LED6=0;/*闹钟设置功能函数*/void naozhong()if(key2=0)/*设置闹钟的开关*/delay(10);if(key2=0)while(!key2);num2+;if(num2=3)num2=1;/*闹钟打开*/if(key3=0)/*定点小时+*/delay(10);if(key3=0)while(!key3);nshi+;if(nshi=24)nshi=0;if(key4=0)/*定点分钟+*/delay(10);if(key4=0)
29、while(!key4);nfen+;if(nfen=60)nfen=0;/*闹钟显示函数*/void display3()n1=nshi/10;n2=nshi%10;n3=nfen/10;n4=nfen%10;if(num2=1)/*第一位全显示表示闹钟打开*/LED1=1;P0=0xff;delay(1);LED1=0;if(num2=2)/*第一位全灭表示闹钟关闭*/LED1=1;P0=0x00;delay(1);LED1=0;LED3=1;/*小时高位*/P0=tablen1;delay(1);LED3=0;LED4=1;/*小时低位*/P0=tablen2;delay(1);LED4
30、=0;LED4=1;/*小时低位小数点显示*/P0=0x80;delay(1);LED4=0;LED5=1;/*分钟高位*/P0=tablen3;delay(1);LED5=0;LED6=1;/*分钟低位*/P0=tablen4;delay(1);LED6=0;/*到点提醒功能函数*/void tixing()if(num2=1)&(nshi=shi)&(nfen=fen)/*闹钟*/while(num2=1)/*按键key1控制蜂鸣器停止,并关闭闹钟*/bell=0;delay(100);bell=1;delay(100);if(key1=0)delay(10);if(key1=0)whil
31、e(!key1);num2=2;/*键盘扫描实现功能切换函数*/void key()if(key1=0)/*对key1进行计数,从而判断并切换功能*/delay(10);if(key1=0)while(!key1);ge+;if(ge=6)ge=1;if(ge=1)/*时间功能函数*/display();/*时间显示函数*/if(ge=2)/*时钟调整函数*/tiaozheng();/*调整时钟*/display1();/*显示当前时间并闪烁*/if(ge=3)/*秒表功能函数*/miaobiao();/*秒表功能控制函数*/display2();/*秒表显示函数*/if(ge=4)/*闹钟功
32、能函数*/naozhong();/*闹钟定时设置*/display3();/*闹钟显示*/if(ge=5)/*节能功能函数*/P2=0x00;/*关闭所有数码管*/*初始化函数*/void init()TMOD=0x22;/*初始化(工作方式2:自动重装初值)*/TH0=0x9c;/*0.1ms定时*/TL0=0x9c;TH1=0x9c;/*0.1ms定时*/TL1=0x9c;EA=1;/*开中断*/ET0=1;TR0=1;ET1=1; IT0=1;num2=2;ge=1;ss=1;/*主函数*/void main()init();while(1)key();/*按键扫描进行功能切换*/bao
33、shi();/*整点报时*/tixing();/*闹钟提醒*/*T0中断时间处理函数*/void timer0() interrupt 1num+;num3+;if(num3=5000)/*0.5s到,时钟调整过程中闪烁一次*/ss=ss;num3=0;if(num=10000)/*秒进位判断*/num=0;miao+;if(miao=60)/*分进位判断*/miao=0;fen+;if(fen=60)/*时进位判断*/fen=0;shi+;if(shi=24)shi=0;/*T1中断秒表处理函数*/void timer1() interrupt 3num1+;if(num1=100)/*10ms进位判断*/num1=0;shm+;if(shm=100)/*秒进位判断*/shm=0;sec+;if(sec=60)/*分进位判断*/sec=0;min+;if(min=100)min=0;附录二 系统硬件原理图
©2010-2024 宁波自信网络信息技术有限公司 版权所有
客服电话:4008-655-100 投诉/维权电话:4009-655-100