单片机课设报告_第1页
单片机课设报告_第2页
单片机课设报告_第3页
单片机课设报告_第4页
单片机课设报告_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

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

文档简介

1、中北大学单片机课程设计说明书目 录1 引言 1 1.1 设计任务 1 1.2主要技术指标和要求11.3实验价值和理论意义12核心芯片简介2 2.1 DS1302简介22.1.1 DS1302引脚功能与内部结构32.1.2 DS1302的寄存器42.2 AT89C52简介43方案设计和论证 54软硬件设计 4.1硬件电路设计 54.2软件实现 104.2.1C语言的主程序104.2.2时钟读出程序设计134.2.3时钟调整程序设计135系统调试146总结14参考文献14附录:A:DS1302读写数据程序15附录B:主程序以及程序宏定义18附录C 23附录D:PCB制板25目录正文为: 宋体小四

2、1.5倍行距 目录要求独立编写页码,用罗马字母,如右下角所示I1、 引言1.1设计任务 用DS1302时钟芯片设计实时时钟。1.2主要技术指标和要求 (1)通过程序直接对实时时钟时间进行设置,启动时钟运行。用8位数码管实时显示时、分、秒。 (2)用89C52系列单片机及DS1302时钟电路,通过按钮对实时时钟时间进行设置,能输出阳历年、月、日及星期、小时、分、秒等计时信息的实时时钟。1.3实验价值和理论意义 从古代的滴漏更鼓到近代的机械钟,从电子表到目前的数字时钟,为了准确的测量和记录时间,人们一直在努力改进着计时工具。钟表的数字化,大力推动了计时的精确性和可靠性。在单片机构成的装置中,实时时

3、钟是必不可少的部件。目前常用的实时时钟,很多采用单片机的中断服务来实现,这种方式一方面需要采用计数器,占用硬件资源,另一方面需要设置中断、查询等,同样耗费单片机的资源,而且某些测控系统可能不允许;有的则使用并行接口的时钟芯片,如MC146818、DS12887等,它们虽然能满足单片机系统对实时时钟的要求,但是这些芯片与单片机接口复杂,占用地址、数据总线多,芯片体积大,占用空间多,给其它设计带来诸多不便。本设计选取串行接口时钟芯片DS1302与单片机同步通信构成数字时钟电路。其简单的三线接口能为单片机节省大量资源,DS1302的后背电源及对后背电源进行涓细电流充电的能力保证电路断电后仍能保存时间

4、和数据信息等。这些优点解决了目前常用的实时时钟所无法解决的问题。该时钟电路强大的功能和优越的性能,在很多领域的应用中,尤其是某些自动化控制、长时间无人看守的测控系统等对时钟精确性和可靠性有较高要求的场合,具有很高的使用价值。二、核心芯片简介2.1 DS1302简介 DS1302是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟芯片,它可以对年、月、日、周日、时、分、秒进行计时,且具有闰年补偿功能,工作电压宽达2.55.5V。时钟可工作在24小时格式或12小时(AM/PM)格式。 DS1302与单片机的接口使用同步串行通信,仅用3条线与之相连接。可采用一次传送一个字节或突发方式一

5、次传送多个字节的时钟信号或RAM数据。DS1302内部有一个318的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。2.1.1 DS1302引脚功能与内部结构 DS1302的引脚功能如表2-1所示,外形及内部结构如图2-1所示 表2-1 DS1302引脚功能表引脚号引脚名称引脚功能1VCC2主电源2,3X1,X2振荡源,外接32768HZ晶振4GND地线5RST复位/片选线6I/O串行数据输入/输出端(双向)7SCLK串行时钟输入端8VCC1后备电源 图2-1 DS1302

6、管脚图及内部结构图 2.1.2 DS1302的寄存器 DS1302共有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式 ,其时间寄存器及其控制字见表3-2 此外,DS1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器的内容。 DS1302与RAM相关的寄存器分为两类,一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H-FDH,其中奇数为读操作,偶数为写操作;再一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制

7、字为FEH(写)、FFH(读)。 表2-2 DS1302的时钟寄存器及其控制字。寄存器名命令字取值范围各位内容写操作读操作76543210秒寄存器80H81H00-59CH10SECSEC分寄存器82H83H00-59010MINMIN时寄存器84H85H00-2324010HRHR 2.2 AT89C52简介 图2-2 AT89S52引脚图 功能特性概括: AT89S52提供以下标准功能:40个引脚、4K Bytes Flash片内程序存储器、128 Bytes的随机存取数据存储器(RAM)、32个外部双向输入/输出(I/O)口、5个中断优先级2层中断嵌套中断、2个数据指针、2个16位可编程

