基于STC89C52RC单片机实现定时计数功能(附源码及打包hex烧录文件)

项目要求

  • 两种不同的电路板由于某一个IC程序烧录版本不一致,需区分这两种电路板。
  • 两种电路板外观完全一致,通过示波器读出只有第一次出现的波形群波形个数有区别。

实现思路

  • 在第一次波形群出现的时间内对波形计数。
  • 通过外部中断下降沿触发计数功能。在下降沿触发的中断函数里对变量count做自加一处理。
  • 第一次进入外部中断即开启定时中断,这里通过count值是否为1来实现第一次进外部中断才开启定时中断开关。
  • 一旦进入定时中断函数我们即关闭所有中断。停止计数和定时,以到达我们只对前50ms计数来区分波形数。
  • main方法内我们通过死循环来一直监控Count值,为了锁死电平的状态,我们在对进入定时中断后关闭所有中断后flag置为2,判断flag为2进入一个死循环,锁死运行状态,不让main方法自上而下重复执行。

代码展示

/*****************************************************************
author:GuoZhiQiang
date:2019-10-07
*****************************************************************/
#include <reg51.h>
#include <intrins.h>

sbit INPUT = P3^2;			//测试信号输入P3.2
sbit OUTPUT = P2^0;		//测试信号输出P2.0

unsigned int Count = 0;		 //创建Count全局变量计数
unsigned int flag = 0;		 //标志是否开启定时中断 0为未开启 1为已开启
unsigned int Times = 0;		 //给进入定时中断计数

/*************************************************************************
	延时函数
*************************************************************************/

void Delay(unsigned int i)
{
unsigned int j;
for(;i>0;i--)
for(j=0;j<125;j++)
{;}
}

/*************************************************************************
	 Count计数大于8,OUTPUT输出高电平1
	 Count计数小于8,OUTPUT输出低电平0
*************************************************************************/
void doSomeThing(){
  if (Count>=8)
  {
  	  OUTPUT=1;
  }
  else
  {
	  OUTPUT=0;
  }	
}


/**************************************************************************
	初始化外部中断设置
**************************************************************************/
void Init_INT0(void)
{
	EA=1; //首先开启总中断	
	EX0=1; //开启外部中断	
	IT0=1; //设置成下降沿触发,0为低电平触发,1为下降沿触发
	
}
/**************************************************************************
	初始化定时器中断设置
**************************************************************************/

void Init_TIME0(void)
{
	TMOD = 0x01;
	TH0 = (65535-50000)/256;
    TL0 = (65535-50000)%256;//定时器1定时50mS
	ET0 = 1;//开启定时器中断
	TR0 = 0;//定时器0暂不开启
}


/**************************************************************************
	 程序主入口:
	 无限循环对Count进行判断,如果Count大于X则输出高电平,否则低电平
**************************************************************************/
void main()
{
	PT1 = 1;//设定定时器中断优先
	Init_INT0();
	Init_TIME0();
	while(1){
		if (flag=2)
		{
			while(1);//自锁程序,使得main方法不再自上而下重复执行,OUTPUT稳定输出电平
		}
		else
		{
			doSomeThing();//判断计数执行对应输出
		}
			  	  										
	}
}

/**************************************************************************
	下降沿触发中断计数
**************************************************************************/
void INT0Interrupt(void) interrupt 0  using 0
{
		Count++;
		if(Count==1){
		   TR0=1;//开启定时器中断
		   flag=1;//flag置为1 标志开启定时器中断
		}					   
}

/*************************************************************************
	定时器0中断 当进入第二次定时中断定时器1定时100mS,关闭总中断不会再计数
*************************************************************************/

void TIME0Interrrupt(void) interrupt 1 using 0 
{
		Times++;
		TH0 = (65535-50000)/256;
   		TL0 = (65535-50000)%256;//定时器1定时50mS
		if(Times==2){
		EX0=0;//关闭外部中断  
		TR0=0;//关闭定时器中断
		EA=0;//关闭总中断
		flag=2;
		}			
}

如果你对外部中断有疑问戳这里.
如果你对定时中断有疑问戳这里.

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值