《单片机原理》课程设计闹钟_第1页
《单片机原理》课程设计闹钟_第2页
《单片机原理》课程设计闹钟_第3页
《单片机原理》课程设计闹钟_第4页
《单片机原理》课程设计闹钟_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、物理机电学院课程设计报告物理机电学院课程设计报告课程名称:单片机原理课程设计 专业班级: 电子信息工程 2 班 学生姓名: 学 号: 指导教师: 王清辉、翁国云 完成时间: 2013 年 4 月 7 日 报告成绩: 评阅意见: 评阅教师 日期 数字时钟的设计目录第第 1 1 章章 设计任务设计任务与与要求要求 .1 11.1 数字时钟的设计 .1第第 2 2 章章 方案的设计方案的设计与与论证论证 .22.1 单片机型号的选择 .22.2 按键的选择 .22.3 显示器的选择 .22.4 计时部分的选择 .32.5 发音部分的设计 .32.6 显示器驱动电路 .32.7 电源的选择.3第第 3

2、 3 章章 硬件电路设计硬件电路设计 .43.1 设计原理 .43.2 AT89C51 单片机简介.43.3 键盘电路的设计 .53.4 段码驱动电路 .53.5 蜂鸣器驱动电路 .63.6 电路总原理图 .7第第 4 4 章章 软件设计软件设计 .84.1 主程序部分的设计 .84.2 中断定时器的设置 .84.3 闹钟子函数 .104.4 计时函数 .104.5 键盘扫描函数 .124.6 时间和闹钟的设置 .12第第 5 5 章章 仿真过程与仿真仿真过程与仿真结结果果 .14第第 6 6 章章 安装与调试安装与调试 .15结论与心得结论与心得 .19参考文献参考文献 .20附附 录录 .

3、211一、设计任务与要求 数字时钟的设计:1、能显示小时、分钟、秒; 2、具有时间设置功能;扩展要求:具备闹钟功能,有声音提示,可开关闭显示。2二、方案设计与论证本设计应解决的主要问题有两大方面,即硬件电路设计和软件设计两大方面。其中硬件电路部分又可分为四个模块:键盘模块、显示模块、计时模块和发声模块。硬件电路部分致力于低成本、低功耗和易实现性。软件部分则应做到代码的精简、准确、易读懂。最后通过硬软件的结合实现数字钟的精确计时、校时、三组闹钟设置和定时报警功能。2.1 单片机型号的选择通过对多种单片机性能的分析,最终认为 AT89C51 是最理想的电子时钟开发芯片。AT89C51 是一种带 4

4、K 字节闪烁可编程可擦除只读存储器的低电压,高性能 CMOS8 位微处理器,器件采用 ATMEL 高密度非易失存储器制造技术制造,与工业标准的 MCS-51 指令集和输出管脚相兼容。由于将多功能 8 位 CPU 和闪烁存储器组合在单个芯片中,ATMEL 的 AT89C51 是一种高效微控制器,而且它与MCS-51 兼容,且具有 4K 字节可编程序存储器和 1000 次擦写循环,数据保留时间为 10 年,是最好的选择。2.2 按键的选择方案一:44 矩阵式键盘。如果选择此方案,那么在修改时钟或设置闹铃时间时就可以直接从键盘输入,方便、快捷,但程序较为复杂。 方案二:独立式按键。如果设置过多按键,

5、将会占用较多 I/O 口,而且会给布线带来不便,因此,此方案适用于按键较少的情况。如果选择此方案,由于按键较少,在修改时间或设置闹铃时间时就不能直接输入,只能通过加或减完成,稍为麻烦一些,但其程序简单。 由于并不需要经常修改时间和设置闹铃时间,而且方案二的程序简单,按键少、成本低,因此,选择方案二。2.3 显示器的选择方案一:液晶显示器。如果选择此方案,将会降低系统的功耗,这样就可以用电池供电,便于携带。但液晶显示器的驱动电路复杂,使用起来有一定的3难度。 方案二:用数码管作为显示器。数码管的驱动电路简单,使用方便,如果选择了此方案,那么在夜间看时间的时候就不需要有光源,非常方便。其缺点是功耗

