单片机课设·实时时钟及中断程序设计_第1页
单片机课设·实时时钟及中断程序设计_第2页
单片机课设·实时时钟及中断程序设计_第3页
单片机课设·实时时钟及中断程序设计_第4页
单片机课设·实时时钟及中断程序设计_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

1、中北大学单片机原理及接口技术课 程 设 计 说 明 书 题 目: 实时时钟及中断控制程序设计 中北大学单片机及其接口技术课 程 设 计 任 务 书 1设计目的:通过在单片机上实现实时时钟掌握单片机定时器的应用及中断工作原理。2设计内容和要求(包括原始数据、技术参数、条件、设计要求等):1、设计技术要求(1)时钟格式:时-分-秒,可在LED数码管上显示时钟或通过读取变量时钟值; (2)可设置初始时间; (3)时钟精度不小于单片机晶振精度。2、设计内容(1)设计定时器模式字、中断控制字,显示程序;(2)根据指标,合理计算有关参数,给出计算结果。(3)画出程序框图。(4)写出设计总结报告。设计报告主

2、要内容包括:设计目的与要求、系统技术指标或设计要求、程序设计方案、有关参数计算,控制字及设定依据,主要参考资料及心得体会等3单片机型号:89C52RC4. 时钟芯片: DS13025. 设计总结: 本设计利用单片机AT89C52RC控制串行实时时钟芯片DS1302构成数字时钟电路,实现计时功能。该电路使用简单的三线接口,为单片机节省大量的接口资源,时钟芯片DS1302带有后备电池,具备对后背电源进行涓细电流充电的能力,保证电路断电后仍保存时间和数据信息,这些优点解决了目前常用实时时钟占用单片机资源多以及计时不可靠等缺点。该时钟功能强大,性能优越,能为很多领域,特别是对时钟工作的精确性和可靠性有

3、较高要求的场合,提供较好的实时时钟。 目 录一、设计任务与要求11.1设计技术要求11.2设计内容要求1二、基本相关知识12.1定时器/计数器 12.2中断定义与功能22.3中断向量2三、设计内容 23.1程序流程图33.2程序清单4四、设计总结与体会 12五、附图13六、参考文献14一、设计任务与要求1、设计技术要求(1)时钟格式:时-分-秒,可在LED数码管上显示时钟或通过读取变量时钟值; (2)可设置初始时间; (3)时钟精度不小于单片机晶振精度。2、设计内容要求(1)设计定时器模式字、中断控制字,显示程序;(2)根据指标,合理计算有关参数,给出计算结果。(3)画出程序框图。二、基本相关

4、知识 1、定时器/计时器单片机中的定时器和计数器其实是同一个物理的电子元件,只不过计数器记录的是单片机外部发生的事情(接受的是外部脉冲),而定时器则是由单片机自身提供的一个非常稳定的计数器,这个稳定的计数器就是单片机上连接的晶振部件;单片机的晶振经过12分频之后提供给单片机的只有1MHZ的稳定脉冲;晶振的频率是非常准确的,所以单片机的计数脉冲之间的时间间隔也是非常准确的,这个准确的时间间隔是1微秒;单片机外接的是12MHZ的晶振(实际上是11.0592MHZ),所以,单片机内部的工作频率(时钟脉冲频率)是12MHZ/12=1MHZ=1000000次/秒=1000000条指令/秒=1000000

5、次/1000000微秒=1次/微秒=1条指令/微秒;也就是说,晶振振荡一次,就会给单片机提供一个时钟脉冲,花费的时间是1微秒,此时,CPU会执行一条指令,经历一个机器周期;即:1个时钟脉冲=1个机器周期=1微秒=1条指令;CPU主频是晶振经过倍频之后的频率,这一点恰好与单片机的相反,单片机的主频是晶振经过分频之后的频率;总之:单片机中的时间概念就是通过计数脉冲的个数来测量出来的;1个脉冲=1微秒=1条指令=1个机器周期; 8051系列单片机有两个定时器:T0和T1,分别称为定时器和定时器T1,这两个定时器都是16位的定时器/计数器;8052系列单片机增加了第三个定时器/计数器T2;它们都有定时

