简易计时器课程设计(新)_第1页
简易计时器课程设计(新)_第2页
简易计时器课程设计(新)_第3页
简易计时器课程设计(新)_第4页
简易计时器课程设计(新)_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

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

文档简介

1、西安郵電學院单片机课程设计报告书系部名称学生姓名专业名称班 级时间: 自动化学院 05号:宋希武 17号:张哺育 : 01号:王文海 : 自动化 : 自动0805 2011年 6月6日 至 2011年6月 17日 1 :简易计时器的设计摘要:此计时器为一学生实践小制作,功能设计相对简单,主要基于单片机控制实现。本设计主要采用元器件有89c52单片机、DS1302功能芯片、以及数码显示器,软件用到keil.c编程软件。此设计中运用了两个基本小电路晶体振荡器电路和复位电路。晶体振荡器电路给数字钟提供一个频率稳定准确的32768Hz的方波信号,可保证数字钟的走时准确及稳定.不管是指针式的电子钟还是数

2、字显示的电子钟都使用了晶体振荡器电路. 复位电路实现计时器的复位功能。89c52单片机、DS1302功能芯片、和数码显示器之间通过个引脚的功能联系,在电路板上实现计时器的计时功能。关键词:89c52单片机 ;DS1302功能芯片 ;晶体振荡器电路1. 设计要求11实现定时功能,定时时间可设置1min到15min;12启动、暂停继续,复位等功能;13结束前10s有声光提示(短),定时结束时有声光提示(长)。2.方案论证2.1 DS1302DS1302的引脚功能如表1所示,外形及内部结构如图1所示2:表1 DS1302引脚功能表图1 DS1302管脚图及内部结构图2.2 STC89C52单片机部分

3、引脚功能:P3.0:RXD串行输入口 P3.1:TXD串行输出口 P3.2:INTO外部中断0输入 P3.3:INT1外部中断1输入P3.4:T0定时器0外输入 p3.5:T1定时器1外输入 P3.6:WR外部写输入 P3.7:Rd外部读输入 如图2.1所示图2.1 STC89C52单片机2.3四位共阳数码管2.5总硬件清单10uf电容一个(分正负),30pf电容四个(不分正负),DS1302芯片,STC89C52芯片,0.2k电阻一个,8.2k电阻一个,1k电阻四个,按键开关五个,led灯一个,12M晶振一个,32768k晶振一个。2.5方案设计与论证使用串行接口时钟芯片DS1302设计时钟

4、电路。该设计方案以单片机AT89S51为主控芯片,以串行时钟芯片DS1302为核心计时芯片,组成数字时钟电路。该电路不但能准确地计时、附加其它功能,而且,其三线接口可以节省接口资源,在断电后不丢失时间和数据信息。该设计方案的接口电路 4如图所示:通过以上两种设计方案的比较,我们可以看到,设计方案二接口简单,计时可靠,综合性能良好。所以选用第二种设计方案.3. 硬件详细设计3.1简易计时器的原理图如图3.1所示.图3.1 简易计时器总原理图3.2 复位控制电路当通电瞬间 稳压电源给电容充电 此时,在电容和电阻之间将有一个高电平也就是给单片机一个高电平使其复位。 随着电容充电结束 将使电容与电阻之

5、间将呈现低电平 单片机复位结束。计算你自己复位电路的时间,要是简单的阻容上电复位,就是RC电路的充电时间常数t=RC.如图3.2所示如图3.23.3 晶体振荡器电路晶体振荡器是构成数字式时钟的核心,它保证了时钟的走时准确及稳定. 图3.3所示电路通过CMOS非门构成的输出为方波的数字式晶体振荡电路,这个电路中,CMOS非门U1与晶体,电容和电阻构成晶体振荡器电路,U2实现整形功能,将振荡器输出的近似于正弦波的波形转换为较理想的方波.输出反馈电 阻R1为非门提供偏置,使电路工作于放大区域,即非门的功能近似于一个高增益的反相放大器.电容C1,C2与晶体构成一个谐振型网络,完成对振荡频率的控制功能,

6、同时提供了一个180度相移,从而和非门构成一个正反馈网络,实现了振荡器的功能.由于晶体具有较高的频率稳定性及准确性,从而保证了输出频率的稳定和准确。如图3.3所示图3.34. 软件设计4.1 其总的工作原理首先通过晶体振荡电路将近似于正弦波的波形转换为较理想的方波,然后基于单片机对信号波进行数字逻辑信号的分析处理,运用C语言进行编程,控制单片机个引脚的高低电平的变化,最终实现计时器的计时显示变化。4.2 设计流程图5. 设计心得宋希武:这次课程设计我参与了前期方案设计,仿真电路的绘画以及后期实验报告的撰写。这次课程设计与往年相比我感觉难度大了许多,这两周一直在忙碌中度过。总体而言,最终得出的成