6、较大。由于数码管使用起来较为方便,在夜间看时间也很方便,因此我选择了方案二。2.4 计时部分的选择如果使用时钟芯片,系统就不怕掉电且时间精确。但这种芯片比较贵,况且,设计本系统主要是为了学习单片机程序的编写和调试以及设计硬件电路的一些方法,因此采用软件的方法来计时而没有采用价格较高的时钟芯片。2.5 发音部分的设计通过三极管放大后驱动蜂鸣器工作,再通过软件这时产生等时时间方波驱动蜂鸣器发出间断嘀声,这样就可以省去硬件振荡电路,降低成本。2.6 显示器驱动电路由于通过数码管公共及的电流较大且避免过多地使用分立元件,采用了一片 74HC573 来驱动段码,用 P0 口作位码驱动。2.7 电源的选择

7、如果是用电池供电,就比较方便携带,但是本系统,采用了数码管作为显示器,功耗较大,需要经常更换电池。况且,本系统的体积较大,即使使用电池供电也不能随身携带,因此,用电池供电不大合适,所以用 5V 外部稳压电源来供电。4三、硬件电路设计 3.1 设计原理系统原理图: 图 3-1 系统原理图 3.2AT89C51 单片机简介AT89C51 是一款单片封装的微控制器,适合于许多要求高集成度、低成本的场合。可以满足多方面的性能要求。AT89C51 采用了高性能的处理器结构,指令执行时间只需 2 到 4 个时钟周期。6 倍于标准 51 单片机器件。AT89C51 集成了许多系统级的功能,这样可大大减少元件

8、的数目和电路板面积并降低系统的成本。AT89C51 单片机内部主要有以下部件:8031CPU、振荡电路、总线控制部件、中断控制部件、片内 Flash 存储器、并行 I/O 接口、定时器和串行 I/O接口。51234P1Header 41KR1Res21KR2Res21KR3Res21KR4Res2VCCK1ANK2ANK3ANK4AN图 3-2 AT89C51 单片机3.3 键盘电路的设计键盘采用 4 个独立按键配以 4 个上拉电阻实现对时钟和闹钟的设定及修改。图 3-3 键盘输入电路3.4 段码驱动电路由于通过数码管公共及的电流较大且避免过多地使用分立元件,采用了一片 74HC573 来驱动

9、段码,用 P0 口作位码驱动。6LS1SpeakerVCC12P4Header 2Q12N3906 图 3-4 段码驱动器 74HC5733.5 蜂鸣器驱动电路发音部分是通过三极管放大驱动蜂鸣器工作,再通过软件这时产生等时时间方波驱动蜂鸣器发出间断嘀声,这样就可以省去硬件振荡电路,降低成本。图 3-5 蜂鸣器驱动电路73.6 电路总原理图图 3-6 电路总原理图8四、软件设计4.1 主程序部分的设计程序部分主要采用了程序结构的模块化设计,避免了一些函数的不必要的重复书写,使程序变得单间易懂。程序在执行时,主程序要须通过调用子函数就可完成相应的功能 。主程序流程图如下图 4-1。图 4-1 主程

10、序流程图4.2 中断定时器的设置数字电子钟设计中主要使用定时器 T0 中断 ET0,利用 ET0 中断进行计时时间的自增,从而实现计时功能。AT89C51 有两个通用定时/计数器。两者均可配置为定时器或事件计数器。另外增加了定时器 T0/T1,溢出时 T0/T1 脚自动翻转的功能选项。 用作“定时器”功能时,每经过一个机器周期,寄存器值加 1。 用作“计数器”功能时,寄存器在对应的外部输入管脚 T0/T1 上每发生一次 1 到 0 的跳变时加 1。使用该功能时,外部输入每个机器周期被采样一次。 图 4-2 定时器工作原理1设计中采用了中断方式 1 作为定时中断,其定时计数初值的设置可由以下公式

