《实时时钟及中断控制程序设计》由会员分享,可在线阅读,更多相关《实时时钟及中断控制程序设计(18页珍藏版)》请在金锄头文库上搜索。
1、目录一、 设计任务与要求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) 画出程序框图。二、基本相关知识1、定时器/计时器单片机中的定
2、时器和计数器其实是同一个物理的电子元件,只不过计数器记录 的是单片机外部发生的事情 (接受的是外部脉冲 ),而定时器则是由单片机自身提 供的一个非常稳定的计数器,这个稳定的计数器就是单片机上连接的晶振部件;单 片机的晶振经过12分频之后提供给单片机的只有1MHZ的稳定脉冲;晶振的频率 是非常准确的,所以单片机的计数脉冲之间的时间间隔也是非常准确的,这个准确 的时间间隔是1微秒;单片机外接的是12MHZ的晶振(实际上是11.0592MHZ),所 以,单片机内部的工作频率 (时钟脉冲频率)是 12MHZ/12=1MHZ=1000000 次/秒 =1000000 条指令/秒=1000000 次/10
3、00000 微秒=1 次/微秒=1 条指令/微秒;也就是 说,晶振振荡一次 ,就会给单片机提供一个时钟脉冲 ,花费的时间是 1 微秒,此 时,CPU会执行一条指令,经历一个机器周期;即:1个时钟脉冲=1个机器周期=1微 秒=1条指令;CPU主频是晶振经过倍频之后的频率,这一点恰好与单片机的相反, 单片机的主频是晶振经过分频之后的频率;总之:单片机中的时间概念就是通过计数脉冲的个数来测量出来的;1 个脉冲=1 微 秒=1条指令=1个机器周期;8051系列单片机有两个定时器:T0和T1,分别称为 定时器和定时器T1,这两个定时器都是16位的定时器/计数器;8052系列单片机 增加了第三个定时器/计
4、数器T2;它们都有定时或事件计数功能,常用于时间控 制、延时、对外部时间计数和检测等场合;2、中断定义及功能 中断系统是计算机的重要组成部分。实时控制、故障自动处理、计算机与外 围设备间的数据传送往往采用中断系统。中断系统的应用大大提高了计算机效率. 中断系统的功能有:(1)实现中断响应和中断返回当 CPU 收到中断请求后,能根 据具体情况决定是否响应中断,如果 CPU 没有更急、更重要的工作,则在执行完 当前指令后响应这一中断请求。CPU中断响应过程如下:首先,将断点处的PC 值(即下一条应执行指令的地址)推入堆栈保留下来,这称为保护断点,由硬件 自动执行。然后,将有关的寄存器内容和标志位状
5、态推入堆栈保留下来,这称为 保护现场,由用户自己编程完成。保护断点和现场后即可执行中断服务程序,执 行完毕,CPU由中断服务程序返回主程序,中断返回过程如下:首先恢复原保留 寄存器的内容和标志位的状态,这称为恢复现场,由用户编程完成。然后,再加 返回指令 RETI,RETI 指令的功能是恢复 PC 值,使 CPU 返回断点,这称为恢复断 点。恢复现场和断点后,CPU将继续执行原主程序,中断响应过程到此为止。(2) 实现优先权排队通常,系统中有多个中断源,当有多个中断源同时发出中断请求 时,要求计算机能确定哪个中断更紧迫,以便首先响应。为此,计算机给每个中 断源规定了优先级别,称为优先权。这样,
6、当多个中断源同时发出中断请求时, 优先权高的中断能先被响应,只有优先权高的中断处理结束后才能响应优先权低 的中断。计算机按中断源优先权高低逐次响应的过程称优先权排队,这个过程可 通过硬件电路来实现,亦可通过软件查询来实现。(3)实现中断嵌套当 CPU 响应 某一中断时,若有优先权高的中断源发出中断请求,则 CPU 能中断正在进行的中 断服务程序,并保留这个程序的断点(类似于子程序嵌套),响应高级中断,高 级中断处理结束以后,再继续进行被中断的中断服务程序,这个过程称为中断嵌 套。如果发出新的中断请求的中断源的优先权级别与正在处理的中断源同级或更 低时,CPU不会响应这个中断请求,直至正在处理的
7、中断服务程序执行完以后才 能去处理新的中断请求。3、中断向量 对应每一级中断都有一个向量,这些向量顺序存放在主存的指定单元中。向量 的内容是:相应的中断服务程序起始地址和处理机状态字(主要是指令地址)。 在中断响应时,由中断部件提供中断向量的地址,就可取出该向量。三、设计内容1、程序流程图2、程序清单:#include/包含单片机寄存器的头文件#includevintrins.h /包含_nop_()函数定义的头文件 #define uchar unsigned char #define uint unsigned int/* 函数申明 */void Set_RTC(void);void Re
8、ad_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);/* 变量定义 */sbit SCK=P3人6;时钟sbit SDA=P3A4; 数据sbit RST=P
9、3A5; DS1302 复位unsigned char m;unsigned char flag;unsigned int count;sbit MOSIO=P2A2;sbit R_CLKa=P2A3;sbit S_CLKa=P2A4;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,0x8c; / 秒分时日月周年 最低位读写位code uchar
10、read_rtc_address7=0x81,0x83,0x85,0x87,0x89,0x8b,0x8d;unsignedcharcodefseg=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;/*#J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J*函数
11、名称:main(void)*函数功能:主函数#J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J*#J* #J* #J* #J* #J* #J* #J*
12、 #J* #J* #J* #J* #J* #J* #J* #J* #J* #J*/void 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/1
13、6; l_tmpdisplay3=l_tmpdate1&0x0f;l_tmpdisplay2=10;l_tmpdisplay1=l_tmpdate0/16;l_tmpdisplay0=l_tmpdate0&0x0f;senddata();out();/*#J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #
14、J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J*#J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* 函数名称 : Timer0_isr(void) interrupt 1 using 1 * 函数功能 : 定时器中断函数#J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J*/重新赋值,方式 1 是16 位计数器,不能硬件重装初
15、void Timer0_isr(void) interrupt 1 using 1 TH0=0x00;始值TL0=0x00; count+; if(count=100) flag=flag; /led=led; count=0;/*#J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J*