7、功并不算完全成功,不过,能坚持到最后,并能得到大部分的实验结果,我们已经尽了最大的努力。实验报告的撰写更是让我对整个设计的过程有了一个更加明确的啦。在这期间,个人感觉是方案设计最费时间,主要是因为不好把握思路。不管怎么说,这次课程设计还是让我学到了很多。张哺育:在简易计时器的设计过程中,我主要参与了前期方案设计,软件设计,以及硬件焊接。方案设计算是比较重要的一环,这里就不多说了。对于软件设计也不完全是自己编程的,也是在搜查资料后借鉴了某些关于计时器或数字时钟电路的程序。而硬件焊接方面由于最开始对两个芯片排版有些食物,导致连线布局过程中多费了很多时间。当然,焊接完成后也出现了一 7些小问题,但经

8、过排错后这些问题都解决了。王文海:关于这次简易计时器的的课程设计,从起初的图纸绘画到最后的线路焊接,我的队友付出了很多的努力,这次我获得最大的收获就是做事情的恒心和持之以恒的决心,在焊接线路的时候不时的出现焊错的情况,因为线路板的孔太小,这对一个焊接人员来说最重要的就是耐性,从这次实践中我学到了课本上学不到的东西,坚持才是决定成功的根本条件,我想以后无论做什么,最主要的就是不能轻易放弃!6附录:源程序6.1简易计时器的总程序#includereg51.h#include DS1302.hsbit setkey=P10;/设置/确定sbit addkey=P11;/数字sbit rightkey

9、=P12;/设置灯右移sbit pausekey=P35; /暂停/继续sbit speak=P36;SYSTEMTIME CurrentTime;/(void (code *) (void) 0x0000) ();char second=0,minute=0;unsigned char l1,l2,l3,l4;unsigned char code tab=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10; /共阳管字型码 unsigned in

10、t led1=0,led2=0,led3=0,led4=0;/表示4个led显示灯上数字 unsignedsetflag=0,rightflag=1,addflag=0,pauseflag=0,speakflag=0;void delay(unsigned char i)unsigned char j;while(i-)for(j=100;j0;j-);8 intdisplay()if(setflag=0) /正常显示 P1=0x8f;P2=tabled1;delay(1);P1=0x4f;P2=tabled2;delay(1);P1=0x2f;P2=tabled3;delay(1);P1=0

11、x1f;P2=tabled4;delay(1);if(pauseflag=1)P1=0x8f;P2=tabled1+10;delay(1);P1=0x4f;P2=tabled2+10;delay(1);P1=0x2f;P2=tabled3+10;delay(1);P1=0x1f;P2=tabled4+10;delay(1);if(setflag=1) /设置时的显示 /多了“点”对应switch(rightflag) led设置状态 case 1: P1=0x8f; P2=tabled1+10; delay(1); P1=0x4f; P2=tabled2; delay(1); P1=0x2f;

12、 P2=tabled3; delay(1); P1=0x1f; P2=tabled4; delay(1); break; P2=tabled1; delay(1); P1=0x4f; P2=tabled2+10; delay(1); P1=0x2f; P2=tabled3; delay(1); P1=0x1f; P2=tabled4; delay(1); break; P2=tabled1; 10 case 2: P1=0x8f; case 3: P1=0x8f;delay(1); P1=0x4f; P2=tabled2; delay(1); P1=0x2f; P2=tabled3+10; d

13、elay(1);P1=0x1f;P2=tabled4; delay(1);break;case 4: P1=0x8f;P2=tabled1; delay(1);P1=0x4f;P2=tabled2; delay(1);P1=0x2f;P2=tabled3; delay(1);P1=0x1f;P2=tabled4+10; delay(1);break;void testkey() if(pauseflag=0) / if(setkey=0)11 /键盘检测暂停时设置无效delay(20); if(setkey=0) while(setkey=0); setflag+; if(setflag!=1

14、) /设置时暂停无效 if(pausekey=0) delay(20); if(pausekey=0) while(pausekey=0); pauseflag+; if(pauseflag=1) l1=led1; l2=led2; l3=led3; l4=led4; if(pauseflag=2) pauseflag=0; CurrentTime.Second=59-(l3*10+l4); CurrentTime.Minute=59-(l1*10+l2); DS1302_SetTime(DS1302_SECOND,CurrentTime.Second); DS1302_SetTime(DS1

15、302_MINUTE,CurrentTime.Minute); 12 if(setflag=1) if(rightkey=0) /move if(addkey=0) delay(20); if(addkey=0) while(addkey=0); switch(rightflag) case1:if(+led11|led25) led1=0;break; case2:if(+led25)&led1=1) led2=0; if(led1=0&led29) led2=0;break; case 3:if(+led35)led3=0;break; case 4:if(+led49)led4=0;br