11、计算得到,中断服务流程图如下图 4-3。cyTtX1629X:计数初值 t:定时时间 :机器周期 1cyT图 4-3 中断服务流程图4.3 闹钟子函数闹钟时间的判别主要是通过设定时间与实时时间对逐位对比确定是否进行闹铃。图 4-4 闹铃判断流程图4.4 计时函数计时函数部分,主要是通过单片机定时中断来计时,复产生一次中断标志位 flag 加 1,当 flag 加满 20 次为 1 秒,然后把 flag 清 0 把秒存储单元加 1。10然后再依次判断分、时。其流程图如下图 4-5。11图 4-5 计时流程图4.5 键盘扫描函数这些函数主要是判断是否有按键按下,并根据相应按键按下的情况调用相关函数

12、执行,其相关流程图如下图 4-6。12图 4-6 键盘扫描流程图4.6 时间和闹钟的设置此部分主要是通过判断 cnt 在不同值时通过调用加 1、减 1 子函数对时间和闹钟的时、分、秒进行设置。在闹钟设置时,判断按键 S4 按下情况我,进行闹钟的开启与关闭,相关流程图如下图 4-7。13图 4-7 时间/闹钟设置流程图五、仿真过程与仿真结果此电子闹钟设计是利用 Proteus 仿真软件进行仿真,基本上实现了课程设计要求实现的功能。硬件部分设置了的三个按键 S1、S2、S3、S4。当按键 S1 第一次按下时,停止计时进入闹钟 1 的秒设置,当按键 S1 第二、第三次按下时,分别进入闹钟1 的分设置

13、和时设置,当按 S1 第四 、第五、第六次按下时分别进入闹钟 2 的秒、分、时设置,当按 S1 第七 、第八、第九次按下时分别进入闹钟 3 的秒、分、时设置,当按 S1 第十 、第二一、第十二次按下时分别进入时间的秒、分、时设置,在 S1 按下的各阶段,可用按键 S2、S3 进行时间和闹铃时间的时、分、秒进行加减设置;当按键 S1 第十三次按下时恢复到时间显示功能。当显示的时间和定时设置的时间一致时,蜂鸣器发出等时间断蜂鸣声,闹铃时间设置为 60秒。在各个闹钟设置阶段,如果有 S4 按下,则相应闹钟功能关闭或开启;如在闹铃时有 S4 按下则提前停止闹铃。图 5-1 proteus 仿真图六、安

14、装与调试首先制作电路板:在 PROTEL DXP 软件上画出实训原理图,接着导入制作 PCB电路板,最后经打印、热转印、腐蚀、打孔,最后做出电路板。 1、步骤如下:14 第一步:利用一个能生成图像的软件生成一些图像文件,这里使用版本为Altium2004 组织 SCH 文件,再利用网络表生成相应 PCB 图(可自动布线,也可手工布线),接着画 PCB 图,以备打印; 第二步:将 PCB 图打印到热转印纸上; 第三步:将打印好 PCB 的转印纸平铺在覆铜板上,准备转印; 第四步:用热应机加温将转印纸上黑色油墨粉压在覆铜板上形成高精度的抗腐; 第五步:热应机加温加压成功转印后的效果; 第六步:准备

15、好三氯化铁溶液进行腐蚀; 第七步:腐蚀结束,清洗干净,晾干之后进行打孔。 第八步:将焊盘铣刀装到台钻上,清理出焊盘部分,剩下的部分用于阻焊; 第九步:安装所需预定原件并焊接好。 2、硬件调试 拿到电路板后,首先要检查加工质量,在确保没任何质量问题时再安装元器件。元器件在安装前要足逐一检查,用万用表测其数值,看是否与所需相同,完成焊接后应先空载上电(芯片座不插芯片) ,并检查各引脚的电位是否正确。若一切正常,方可在断电的情况下将芯片插入,再次检查各引脚的电位及其逻辑关系。将万用表的探针放到单片机接电源的引脚上检测一下,看是否符合要求。 在调试时我遇到了一个问题:用 STC 下载器无法将程序下载到

