C52单片机中断定时系统思路和实现代码

本文介绍了一位博主在单片机课程设计中遇到的问题,原本打算使用DS1302时钟模块制作电子时钟,但发现题目要求不能使用该模块。博主决定利用刚学过的C52中断系统,通过TMOD寄存器设置16位定时器来实现。文中提供了定时器初始化函数和中断子程序的代码,并详细解释了中断工作原理及代码实现细节,用于每20毫秒更新一次时间显示。
摘要由CSDN通过智能技术生成

         最近拿到了单片机的课程设计题目,乍一看还挺简单的,就是一个简单的电子时钟,想都没想就直接把我arduinod的DS1302时钟模块拿来直接就做出来了,好家伙这两天仔细读了题目才发现直接指出了不能用DS1302。

         在上周才刚刚学了C52的中断系统,何不用中断系统做个定时器呢?

一.实现思路
 

         其实中断就是当某个中断请求源发出中断请求,并且断点中断请求被允许的话,单片机暂时中止当前正在执行的主程序,转到中断处理程序处理中断服务请求。中断服务请求处理完后,再回到原来被中止的程序之处(断点),继续执行被中断的主程序。

         52单片机里有TMOD,TCON,SCON,PCON,SBUF寄存器,   详情可以阅读这篇博客,在这里我就不在介绍了,那实现定时器功能我就采用TMOD寄存器,并且将其设置成方式一,16位定时器,同时将总中断(EA)打开,定时器中断(ET0)和定时器开关(TR0)打开。

二.代码实现

   在下面提供一个定时器初始化函数,在主函数中调用即可。

void init_time0(void)
{
 TMOD |= 0x01;	  //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响		     
 EA=1;            //总中断打开
 ET0=1;           //定时器中断打开
 TR0=1;           //定时器开关打开
}

    初始化完成后那就要写定时器中断子程序了,可直接粘贴使用 

void Timer0_ii(void) interrupt 1 
{
 static unsigned int num,i;
 TH0=(65536-2000)/256;//重新赋值 2ms
 TL0=(65536-2000)%256;
 
 // DigDisplay();     // 调用数码管扫描
i++;
 if(i==10)        	  //20ms更新一次
    {
	i=0;
	UpdateTimeFlag=1; 	//更新时间志位置1
	}
 num++;
 if(num==500)        //大致1s
   {
    num=0;
	second++;
	if(second==60) 		 //秒到60,分钟加1
	 {
	  second=0;	  
	  minute++;
	  if(minute==60)	//分钟到60,小时加1
	    {
		 minute=0;
		 hour++;
		 if(hour==24)		//小时到24,回零
		   hour=0;
		}
	 }
   
  }
}

注意子函数中没有定义的变量都为全局变量

如有错误欢迎大家指正,我会虚心学习的,感谢阅读!

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值