单片机课程设计-实时时钟设计.doc_第1页
单片机课程设计-实时时钟设计.doc_第2页
单片机课程设计-实时时钟设计.doc_第3页
单片机课程设计-实时时钟设计.doc_第4页
单片机课程设计-实时时钟设计.doc_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

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

文档简介

电气工程学院单片机课程设计报告班 级: 电136 姓 名: 学 号: 设计题目: 实时时钟设计 设计时间: 2015.12.2212.28 评定成绩: 评定教师: 目录摘要.3第一章 系统设计要求4第二章 总体设计方案52.1文献综述.62.2方案设计7第三章 硬件设计83.1 电路原理设计.9第四章 软件设计.104.1 时序图.104.2 流程图.124.3 串口通信程序.13第五章 调试过程.135.1 软硬件调试 .145.2 运行效果.155.3 仿真所用工具.17第六章 设计总结.18参考文献19附件20摘要:单片机 即单片微型计算机。(Single-Chip Microcomputer ),是 集 CPU ,RAM ,ROM ,定时,计数和多种接口于一体的微控制器。他体积小,成本低,功能强,广泛应用于工业自动化上和智能产品。时钟,自从它被发明的那天起,就成为了人类的好朋友,但随着时间的推移,科学技术的不断发展,时钟的应用越来越广范,人们对时间计量的精度要求也越来越高。怎样让时钟更好的为人民服务,怎样让我们的老朋友再次焕发青春呢?这就要求我们不断设计出新型的时钟,来不断满足人们的日常生活需要。然而市场上的时钟便宜的比较笨重,简单实用的又比较昂贵。那么,有没有一款既简单实用价格又便宜的时钟呢?课程设计的设想:利用单片机功能集成化高,价格又便宜的特点设计一款结构既简单,价格又便宜的单片机电子时钟。基于这种情况,我查阅资料,反复论证设计出了这款既简单实用,又价格便宜的单片机电子时钟。关键词:单片机 时钟 串口调时正文:一、 设计要求设计一个实时时钟,实现具有时钟读取、显示,以及时钟设定的单片机应用系统,功能及指标如下:(1)满足通用要求;(2)可以由电脑键盘设定时钟,设定协议自行设计。通过这个课题,可以知道。要求做的是一个由单片机系统能够实现时钟显示的功能的这样一件事情,和市面上常见的各种数码表,数码钟类似。其次还要要求能够通过电脑键盘控制这个钟的时间调整,这里需要注意的是,与简单的课程实验区别开来,这次和以往不同的是:用的“按键”将不再是K这个开关,这里需要用到单片机和PC的串口通讯。在我一开始的思路中,具体的模块化分解如下:1、就是单片机定时(显示)功能模块。通过P0/P1/P2口,接相关的元器件。关于显示原件,我们课堂上所熟悉的是7段数码管,4个就显示“时间-分钟”,扩展到6个就能显示“时间-分钟-秒数”。显示时间这一功能的实现,还可以通过LCD液晶屏幕,常用的也有很多种:1602、12864、5110、3310。近年来随着科技发展,还出现彩色的屏幕。都可以用来显示时间,不同的硬件,将对设计产生明显的影响。2、就是定时(读取)功能模块,需要在一个晶振频率下,如何计算出所需要的1s 这个时间,一秒钟的精确度如何?在这一模块中,我的思路如下:首先我们学习过的定时器功能是可以拿来做的,做出一秒定时后,循环86400次,也就是24 hour,完全可以实现这一功能。此外,课程实验知道书中,纤细介绍了DS1302实时时钟芯片,利用这一芯片,也可以比较方便的对时间读取。3、供电模块,单片机的电源可以由+5V提供,但是作为一个“钟”,能否采用电池供电?其实USB线现在普遍得到利用,电脑上手机插头上5v电压供电是一个好思路。从供电功能的其他角度来看,还可以选择纽扣电池,干电池。电压1.53V,这就更多更深地考虑到了供电的便携性。4、PC串口通信模块,既然要满足设计要求,连接PC时的MAX232和串口也要作为一个单独的模块来设计。串口功能的实现,课堂上学习了一个IIC串口通信协议,也可自己用其他的串口通信协议。这一功能的还要能准确控制好单片机,从而实现设定、修改时钟显示这一功能。二、总体方案2.1 文献综述我查阅了在功能分解中用到的相关元器件的PDF手册,并且在图书馆查找了有关单片机时钟设计的一些图书。2.2 方案设计基于成本、性能、功能、界面友好等,综合考虑。数码管时钟显然是不够的,DS1302芯片中,实时时钟的显示,可以包括:年,月,日,星期,闰年计算等许多功能,用LCD显示会比较的好。目前市面上的LCD1602的性价比也很高,9.9人民币就可以买到一个不错的蓝屏幕白字体的。基于定时1302芯片可以方便地读取当前的时间,时钟最终采用的方案是DS1302+LCD1602组合的方式。同时为了满足需求,max232芯片也是串口通讯里所必须的。三、硬件设计3.1 电路原理图如上图所示:左上角采用的是通常的单片机复位电路。 DS1302芯片接在89C51的左下角P1.01.2口,同时注意给芯片的VCC1 VCC2供电。P0口接左上角的1602LCD液晶屏幕,注意串上拉电阻。P2.02.2控制着LCD的读写复位操作。串行通信口接在了P3的两根线即可,一根用来接收数据,一根用来发送数据。四、软件设计1602液晶屏幕时序图:基本思路:通过编程。将定时1302芯片的时分秒年月日等寄存器里的信息提取出来,读入单片机内,在将单片机的数据发送至1602显示出来。C51语言的程序如左图所示。开始DS1302及中断初始化1602显示当前时间根据协议修改ds1302的寄存是否串口通讯液晶屏幕刷新显示NY在产品的编程中,我遇到了很多很多的困难,因为本身,1302定时器和1602芯片的时钟,在图书馆很多教材里,网上的51单片机论坛里,都会有很多类似的例题,总体上来看大同小异。只要查阅1602的字符表格,便可以在编写出对应到查表程序,让1602显示想要的内容。如上图所示,只能够满足最简单的显示要求。让人感觉比较困难的是串口通信。我搜索了好多关于这方面的资料,因为课堂上在串口通信这一块,讲解不多,只讲了一个IIC,自己从来都没用过这个方面的知识。在课设开始的前3天里,我对串口这一功能的实现,可以说是一点思路没有,寸步难行。后来只能找学长学姐的请教,教我了一个“自定义串口通信”。 自定义数据通信协议,这里所说的数据协议是建立在物理层之上的通信数据包格式。所谓通信的物理层就是指我们通常所用到的RS232、RS485、红外、光纤、无线等等通信方式。在这个层面上,底层软件提供两个基本的操作函数:发送一个字节数据、接收一个字节数据。所有的数据协议全部建立在这两个操作方法之上。 通信中的数据往往以数据包的形式进行传送的,我们把这样的一个数据包称作为一帧数据。类似于网络通信中的TCPIP协议一般,比较可靠的通信协议往往包含有以下几个组成部分:帧头、地址信息、数据类型、数据长度、数据块、校验码、帧尾。包的发送即把数据包中的左右字节按照顺序一个一个的发送数据而已。当然发送的方法也有不同。 在单片机系统中,比较常用的方法是直接调用串口发送单个字节数据的函数。这种方法的缺点是需要处理器在发送过程中全程参与,优点是所要发送的数据能够立即的出现在通信线路上,能够立即被接收端接收到。另外一种方法是采用中断发送的方式,所有需要发送的数据被送入一个缓冲区,利用发送中断将缓冲区中的数据发送出去。我这个课题里,需要用到的通信数据是 XX-XX-XX-XX-XX-XX一共6组数据,采用自定义串口通信时。我自定义,88为接收到的字头,一旦接收88 表示数据包开始发送至单片机,帧尾我不妨定义“77”表示发送截止。也就是6+2=8组数据,作为一个数据包,进行收发。当这一组发送的数据被单片机接收后,让单片机返还一个数字0(4F)作为单片机成功接收到数据的回应。程序设计如下:数据收成功,即可传送给1302芯片,刷新修改后的时间。顺便返回0值,否则无反应五、调试过程5.1 软硬件调试在这个课程设计中,我们需要用到一个STC-ISP的调试软件,这个软件同样可以用于把HEX文件烧录到芯片中。如上图所示,在调试过程中,仿真难以解决上面的这个问题,就是发送数据后,仿真中没有数据信号的接收。这里还用到一个“虚拟串口”软件。通过对虚拟串口软件的配置,我们在仿真中刚好可以用到COM3这个接口。这样在Proteus环境下可以比较好的观察单片机和PC的串口通信。在设置串口助手时,需要注意设置好响应的单片机型号,串口助手COM连接不能错,选好后“打开串口”然后利用串口助手收发数据即可。5.2 运行效果在观察器中,可以看到串口发送的数据,单片机仿真回复了0或者ASCII码4F。上图是LCD1602的仿真部分。时间日期的显示正常。在本次仿真调试中,不论单片机是否接受到了数据,1302芯片在PROTEUS环境下会接受PC当前的时间而自动刷新。这给我的设计带来了麻烦。后来通过对HEX文件的烧录,发现在实际的板子运行过程中,不会出现1302刷新问题,就是说,我串口通信文件发送出去,修改的是时钟芯片寄存器里的数据,这个问题一直没有在仿真的条件下得到比较好的解决。通过下板子,我也发现STC-ISP老版本4.83下板子不是特别好用,官网上下了一个最新版本,烧录起来更方便。用4,.83版本一烧录就会出现如下的信息。我百度了一下,好像是版本低了。Chinese:正在尝试与 MCU/单片机 握手连接 . Chinese:连接失败,请尝试以下操作: 1.在单片机停电状态下,点下载按钮,再给单片机上电 2.停止下载,重新选择 RS-232 串口, 接好电缆 3.可能需要先将 P1.0/P1.1 短接到地 4.可能外部时钟未接 5.因 PLCC、PQFP 转换座引线过长而引起时钟不振荡,请 调整参数 6.可能要升级电脑端的 STC-ISP.exe 软件 7.若仍然不成功,可能 MCU/单片机内无 ISP 系统引导码, 或需退回升级,或 MCU 已损坏 8.若使用 USB 转 RS-232 串口线下载,可能会遇到不兼容 的问题,可以让我们帮助购买兼容的 USB 转 RS-232 串口线仍在连接中, 请给 MCU 上电.MCU Type is: STC89C52RCMCU Firmware Version: 6.6CChinese:MCU 固件版本号: 6.6CDouble speed / 双倍速: 12T/单倍速振荡放大器增益: full gain下次下载时 P1.0/P1.1 与下载无关内部扩展AUX-RAM: 允许访问(强烈推荐)下次下载用户应用程序时将数据Flash区擦除: NO用户软件启动内部看门狗后: 复位关看门狗ALE pin 仍为 ALE内部时钟频率:12.056172M.外部时钟频率:12.056172M.IAP read MCU ID is error!如上图所示,6.85版本烧录提示:“操作成功”。六、设计总结经过一周的单片机课程设计,我基本完成课题要求。功能上基本达标:时钟的显示,PC调时功能。精确度完全可以满足日常生活显示时间的需要;调时功能,方便快捷;硬件设施合乎要求,软件设计可以配合硬件实现要求功能。但是由于时间比较短,出现部分不足:Proteus仿真PC调节时间不成功!经讨论只是软件部分还不完善,我完全可以用单片机内的寄存器存储修改时间,而不仅仅是去修改DS1302里的时钟功能。还有我那个设置串口,一开始思维频率就停留在串口助手调时间,一开始就忽视了PC键盘的作用,满脑子里就是串口助手把数据如何发出去,C51单片机怎么接收。结果,轮到验收的时候,别的人有人轻轻敲了几下键盘,就把时间改过来了。按照的程序设计,我不能用键盘敲数字,还得敲出对应的ASCII码用来收发数据。这显然是很麻烦的,需要一个个去查表,才能完成通信。不过,我相信,如果时间充足,将软件改进,我完全可以很好实现所有功能。 另外,在本次设计的过程中,我发现很多的问题,虽然以前没有做过这样的设计但通过这次设计我学会了很多东西,单片机课程设计重点就在于软件算法的设计,需要有很巧妙的程序算法,虽然以前写过几次程序,但我觉的写好一个程序并不是一件简单的事,比如写一个程序看其功能很少认为编写程序简单,但到编的时候才发现一些细微的知识或低级错误经常犯做不到最后常常失败,所以有些东西只有学精弄懂并且要细心才行,只学习理论有些东西是很难理解的,更谈不上掌握。从这次的课程设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的练习的过程中才能提高,我想这就是我在这次课程设计中的最大收获。参考文献1 李叶紫王喜斌.胡辉.孙东辉.编著MCS_51单片机应用教程清华大学出版社2008.6.2 第二版.51系列单片机设计实例.北京航空航天大学出版社(8189页 时钟电路的设计).3 黄庆华、张永格.单片机开发 与实例.电子工业出版社(127-162页 数字式电子时钟的设计).4 闫玉德、俞红.MCS-51单片机原理与应用(C语言版).机械工业出版社(49-104页 单片机的C程序设计).附件C51源程序:#include #include #include #define uint unsigned int#define uchar unsigned charsbit IO = P10;sbit SCLK = P11;sbit RST = P12;sbit RS = P20;sbit RW = P21;sbit EN = P22;sbit ACC0 = ACC0;sbit ACC7 = ACC7;uchar *WEEK= SUN,*,MON,TUS,WEN,THU,FRI,SAT;uchar LCD_DSY_BUFFER1=DATE 00-00-00 ;uchar LCD_DSY_BUFFER2=TIME 00:00:00 ;uchar DateTime7;void DelayMS(uint ms) uchar i;while(ms-) for(i=0;i120;i+);void Write_A_Byte_TO_DS1302(uchar x) uchar i;for(i=0;i=1;/void Write1302(unsigned char ucAddr, unsigned char ucDa)/ucAddr: DS1302地址, ucData: 要写的数据/ Write_A_Byte_TO_DS1302(ucAddr); / 地址,命令 / Write_A_Byte_TO_DS1302(ucDa); / 写1Byte数据/ void DS1302InputByte(unsigned char d) /实时时钟写入一字节(内部函数) unsigned char i; ACC = d; for(i=8; i0; i-) IO = ACC0; /相当于汇编中的 RRC SCLK = 1; SCLK = 0; ACC = ACC 1; unsigned char DS1302OutputByte(void) /实时时钟读取一字节(内部函数) unsigned char i; for(i=8; i0; i-) ACC = ACC 1; /相当于汇编中的 RRC ACC7 = IO; SCLK = 1; SCLK = 0; return(ACC); void Write1302(unsigned char ucAddr, unsigned char ucDa)/ucAddr: DS1302地址, ucData: 要写的数据 RST = 0; SCLK = 0; SCLK = 1; DS1302InputByte(ucAddr); / 地址,命令 DS1302InputByte(ucDa); / 写1Byte数据 SCLK = 1; RST = 0; uchar Get_A_Byte_FROM_DS1302() uchar i,b=0x00;for(i=0;i8;i+) b |= _crol_(uchar)IO,i);SCLK=1;SCLK=0;return b/16*10+b%16;uchar Read_Data(uchar addr) uchar dat;RST = 0;SCLK=0;RST=1; Write_A_Byte_TO_DS1302(addr);dat = Get_A_Byte_FROM_DS1302(); SCLK=1;RST=0;return dat;void GetTime() uchar i,addr = 0x81;for(i=0;i7;i+) DateTimei=Read_Data(addr);addr+=2;uchar Read_LCD_State() uchar state;RS=0;RW=1;EN=1;DelayMS(1);state=P0;EN = 0;DelayMS(1);return state;void LCD_Busy_Wait() while(Read_LCD_State()&0x80)=0x80);DelayMS(5);void Write_LCD_Data(uchar dat) LCD_Busy_Wait();RS=1;RW=0;EN=0;P0=dat;EN=1;DelayMS(1);EN=0;void Write_LCD_Command(uchar cmd) LCD_Busy_Wait();RS=0;RW=0;EN=0;P0=cmd;EN=1;DelayMS(1);EN=0;void Init_LCD() Write_LCD_Command(0x38);DelayMS(1);Write_LCD_Command(0x01);DelayMS(1);Write_LCD_Command(0x06);DelayMS(1);Write_LCD_Command(0x0c);DelayMS(1);void Set_LCD_POS(uchar p) Write_LCD_Command(p|0x80);void Display_LCD_String(uchar p,uchar *s) uchar i;Set_LCD_POS(p);for(i=0;i16;i+)Write_LCD_Data(si);DelayMS(1); void Format_DateTime(uchar d,uchar *a) a0=d/10+0;a1=d%10+0;void InitUART (void) SCON = 0x50; / SCON: 模式 1, 8-bit UART, 使能接收 TMOD |= 0x20; / TMOD: timer 1, mode 2, 8-bit 重装/ TH1 = 0xFD; / TH1: 重装值 9600 波特率 晶振 11.0592MHz TH1 = 0xFD; /9600bps,晶振为11.0592MHz TL1 = 0xFD; TR1 = 1; / TR1: timer 1 打开 EA = 1; /打开总中断 ES = 1; /打开串口中断 unsigned char ucUart_OK = 0;/串口接受数据成功的标志位unsigned char ucRce_Buf6;/头 年 月 日 时 分 秒 尾unsigned char ucGet_Val6= 0; /0 12 3 4 5 6 7#define DATA_HEARD 0X88#define DATA_HEND 0X77/串口接收中断/*- 串口中断程序-*/void UART_SER (void) interrupt 4 /串行中断服务程序 unsigned char Temp; /定义临时变量 if(RI) /判断是接收中断产生 RI = 0; /标志位清零 Temp = SBUF; /读入缓冲区的值 / SBUF = Temp; /读入缓冲区的值 switch(ucUart_OK) case 0: if(Temp = DATA_HEARD) ucUart_OK+;ucUart_OK = 1; else ucUart_OK= 0; break; case 1: if(Temp = 99) ucUart_OK+;ucRce_Buf0 = Temp; else ucUart_OK= 0; break; case 2: if(Temp = 12) ucUart_OK+;ucRce_Buf1 = Temp; else ucUart_OK= 0; break; case 3: if(Temp = 31) /日 ucUart_OK+;ucRce_Buf2 = Temp; else ucUart_OK= 0; break; case 4: if(Temp = 24) ucUart_OK+;ucRce_Buf3 = Temp; else ucUart_OK= 0; break; case 5: if(Temp = 59) ucUart_OK+;ucRce_Buf4 = Temp; else ucUart_OK= 0; break; case 6: if(Temp = 59) ucUart_OK+;ucRce_Buf5 = Temp; else ucUart_OK= 0; break; case 7: if(Temp = DATA_HEND) ucUart_OK|=0x80; ucGet_Val0 = ucRce_Buf0; ucGet_Val1 = ucRce_Buf1; ucGet_Val2 = ucRce_Buf2; ucGet_Val3 = ucRce_Buf3; ucGet_Val4 = ucRce_Buf4; ucGet_Val5 = ucRce_Buf5; else ucUart_OK= 0; break; default: ucUart_OK = 0;break; /SBUF = ucUart_OK; /SBUF=Temp; /把接收到的值再发回电脑端 if(TI) /如果是发送标志位,清零 TI=0; void Reflah_Ti

温馨提示

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

评论

0/150

提交评论