16、单片机中,经检查,是 COM 端口和波特率选的不正确,应更改 STC 下载器的 COM 端口使之与电脑的 COM 端口相对应,波特率改为 9600115200 即可下载成功。Pcb 图15图 6-1 PCB 图学号显示界面16图 6-2 开机学号图时间显示界面图 6-3 时钟运行图闹钟设置界面17图 6-4 闹钟设置图七、结论与心得做了一周的课程设计,有很多的心得体会,有关于单片机的,也有关于模电数电等基础科目的。18因为单片机已经很久没复习,刚拿到题目,不知道从哪入手,后来通过对书本的回顾,加深了对单片机的记忆。有些知识会迁移和联系模电数电。课堂教学考虑到大多数同学的需求,主要强调“基本”基

17、本知识、基本理论、基本方法、基本技能。而这次设计正是为我们提供了一个深入学习、探索的机会,成为课堂教学的有益补充。我们正面临就业问题,这次课设给了我们一个机会去试验。单片机理论的学习是为课程的设计作准备的,但有时学习的理论也解决不了实践中的问题。实践中获得的知识能让我对单片机的知识有更好的认识和理解。虽然这次的课程设计我参考了一些文献资料,没有做到创新,但在对程序的读写过程中我明白了许多。这次课程设计的最大收获是只有把理论用到实践中我们才能真正掌握好所学知识。八、参考文献 1李全利、 迟荣强,单片机原理及接口技术M,北京:高等教育出版社,20042凌玉华,单片机原理及应用系统设计M,长沙:中南