16、eak; /addmove /add delay(20); if(rightkey=0) while(rightkey=0); if(rightflag4) rightflag+;else rightflag=1; 13 if(setflag=2) setflag=0; /确认设置时间 CurrentTime.Second=59-(led3*10+led4); CurrentTime.Minute=59-(led1*10+led2); DS1302_SetTime(DS1302_SECOND,CurrentTime.Second); DS1302_SetTime(DS1302_MINUTE,C

17、urrentTime.Minute);void main()speak=0;led1=1;led2=5;led3=0;led4=0;while(1) display(); testkey(); if(setflag) break; while(1) DS1302_GetTime(&CurrentTime); second=59-timesecond(&CurrentTime); minute=59-timeminute(&CurrentTime); speak=0; if(pauseflag) led1=l1; led2=l2; led3=l3; led4=l4; /计算时间 if(!setf

18、lag&!pauseflag) 14 led1=minute/10; led2=minute%10; led3=second/10; led4=second%10; testkey(); display(); if(minute=0)&(second0; i-)DS1302_IO = ACC0; /相当于汇编中的 RRC DS1302_CLK = 1;DS1302_CLK = 0;ACC = ACC 1;unsigned char DS1302OutputByte(void) /实时时钟读取一字节(内部函数)unsigned char i;for(i=8; i0; i-)ACC = ACC 1

19、;ACC7 = DS1302_IO;16 /相当于汇编中的 RRCDS1302_CLK = 1;DS1302_CLK = 0;return(ACC);void Write1302(unsigned char ucAddr, unsigned char ucDa) /ucAddr: DS1302地址, ucData: 要写的数据DS1302_RST = 0;DS1302_CLK = 0;DS1302_RST = 1;DS1302InputByte(ucAddr); / 地址,命令DS1302InputByte(ucDa); / 写1Byte数据DS1302_CLK = 1;DS1302_RST

20、= 0;unsigned char Read1302(unsigned char ucAddr) /读取DS1302某地址的数据unsigned char ucData;DS1302_RST = 0;DS1302_CLK = 0;DS1302_RST = 1;DS1302InputByte(ucAddr|0x01); / 地址,命令ucData = DS1302OutputByte(); / 读1Byte数据 DS1302_CLK = 1;DS1302_RST = 0;return(ucData);void DS1302_SetProtect(bit flag) /是否写保护if(flag)

21、Write1302(0x8E,0x10); 17 else Write1302(0x8E,0x00);void DS1302_SetTime(unsigned char Address, unsigned char Value) / 设置时间函数void DS1302_GetTime(SYSTEMTIME *Time)/*void DateToStr(SYSTEMTIME *Time)void TimeToStr(SYSTEMTIME *Time)DS1302_SetProtect(0); Write1302(Address, (Value/10)Second = (ReadValue&0x7

22、0)4)*10 + (ReadValue&0x0F); ReadValue = Read1302(DS1302_MINUTE); Time-Minute = (ReadValue&0x70)4)*10 + (ReadValue&0x0F); Time-DateString0 = Time-Year/10 + 0; Time-DateString1 = Time-Year%10 + 0; Time-DateString2 = -; Time-DateString3 = Time-Month/10 + 0; Time-DateString4 = Time-Month%10 + 0; Time-Da

23、teString5 = -; Time-DateString6 = Time-Day/10 + 0; Time-DateString7 = Time-Day%10 + 0; Time-DateString8 = 0; Time-TimeString0 = Time-Hour/10 + 0; Time-TimeString1 = Time-Hour%10 + 0; 18*/ Time-TimeString2 = :; Time-TimeString3 = Time-Minute/10 + 0; Time-TimeString4 = Time-Minute%10 + 0; Time-TimeStr

24、ing5 = :; Time-TimeString6 = Time-Second/10 + 0; Time-TimeString7 = Time-Second%10 + 0; Time-DateString8 = 0;char timeminute(SYSTEMTIME *Time)char timesecond(SYSTEMTIME *Time)void Initial_DS1302(void)/*void BurstWrite1302(unsigned char *pWClock) /往DS1302写入时钟数据(多字节方式)unsigned char i;Write1302(0x8e,0x00);DS1302_RST = 0;DS1302_CLK = 0;DS1302_RST = 1;19 return Time-Minute; return Time-Second; unsigned char Second=Read1302(DS1302_SECOND); if(Second&0x80) DS1302_SetTime(DS1302_SECOND,0); / 控制命令,WP=0,写操作?D

温馨提示

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

最新文档

评论

0/150

提交评论