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

下载本文档

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

文档简介

目录TOC\o"1-5"\h\z\o"CurrentDocument"一、设计任务与要求 11.1设计技术要求 11.2设计内容要求 1\o"CurrentDocument"二、 基本相关知识 12.1定时器/计数器 12.2中断定义与功能 22.3中断向量 2三、 设计内容 23.1程序流程图 33.2程序清单 4四、 设计总结与体会 12\o"CurrentDocument"五、 附图 13\o"CurrentDocument"六、 参考文献 14一、设计任务与要求1、设计技术要求时钟格式:时-分-秒,可在LED数码管上显示时钟或通过读取变量时钟值;可设置初始时间;时钟精度不小于单片机晶振精度。2、设计内容要求设计定时器模式字、中断控制字,显示程序;根据指标,合理计算有关参数,给出计算结果。画出程序框图。二、基本相关知识1、定时器/计时器单片机中的定时器和计数器其实是同一个物理的电子元件,只不过计数器记录的是单片机外部发生的事情(接受的是外部脉冲),而定时器则是由单片机自身提供的一个非常稳定的计数器,这个稳定的计数器就是单片机上连接的晶振部件;单片机的晶振经过12分频之后提供给单片机的只有1MHZ的稳定脉冲;晶振的频率是非常准确的,所以单片机的计数脉冲之间的时间间隔也是非常准确的,这个准确的时间间隔是1微秒;单片机外接的是12MHZ的晶振(实际上是11.0592MHZ),所以,单片机内部的工作频率(时钟脉冲频率)是12MHZ/12=1MHZ=1000000次/秒=1000000条指令/秒=1000000次/1000000微秒=1次/微秒=1条指令/微秒;也就是说,晶振振荡一次,就会给单片机提供一个时钟脉冲,花费的时间是1微秒,此时,CPU会执行一条指令,经历一个机器周期;即:1个时钟脉冲=1个机器周期=1微秒=1条指令;CPU主频是晶振经过倍频之后的频率,这一点恰好与单片机的相反,单片机的主频是晶振经过分频之后的频率;总之:单片机中的时间概念就是通过计数脉冲的个数来测量出来的;1个脉冲=1微秒=1条指令=1个机器周期;8051系列单片机有两个定时器:T0和T1,分别称为定时器和定时器T1,这两个定时器都是16位的定时器/计数器;8052系列单片机增加了第三个定时器/计数器T2;它们都有定时或事件计数功能,常用于时间控制、延时、对外部时间计数和检测等场合;2、中断定义及功能中断系统是计算机的重要组成部分。实时控制、故障自动处理、计算机与外围设备间的数据传送往往采用中断系统。中断系统的应用大大提高了计算机效率.中断系统的功能有:(1)实现中断响应和中断返回当CPU收到中断请求后,能根据具体情况决定是否响应中断,如果CPU没有更急、更重要的工作,则在执行完当前指令后响应这一中断请求。CPU中断响应过程如下:首先,将断点处的PC值(即下一条应执行指令的地址)推入堆栈保留下来,这称为保护断点,由硬件自动执行。然后,将有关的寄存器内容和标志位状态推入堆栈保留下来,这称为保护现场,由用户自己编程完成。保护断点和现场后即可执行中断服务程序,执行完毕,CPU由中断服务程序返回主程序,中断返回过程如下:首先恢复原保留寄存器的内容和标志位的状态,这称为恢复现场,由用户编程完成。然后,再加返回指令RETI,RETI指令的功能是恢复PC值,使CPU返回断点,这称为恢复断点。恢复现场和断点后,CPU将继续执行原主程序,中断响应过程到此为止。(2)实现优先权排队通常,系统中有多个中断源,当有多个中断源同时发出中断请求时,要求计算机能确定哪个中断更紧迫,以便首先响应。为此,计算机给每个中断源规定了优先级别,称为优先权。这样,当多个中断源同时发出中断请求时,优先权高的中断能先被响应,只有优先权高的中断处理结束后才能响应优先权低的中断。计算机按中断源优先权高低逐次响应的过程称优先权排队,这个过程可通过硬件电路来实现,亦可通过软件查询来实现。(3)实现中断嵌套当CPU响应某一中断时,若有优先权高的中断源发出中断请求,则CPU能中断正在进行的中断服务程序,并保留这个程序的断点(类似于子程序嵌套),响应高级中断,高级中断处理结束以后,再继续进行被中断的中断服务程序,这个过程称为中断嵌套。如果发出新的中断请求的中断源的优先权级别与正在处理的中断源同级或更低时,CPU不会响应这个中断请求,直至正在处理的中断服务程序执行完以后才能去处理新的中断请求。3、中断向量对应每一级中断都有一个向量,这些向量顺序存放在主存的指定单元中。向量的内容是:相应的中断服务程序起始地址和处理机状态字(主要是指令地址)。在中断响应时,由中断部件提供中断向量的地址,就可取出该向量。三、设计内容1、程序流程图2、程序清单:#include<reg52.h> //包含单片机寄存器的头文件#includevintrins.h>//包含_nop_()函数定义的头文件#defineucharunsignedchar#defineuintunsignedint/*函数申明 */voidSet_RTC(void);voidRead_RTC(void);ucharRead_Ds1302(ucharaddress);voidWrite_Ds1302(ucharaddress,uchardat);voidWrite_Ds1302_Byte(unsignedchartemp);voidsenddata(void);voidinit_ds1302(void);voidout(void);voidInit_Timer0(void); //定时器初始化子程序voiddelay(uintz);/*变量定义 */sbitSCK=P3人6; 〃时钟sbitSDA=P3A4;〃数据sbitRST=P3A5;〃DS1302复位unsignedcharm;unsignedcharflag;unsignedintcount;sbitMOSIO=P2A2;sbitR_CLKa=P2A3;sbitS_CLKa=P2A4;ucharl_tmpdate[7]={0,0,23,3,8,11,20};//秒分时日月周年2011-07-1412:00:00ucharl_tmpdisplay[8];codeucharwrite_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};//秒分时日月周年最低位读写位codeucharread_rtc_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};unsigned char codefseg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};unsignedcharcodesegbit[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};unsignedchardisbuf[8]={0,0,0,0,0,0,0,0};/*** 函数名称 : main(void)** 函数功能 : 主函数*/voidmain(void){//Init_Timer0();init_ds1302();//Set_RTC();//写入时钟值,如果使用备用电池时候,不需要没每次上电写入,此程序应该屏蔽while(1){Read_RTC();//if(flag==0){l_tmpdisplay[7]=l_tmpdate[2]/16;〃数据的转换,因我们采用数码管0~9的显示,将数据分开l_tmpdisplay[6]=l_tmpdate[2]&0x0f;l_tmpdisplay[5]=10; //加入"-"l_tmpdisplay[4]=l_tmpdate[1]/16;l_tmpdisplay[3]=l_tmpdate[1]&0x0f;l_tmpdisplay[2]=10;l_tmpdisplay[1]=l_tmpdate[0]/16;l_tmpdisplay[0]=l_tmpdate[0]&0x0f;senddata();out();}}}/***函数名称:Timer0_isr(void)interrupt1using1**函数功能:定时器中断函数