18、大学出版社,20063张道德,单片机接口技术(C51 版)M,北京:中国水利水电出版社,20074 王幸之、钟爱琴、王雷、王闪,AT89 系列单片机原理与接口技术M,北京:北京航空航天大学出版社,20045何立明,单片机应用系统设计M,北京:北京航空航天大学出版社,199019 6陈光东,单片机微型计算机原理与接口技术M,武汉:华中理工大学出版社,1998附 录/* 8 位数据管电子时钟闹钟设计 * * * 10 电本 2 班 谢伟军 2010041631 */20/*头文件*#include #include/*宏定义*#define uchar unsigned char #define

19、uint unsigned int/*位声明*sbit key1=P37; /功能键 sbit key2=P36;/加 1sbit key3=P35;/减 1sbit key4=P34;/关闹钟sbit fmq=P33;/蜂鸣器/*数码管显示的数值*uchar code table=0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,/ 0 1 2 3 4 5 0 x82,0 xf8,0 x80,0 x90,0 xbf,0 x0ff; / 6 7 8 9 - 灭 uchar code DSY_CODE=0 xf9,0 xb0,0 x82,0 xf9,0 x99,0 xc0,

20、0 xc0,0 xf9; /学号数值 /*函数声明*void jia();/加 1 void jian();/减 1 /*数组定义,数组内含有 8 个数值*uchar table18,table28,table38,table48;/*时间显示初始值*uchar shi=12,fen=0,miao=0; /*定义全局变量*uchar shi1,fen1,miao1,shi2,fen2,miao2;uchar shi3,fen3,miao3,shi4,fen4,miao4;uchar yimiao, fmqpinlu, wss, key1cishu, tiaoshi, alm1, alm2, a

21、lm3, xuehao;/ 1 秒 蜂鸣频率 位闪 key1 次数 调时 闹 1 闹 2 闹 3 学号uint fmq60s;/ 响 60s/*延时函数,用于动态扫描数码管*void delay(uchar i) uchar x,y; for(x=i;x0;x-) for(y=120;y0;y-); /*初始化函数*void init() TMOD=0 x01; /工作方式 1 21 TH0=0 x3c; /定时时间为:50ms(65536-50000)/256 TL0=0 x0b0; /(65536-50000)%256 ET0=1; /打开定时器 EA=1; /开总中断 TR0=1; /启

22、动定时器 /*显示子函数,用于显示时间数值*void display() uchar i,j; if(key1cishu!=10|wss=0) table10=miao%10; /分离秒的个位与十位 table11=miao/10; else table10=table11=11; /两位灭if(key1cishu!=11|wss=0) table13=fen%10; /分离分的个位与十位 table14=fen/10; else table13=table14=11;if(key1cishu!=12|wss=0) table16=shi%10; /分离时的个位与十位 table17=shi/

23、10; else table16=table17=11; table12=table15=10; j=0 x7f; for(i=0;i=7;i+) /从秒到时的扫描 P0=j; P1=tabletable1i; /显示数值 delay(10); j=_cror_(j,1); /循环右移 /*显示子函数,用于显示定时 1 时间*void display1() uchar i,j; if(alm1=0) if(key1cishu!=1|wss=0) table20=miao1%10; /以下含义同上 table21=miao1/10;22 else table20=table21=11; if(k

24、ey1cishu!=2|wss=0) table23=fen1%10; table24=fen1/10; else table23=table24=11; if(key1cishu!=3|wss=0) table26=shi1%10; table27=shi1/10; else table26=table27=11; else table20=table21=table23=table24=table26=table27=10; table22= table25=10; j=0 x7f; for(i=0;i=7;i+) P0=j; P1=tabletable2i;delay(10); j=_c

25、ror_(j,1); /*显示子函数,用于显示定时 2 时间*void display2() uchar i,j; if(alm2=0) if(key1cishu!=4|wss=0) table30=miao2%10; /以下含义同上 table31=miao2/10; else table30=table31=11; if(key1cishu!=5|wss=0) table33=fen2%10; table34=fen2/10; else table33=table34=11;if(key1cishu!=6|wss=0)23 table36=shi2%10; table37=shi2/10;

26、 else table36=table37=11; else table30=table31=table33=table34=table36=table37=10; /禁用闹钟 table32= table35=10; /禁用闹钟 j=0 x7f; for(i=0;i=7;i+) P0=j; P1=tabletable3i;delay(10); j=_cror_(j,1); /*显示子函数,用于显示定时 3 时间数值*/void display3() uchar i,j; if(alm3=0) if(key1cishu!=7|wss=0) table40=miao3%10; /分离秒的个位与十

27、位 table41=miao3/10; else table40=table41=11;if(key1cishu!=8|wss=0) table43=fen3%10; /分离分的个位与十位 table44=fen3/10;else table43=table44=11;if(key1cishu!=9|wss=0) table46=shi3%10; /分离时的个位与十位 table47=shi3/10;else table46=table47=11; else table40=table41=table43=table44=table46=table47=10; table42= table45

28、=10; j=0 x7f; /从秒到时的扫描24 for(i=0;i=20) /判断是否到一秒 wss=wss; yimiao=0; /到了,则标志位清零 if(tiaoshi!=0) miao4+; /秒加 1 if( miao459) /判断秒是否到 60s miao4=0; /到了,则清零 fen4+; /分加 1 if(fen459) /以下含义同上 fen4=0; shi4+; if(shi423) shi4=0; else miao+; /秒加 1 if( miao59) /判断秒是否到 60s miao=0; /到了,则清零 fen+; /分加 1 if(fen59) /以下含义