8、定时/计数器、2个全双工串行通信口、看门狗(WDT)电路、片内振荡器及时钟电路。 三、方案设计和论证 使用串行接口时钟芯片DS1302设计时钟电路。该设计方案以单片机AT89C52为主控芯片,以串行时钟芯片DS1302为核心计时芯片,组成数字时钟电路。该电路不但能准确地计时、附加其它功能,而且,其三线接口可以节省接口资源,在断电后不丢失时间和数据信息。设计方案接口简单,计时可靠,综合性能良好。 图3-1 时钟芯片DS1302设计时钟四、软硬件设计 4.1硬件电路设计 LED数码管采用动态扫描方式显示,P0口为段码输出口,P2口为扫描驱动口,计时按键设计了2个,分别接在P3.5,P3.6口,用于

9、设定与加一调整。DS1302时钟芯片的晶挣频率为32.78KHz。秒表/时钟计时器的硬件电路如图,仿真 图4-1 总图 图4-2 数码管控制 图4-3 单片机控制芯片 图4-4 51单片机复位电路和晶振 图4-5 DS1302及外围电路 图4-6 按键控制 图4-7 显示时分秒 图4-8 显示年月日 图4-9 显示周秒4.2软件实现 4.2.1C语言的主程序 /*- 主函数-*/void main (void)unsigned char num,displaynum; Init_Timer0();Ds1302_Init();Ds1302_Write_Time();while (1) /主循环

10、num=KeyScan(); switch(num) case 1:time_buf14+;if(time_buf14=24)time_buf14=0; Ds1302_Write_Time();break; /正常时间 小时 加1case 2:time_buf15+;if(time_buf15=60)time_buf15=0; Ds1302_Write_Time();break;/分加1case 3:time_buf15-;if(time_buf15=255)time_buf15=59; Ds1302_Write_Time();break; /分减1case 4:time_buf16=0; D

11、s1302_Write_Time();break; /秒置零case 5:time_buf12+;if(time_buf12=13)time_buf12=1; Ds1302_Write_Time();break; /月加1case 6:time_buf13+;if(time_buf13=32)time_buf13=1; Ds1302_Write_Time();break; /日加1case 7:time_buf17+;if(time_buf17=8)time_buf17=1; Ds1302_Write_Time();break; /周加1case 8:displaynum+; if(displ

12、aynum=3) displaynum=0; break; /翻页default:break; if(ReadTimeFlag=1) ReadTimeFlag=0; Ds1302_Read_Time();if(displaynum=0) /显示时间 TempData0=DuanMatime_buf14/10;/时/数据的转换, TempData1=DuanMatime_buf14%10;/因我们采用数码管09的显示,将数据分开 TempData2=0x40; /加入- TempData3=DuanMatime_buf15/10;/分 TempData4=DuanMatime_buf15%10;

13、 TempData5=0x40; TempData6=DuanMatime_buf16/10;/秒 TempData7=DuanMatime_buf16%10; else if(displaynum=1)/显示日期 TempData0=DuanMatime_buf11/10;/年 TempData1=DuanMatime_buf11%10; TempData2=0x40; /加入- TempData3=DuanMatime_buf12/10;/月 TempData4=DuanMatime_buf12%10; TempData5=0x40; TempData6=DuanMatime_buf13/

14、10;/日 TempData7=DuanMatime_buf13%10; else if(displaynum=2)/显示周 秒 TempData0=0x40; TempData1=DuanMatime_buf17%10;/周 TempData2=0x40;/加入- TempData3=0; TempData4=0; TempData5=0; TempData6=DuanMatime_buf16/10;/秒 TempData7=DuanMatime_buf16%10; 4.2.2时钟读出程序设计 图5 时钟读出程序流程4.2.3时钟调整程序设计 图6 时钟调整程序流程五、系统调试 当一切准备就

15、绪,开始调试。先进行硬件调试,检查各个借口是否完美的接好。然后进行软件与硬件结合调试,因为整个系统含有很多个子程序,所以调试时把各个子程序分别调试,成功后进行整体调试。在硬件调试过程中发现了一些失误。比如:硬件出现焊接不牢靠,虚焊现象。六、总结 通过这一周的学习,我感觉有很大的收获:首先,通过这次课程设计使自己对课本上的知识可以应用于实际,使理论与实际相结合,加深自己对课本知识的更好理解,同时也段练了自己的动手能力:能够充分利用电脑去查阅资料,增加了许多课本以外的知识。更加了解了单片机原理及应用。增加了对DS1302和AT89C52芯片引脚结构和功能的理解及运用,在设计电路过程中,要考虑到整体

16、的美观性,连接电路时对各线路的连接要细致。在验证面电路效果时,出现了很多问题,其主要问题各个接线点之间错接没接上等。在这个过程中,锻炼了我的细心和耐性。参考文献1.孙涵芳.MCS-51/96系列 单片机原理及应用(修订版).北京航空航天大学出版社.1994 2.李朝青.单片机原理及接口技术(第3版).北京航空航天大学出版社.20053.楼然苗、李光飞,单片机课程设计指导M,北京,北京航空航天大学出版社,2007.07.4.蔡美琴等,MCS-51系列单片机系统及其应用(第二版)M,高等教学出版社,2004.06.5.楼然苗、胡佳文等,单片机实验与课程设计(PROTEUS仿真版)M,杭州,浙江大学

