项目要求
- 两种不同的电路板由于某一个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;
}
}