29、同上 fen=0; shi+; if(shi23) shi=0; 25/*键盘扫描子函数*/void key_scan() if(key1=0) while(!key1) /防止掉显 if(key1cishu=1|key1cishu=2|key1cishu=3) display1(); if(key1cishu=4|key1cishu=5|key1cishu=6) display2(); if(key1cishu=7|key1cishu=8|key1cishu=9) display3(); if(key1cishu=0|key1cishu=10|key1cishu=11|key1cishu=1

30、2|key1cishu=13) display(); key1cishu+; /记下按键 key1 按下的次数 if(key1cishu=10&tiaoshi=0) miao4=miao; fen4=fen;shi4=shi;tiaoshi+;if(key1cishu=13) key1cishu=0; if(tiaoshi=1) miao=miao4; fen=fen4; shi=shi4; tiaoshi=0; if(key2=0) /判断 key2 是否按下 while(!key2) /防止掉显 if(key1cishu=1|key1cishu=2|key1cishu=3) display

31、1(); if(key1cishu=4|key1cishu=5|key1cishu=6) display2(); if(key1cishu=7|key1cishu=8|key1cishu=9) display3(); if(key1cishu=0|key1cishu=10|key1cishu=11|key1cishu=12|key1cishu=13) display(); jia(); 26 if(key3=0) /判断 key3 是否按下 while(!key3) /防止掉显 if(key1cishu=1|key1cishu=2|key1cishu=3) display1(); if(key

32、1cishu=4|key1cishu=5|key1cishu=6) display2(); if(key1cishu=7|key1cishu=8|key1cishu=9) display3(); if(key1cishu=0|key1cishu=10|key1cishu=11|key1cishu=12|key1cishu=13) display(); jian(); /调用减 1 子函数 if(key4=0) /判断 key4 是否按下 while(!key4) /防止掉 if(key1cishu=1|key1cishu=2|key1cishu=3) alm1=alm1; display1()

33、; if(key1cishu=4|key1cishu=5|key1cishu=6) alm2=alm2; display2(); if(key1cishu=7|key1cishu=8|key1cishu=9) alm3=alm3; display3(); if(key1cishu=0|key1cishu=10|key1cishu=11|key1cishu=12|key1cishu=13) display(); /*加 1 子函数*void jia() if(key1cishu=1) /判断 key1 按下的次数是否为 1 miao1+; /是,则秒加 1 if(miao159) /判断秒是否大

34、于 60,是,则秒清零 miao1=0; if(key1cishu=2) /以下含意同上 fen1+; if(fen159) fen1=0; 27 if(key1cishu=3) shi1+; if(shi123) shi1=0; if(key1cishu=4) miao2+; if(miao259) miao2=0; if(key1cishu=5) fen2+; if(fen259) fen2=0; if(key1cishu=6) shi2+; if(shi223) shi2=0; if(key1cishu=7) miao3+; if(miao359) miao3=0; if(key1cis

35、hu=8) fen3+; if(fen359) fen3=0; if(key1cishu=9) shi3+; if(shi323) shi3=0; if(key1cishu=10) miao+; if(miao59) miao=0;tiaoshi+; if(key1cishu=11) fen+; if(fen59)28 fen=0;tiaoshi+; if(key1cishu=12) shi+; if(shi23) shi=0;tiaoshi+; /*减 1 子函数*/void jian() if(key1cishu=1)/判断 key1 按下的次数是否为 1,是则秒减 1 miao1-; i

36、f(miao1=255)/判断秒是否减到 255,是,则秒置 59 miao1=59; if(key1cishu=2)/以下含意同上 fen1-; if(fen1=255) fen1=59; if(key1cishu=3) shi1-; if(shi1=255) shi1=23; if(key1cishu=4) miao2-; if(miao2=255) miao2=59; if(key1cishu=5) fen2-; if(fen2=255) fen2=59; if(key1cishu=6) shi2-; if(shi2=255) shi2=23; if(key1cishu=7) miao3-;29 if(miao3=255) miao3=59; if(key1cishu=8) fen3-; if(fen3=255) fen3=59; if(key1cishu=9) shi3-; if(shi3=255) shi3=23; if(key1cishu=10) miao-; if(miao=255) miao=59; tiaoshi+; if(key1cishu=11) fen-; if(fen=255) fen=59; tiaoshi+; if(key1cishu=12) shi-; if

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论