17、出版社,2010.10附录:A:DS1302读写数据程序#include ds1302.hunsigned char time_buf18 = 20,15,6,25,10,30,00,4;/空年月日时分秒周unsigned char time_buf8 ; /空年月日时分秒周/*- 向DS1302写入一字节数据-*/void Ds1302_Write_Byte(unsigned char addr, unsigned char d)unsigned char i;RST_SET;/写入目标地址:addraddr = addr & 0xFE; /最低位置零for (i = 0; i 1;/写入数

18、据:dfor (i = 0; i 1;RST_CLR;/停止DS1302总线/*- 从DS1302读出一字节数据-*/unsigned char Ds1302_Read_Byte(unsigned char addr) unsigned char i;unsigned char temp;RST_SET;/写入目标地址:addraddr = addr | 0x01;/最低位置高for (i = 0; i 1;/输出数据:tempfor (i = 0; i 1;if (IO_R) temp |= 0x80;else temp &= 0x7F;SCK_SET;SCK_CLR;RST_CLR;/停止

19、DS1302总线return temp;/*- 向DS1302写入时钟数据-*/void Ds1302_Write_Time(void) unsigned char i,tmp;for(i=0;i8;i+) /BCD处理tmp=time_buf1i/10;time_bufi=time_buf1i%10;time_bufi=time_bufi+tmp*16; Ds1302_Write_Byte(ds1302_control_add,0x00);/关闭写保护 Ds1302_Write_Byte(ds1302_sec_add,0x80);/暂停 /Ds1302_Write_Byte(ds1302_c

20、harger_add,0xa9);/涓流充电 Ds1302_Write_Byte(ds1302_year_add,time_buf1);/年 Ds1302_Write_Byte(ds1302_month_add,time_buf2);/月 Ds1302_Write_Byte(ds1302_date_add,time_buf3);/日 Ds1302_Write_Byte(ds1302_day_add,time_buf7);/周 Ds1302_Write_Byte(ds1302_hr_add,time_buf4);/时 Ds1302_Write_Byte(ds1302_min_add,time_b

21、uf5);/分Ds1302_Write_Byte(ds1302_sec_add,time_buf6);/秒Ds1302_Write_Byte(ds1302_day_add,time_buf7);/周 Ds1302_Write_Byte(ds1302_control_add,0x80);/打开写保护 /*- 从DS1302读出时钟数据-*/void Ds1302_Read_Time(void) unsigned char i,tmp;time_buf1=Ds1302_Read_Byte(ds1302_year_add);/年 time_buf2=Ds1302_Read_Byte(ds1302_m

22、onth_add);/月 time_buf3=Ds1302_Read_Byte(ds1302_date_add);/日 time_buf4=Ds1302_Read_Byte(ds1302_hr_add);/时 time_buf5=Ds1302_Read_Byte(ds1302_min_add);/分 time_buf6=(Ds1302_Read_Byte(ds1302_sec_add)&0x7F;/秒 time_buf7=Ds1302_Read_Byte(ds1302_day_add);/周 for(i=0;i8;i+) /BCD处理tmp=time_bufi/16;time_buf1i=ti

23、me_bufi%16;time_buf1i=time_buf1i+tmp*10; /*- DS1302初始化-*/void Ds1302_Init(void)RST_CLR;/RST脚置低SCK_CLR;/SCK脚置低 Ds1302_Write_Byte(ds1302_sec_add,0x00); 附录B:主程序以及程序宏定义/*- 名称:DS1302时钟数码管显示 内容:DS1302实时时钟数码管显示,时间和日期切换显示 按下按键,循环切换 时间格式xx-xx-xx日期格式xx-xx-xx周秒格式-x- xx-*/#include /包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的

24、定义#include ds1302.h#define KeyPort P3 /定义按键端口#define DataPort P0 /定义数据端口 程序中遇到DataPort 则用P0 替换sbit LATCH1=P27;/定义锁存使能端口 段锁存sbit LATCH2=P26;/ 位锁存bit ReadTimeFlag;/定义读时间标志unsigned char code DuanMa10=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;/ 显示段码值09unsigned char code WeiMa=0xfe,0xfd,0xfb,0xf7

25、,0xef,0xdf,0xbf,0x7f;/分别对应相应的数码管点亮,即位码unsigned char TempData8; /存储显示值的全局变量void DelayUs2x(unsigned char t);/us级延时函数声明 void DelayMs(unsigned char t); /ms级延时void Display(unsigned char FirstBit,unsigned char Num);/数码管显示函数unsigned char KeyScan(void);/键盘扫描void Init_Timer0(void);/定时器初始化/*- 主函数-*/void main

26、(void)unsigned char num,displaynum; Init_Timer0();Ds1302_Init();Ds1302_Write_Time();while (1) /主循环 num=KeyScan(); switch(num) case 1:time_buf14+;if(time_buf14=24)time_buf14=0; Ds1302_Write_Time();break; /正常时间 小时 加1case 2:time_buf15+;if(time_buf15=60)time_buf15=0; Ds1302_Write_Time();break;/分加1case 3

27、:time_buf15-;if(time_buf15=255)time_buf15=59; Ds1302_Write_Time();break; /分减1case 4:time_buf16=0; Ds1302_Write_Time();break; /秒置零case 5:time_buf12+;if(time_buf12=13)time_buf12=1; Ds1302_Write_Time();break; /月加1case 6:time_buf13+;if(time_buf13=32)time_buf13=1; Ds1302_Write_Time();break; /日加1case 7:ti

28、me_buf17+;if(time_buf17=8)time_buf17=1; Ds1302_Write_Time();break; /周加1case 8:displaynum+; if(displaynum=3) displaynum=0; break; /翻页default:break; if(ReadTimeFlag=1) ReadTimeFlag=0; Ds1302_Read_Time();if(displaynum=0) /显示时间 TempData0=DuanMatime_buf14/10;/时/数据的转换, TempData1=DuanMatime_buf14%10;/因我们采用

29、数码管09的显示,将数据分开 TempData2=0x40; /加入- TempData3=DuanMatime_buf15/10;/分 TempData4=DuanMatime_buf15%10; TempData5=0x40; TempData6=DuanMatime_buf16/10;/秒 TempData7=DuanMatime_buf16%10; else if(displaynum=1)/显示日期 TempData0=DuanMatime_buf11/10;/年 TempData1=DuanMatime_buf11%10; TempData2=0x40; /加入- TempData

30、3=DuanMatime_buf12/10;/月 TempData4=DuanMatime_buf12%10; TempData5=0x40; TempData6=DuanMatime_buf13/10;/日 TempData7=DuanMatime_buf13%10; else if(displaynum=2)/显示周 秒 TempData0=0x40; TempData1=DuanMatime_buf17%10;/周 TempData2=0x40;/加入- TempData3=0; TempData4=0; TempData5=0; TempData6=DuanMatime_buf16/1

31、0;/秒 TempData7=DuanMatime_buf16%10; /*- uS延时函数,含有输入参数 unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是 0255 这里使用晶振12M,精确延时请使用汇编,大致延时 长度如下 T=tx2+5 uS -*/void DelayUs2x(unsigned char t) while(-t);/*- mS延时函数,含有输入参数 unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是 0255 这里使用晶振12M,精确延时请使用汇编-*/void

32、 DelayMs(unsigned char t) while(t-) /大致延时1mS DelayUs2x(245); DelayUs2x(245); /*- 显示函数,用于动态扫描数码管 输入参数 FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示 如输入0表示从第一个显示。 Num表示需要显示的位数,如需要显示99两位数值则该值输入2-*/void Display(unsigned char FirstBit,unsigned char Num) static unsigned char i=0; DataPort=0; /清空数据,防止有交替重影 LATCH1=

33、1; /段锁存 LATCH1=0; DataPort=WeiMai+FirstBit; /取位码 LATCH2=1; /位锁存 LATCH2=0; DataPort=TempDatai; /取显示数据,段码 LATCH1=1; /段锁存 LATCH1=0; i+; if(i=Num) i=0;/*- 定时器初始化子程序-*/void Init_Timer0(void) TMOD |= 0x01; /使用模式1,16位定时器,使用|符号可以在使用多个定时器时不受影响 /TH0=0x00; /给定初值 /TL0=0x00; EA=1; /总中断打开 ET0=1; /定时器中断打开 TR0=1; /

34、定时器开关打开/*- 定时器中断子程序-*/void Timer0_isr(void) interrupt 1 static unsigned int num; TH0=(65536-2000)/256; /重新赋值 2ms TL0=(65536-2000)%256; Display(0,8); / 调用数码管扫描 num+; if(num=50) /大致100ms num=0; ReadTimeFlag=1; /读标志位置1/*- 按键扫描函数,返回扫描键值-*/unsigned char KeyScan(void) unsigned char keyvalue; if(KeyPort!=0xff) DelayMs(10); if(KeyPort!=0xff) keyvalue=KeyPort; while(KeyPort!=0xff);switch(keyvalue) case 0xfe:return 1;break; case 0xfd:return 2;break; case 0xfb:return 3;break; case 0xf7:return 4;break; c

温馨提示

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

评论

0/150

提交评论