6、或事件计数功能,常用于时间控制、延时、对外部时间计数和检测等场合;2、中断定义及功能 中断系统是计算机的重要组成部分。实时控制、故障自动处理、计算机与外围设备间的数据传送往往采用中断系统。中断系统的应用大大提高了计算机效率.中断系统的功能有:(1)实现中断响应和中断返回当CPU收到中断请求后,能根据具体情况决定是否响应中断,如果CPU没有更急、更重要的工作,则在执行完当前指令后响应这一中断请求。CPU中断响应过程如下:首先,将断点处的PC值(即下一条应执行指令的地址)推入堆栈保留下来,这称为保护断点,由硬件自动执行。然后,将有关的寄存器内容和标志位状态推入堆栈保留下来,这称为保护现场,由用户自

7、己编程完成。保护断点和现场后即可执行中断服务程序,执行完毕,CPU由中断服务程序返回主程序,中断返回过程如下:首先恢复原保留寄存器的内容和标志位的状态,这称为恢复现场,由用户编程完成。然后,再加返回指令RETI,RETI指令的功能是恢复PC值,使CPU返回断点,这称为恢复断点。恢复现场和断点后,CPU将继续执行原主程序,中断响应过程到此为止。(2)实现优先权排队通常,系统中有多个中断源,当有多个中断源同时发出中断请求时,要求计算机能确定哪个中断更紧迫,以便首先响应。为此,计算机给每个中断源规定了优先级别,称为优先权。这样,当多个中断源同时发出中断请求时,优先权高的中断能先被响应,只有优先权高的

8、中断处理结束后才能响应优先权低的中断。计算机按中断源优先权高低逐次响应的过程称优先权排队,这个过程可通过硬件电路来实现,亦可通过软件查询来实现。(3)实现中断嵌套当CPU响应某一中断时,若有优先权高的中断源发出中断请求,则CPU能中断正在进行的中断服务程序,并保留这个程序的断点(类似于子程序嵌套),响应高级中断,高级中断处理结束以后,再继续进行被中断的中断服务程序,这个过程称为中断嵌套。如果发出新的中断请求的中断源的优先权级别与正在处理的中断源同级或更低时,CPU不会响应这个中断请求,直至正在处理的中断服务程序执行完以后才能去处理新的中断请求。 3、中断向量对应每一级中断都有一个向量,这些向量

9、顺序存放在主存的指定单元中。向量的内容是:相应的中断服务程序起始地址和处理机状态字(主要是指令地址)。在中断响应时,由中断部件提供中断向量的地址,就可取出该向量。三、设计内容1、程序流程图:开始发送同步开始命令定时器时钟初始化秒大于等于56秒加3延时等待设定标准时钟源实时中断时间设定实时中断 中断时间到延 时取消实时中断RTSYNYN2、程序清单:#include<reg52.h> /包含单片机寄存器的头文件#include<intrins.h> /包含_nop_()函数定义的头文件#define uchar unsigned char#define uint unsi

10、gned int/* 函数申明 -*/void Set_RTC(void);void Read_RTC(void);uchar Read_Ds1302 ( uchar address );void Write_Ds1302( uchar address,uchar dat );void Write_Ds1302_Byte(unsigned char temp);void senddata(void);void init_ds1302(void);void out(void);void Init_Timer0(void); /定时器初始化子程序void delay(uint z);/* 变量定义

11、 -*/sbit SCK=P36;/时钟sbit SDA=P34;/数据sbit RST=P35;/ DS1302复位unsigned char m;unsigned char flag;unsigned int count;sbit MOSIO=P22;sbit R_CLKa=P23;sbit S_CLKa=P24;uchar l_tmpdate7=0,0,23,3,8,11,20;/秒分时日月周年2011-07-14 12:00:00uchar l_tmpdisplay8;code uchar write_rtc_address7=0x80,0x82,0x84,0x86,0x88,0x8a

12、,0x8c; /秒分时日月周年 最低位读写位code uchar read_rtc_address7=0x81,0x83,0x85,0x87,0x89,0x8b,0x8d; unsigned char code fseg=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;unsigned char code segbit=0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01;unsigned char disbuf8=0,0,0,0,0,0,0,0;/* 函数名称 : main(void)* 函数功能 : 主函数*/v

13、oid main(void) /Init_Timer0();init_ds1302(); /Set_RTC(); /写入时钟值,如果使用备用电池时候,不需要没每次上电写入,此程序应该屏蔽while(1)Read_RTC();/if(flag=0)l_tmpdisplay7=l_tmpdate2/16;/数据的转换,因我们采用数码管09的显示,将数据分开l_tmpdisplay6=l_tmpdate2&0x0f;l_tmpdisplay5=10; /加入"-"l_tmpdisplay4=l_tmpdate1/16;l_tmpdisplay3=l_tmpdate1&am