*///重新赋值,方式1//重新赋值,方式1是16位计数器,不能硬件重装初TH0=0x00;始值TL0=0x00;count++;if(count>=100){flag=~flag;//led=~led;count=0;/*//定时器初始化子程序** 函数名称 : //定时器初始化子程序** 函数功能 : 定时器初始化子程序*/voidInit_Timer0(void){TMOD|=0x01;个定时器时不受影响*/voidInit_Timer0(void){TMOD|=0x01;个定时器时不受影响TH0=0x00;直到65535溢出TL0=0x00;EA=1;ET0=1;TR0=1;}//定时器初始化子程序//使用模式1,16位定时器,使用"|"符号可以在使用多//给定初值,这里使用定时器最大值从0开始计数一//总中断打开//定时器中断打开//定时器开关打开/*** 函数名称 : out(void)** 函数功能 : 数据输出*/voidout(void){R_CLKa=0;delay(30);R_CLKa=1;}/*** 函数名称 : senddata(void)** 函数功能 : 数据传输*/voidsenddata(void){unsignedcharb,c,num;if(b==0){b++;num=segbit[m];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=fseg[disbuf[m]];num=fseg[l_tmpdisplay[m]];for(c=0;c<8;c++){S_CLKa=0;MOSIO=num&0x80;num<<=1;S_CLKa=1;}}m++;if(m==8){m=0;}}/*** 函数名称 : Write_Ds1302_Byte(unsigned chartemp)** 函数功能 : 写一个字节*/voidWrite_Ds1302_Byte(unsignedchartemp){uchari;for(i=0;i<8;i++) //循环8次写入数据{SCK=0;SDA=temp&0x01;//每次传输低字节temp>>=1; //右移一位SCK=1;}}/*** 函数名称 : Write_Ds1302(ucharaddress,uchardat)** 函数功能 : 写入DS1302*/voidWrite_Ds1302(ucharaddress,uchardat){RST=0;_nop_();SCK=0;_nop_();RST=1;_nop_();//启动Write_Dsl302_Byte(address);〃发送地址Write_Ds1302_Byte(dat); //发送数据RST=0; //恢复}/***函数名称:Read_Dsl302(ucharaddress)**函数功能:读出DS1302数据*/ucharRead_Ds1302(ucharaddress){uchari,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_();_nop_();_nop_();_nop_();SCK=1;_nop_();_nop_();SDA=0;_nop_();_nop_();SDA=1;_nop_();_nop_();return(temp); //返回}/*** 函数名称 : Read_RTC(void)** 函数功能 : 读时钟数据*/voidRead_RTC(void){uchari,*p;p=read_rtc_address;for(i=0;i<7;i++)voidRead_RTC(void){uchari,*p;p=read_rtc_address;for(i=0;i<7;i++)//地址传递//分7次读取秒分时日月周年{l_tmpdate[i]=Read_Ds1302(*p);p++;}}/*** 函数名称 : Set_RTC(void)** 函数功能 : 设定时钟数据*/voidSet_RTC(void) //设定 日历{uchari,*p,tmp;Write_Ds1302(0x8E,0X00);for(i=0;i<7;i++){//BCD处理tmp=l_tmpdate[i]/10;l_tmpdate[i]=l_tmpdate[i]%10;l_tmpdate[i]=l_tmpdate[i]+tmp*16;}p=write_rtc_address;//传地址for(i=0;i<7;i++)//7次写入秒分时日月周年{Write_Ds1302(*p,l_tmpdate[i]);p++;}Write_Ds1302(0x8E,0x80);}/***函数名称 :delay(uintz)**函数功能:延时函数延时0.1ms个单位*/voiddelay(uintz){{ while(z--);}

//初始化DS1302voidinit_ds1302(){RST=0;SCK=

温馨提示

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

最新文档

评论

0/150

提交评论