14、p;0x0f;l_tmpdisplay2=10;l_tmpdisplay1=l_tmpdate0/16; l_tmpdisplay0=l_tmpdate0&0x0f;senddata(); out();/* 函数名称 : Timer0_isr(void) interrupt 1 using 1* 函数功能 : 定时器中断函数*/void Timer0_isr(void) interrupt 1 using 1TH0=0x00; /重新赋值,方式1是16位计数器,不能硬件重装初始值TL0=0x00;count+;if(count>=100)flag=flag; /led=led;c

15、ount=0;/* 函数名称 : Init_Timer0(void) /定时器初始化子程序* 函数功能 : 定时器初始化子程序*/void Init_Timer0(void) /定时器初始化子程序TMOD |= 0x01; /使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响 TH0=0x00; /给定初值,这里使用定时器最大值从0开始计数一直到65535溢出TL0=0x00;EA=1; /总中断打开ET0=1; /定时器中断打开TR0=1; /定时器开关打开/* 函数名称 : out(void)* 函数功能 : 数据输出*/void out(void)

16、 R_CLKa=0; delay(30); R_CLKa=1; /* 函数名称 : senddata (void)* 函数功能 : 数据传输*/void senddata (void) unsigned char b,c,num; if(b=0) b+;num=segbitm; for(c=0;c<8;c+) S_CLKa=0; MOSIO=num&0x80; num<<=1; S_CLKa=1; if(b=1) b-; if(m=2|m=5) num=0xbf; else /num=fsegdisbufm;num=fsegl_tmpdisplaym; for(c=0

17、;c<8;c+) S_CLKa=0; MOSIO=num&0x80; num<<=1; S_CLKa=1; m+; if(m=8) m=0; /* 函数名称 : Write_Ds1302_Byte(unsigned char temp)* 函数功能 : 写一个字节*/ void Write_Ds1302_Byte(unsigned char temp) uchar i;for (i=0;i<8;i+) /循环8次 写入数据 SCK=0;SDA=temp&0x01; /每次传输低字节 temp>>=1; /右移一位SCK=1;/* 函数名称 :

18、 Write_Ds1302( uchar address,uchar dat )* 函数功能 : 写入DS1302*/ void Write_Ds1302( uchar address,uchar dat ) RST=0;_nop_();SCK=0;_nop_();RST=1;_nop_(); /启动Write_Ds1302_Byte(address);/发送地址Write_Ds1302_Byte(dat);/发送数据RST=0; /恢复/* 函数名称 : Read_Ds1302 ( uchar address )* 函数功能 : 读出DS1302数据*/uchar Read_Ds1302 (

19、 uchar address )uchar i,temp=0x00;RST=0;_nop_();_nop_();SCK=0;_nop_();_nop_();RST=1;_nop_();_nop_();Write_Ds1302_Byte(address);for (i=0;i<8;i+) /循环8次 读取数据if(SDA)temp|=0x80;/每次传输低字节SCK=0;temp>>=1;/右移一位_nop_();_nop_();_nop_();SCK=1; RST=0;_nop_(); /以下为DS1302复位的稳定时间_nop_();RST=0;SCK=0;_nop_();

20、_nop_();_nop_();_nop_();SCK=1;_nop_();_nop_();SDA=0;_nop_();_nop_();SDA=1;_nop_();_nop_();return (temp);/返回/* 函数名称 : Read_RTC(void)* 函数功能 : 读时钟数据*/void Read_RTC(void) /读取 日历uchar i,*p;p=read_rtc_address; /地址传递for(i=0;i<7;i+) /分7次读取 秒分时日月周年l_tmpdatei=Read_Ds1302(*p);p+;/* 函数名称 : Set_RTC(void)* 函数功

21、能 : 设定时钟数据*/void Set_RTC(void) /设定 日历uchar i,*p,tmp;Write_Ds1302(0x8E,0X00);for(i=0;i<7;i+) /BCD处理tmp=l_tmpdatei/10;l_tmpdatei=l_tmpdatei%10;l_tmpdatei=l_tmpdatei+tmp*16; p=write_rtc_address;/传地址 for(i=0;i<7;i+)/7次写入 秒分时日月周年 Write_Ds1302(*p,l_tmpdatei); p+; Write_Ds1302(0x8E,0x80);/* 函数名称 :delay(uint z)* 函数功能 : 延时函数 延时0.1ms个单位*/void delay(uint z)whil

温馨提示

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

评论

0/150

提交评论