TI的CC2530单片机检测不同类型的方波

之前仅检测过一个引脚上一种方波信号,现在要再引脚上区分三种不同的波形。着实头大了好一会儿。

要检测的三种波形如下图所示:


每种波形的持续长度为500us,时间间隔为10ms.

比如我们在P0_2上检测这个波形,首先要对P0_2进行初始化操作,允许中断检测,这里就不详细介绍了。

从三种波形图来看,起始都是高电平,然后拉低为低电平之后,开始产生波形,因此首先通过中断检测到下降沿,则表示波形开始。

区分原理如下:

1. 从低电平到高电平,说明波形开始。

2. 延时到位置1,如果还是低电平,则表示波形1.

  延时到位置2,如果还是低电平,则表示波形2.

  延时到位置3,为高电平,且延时到位置4为低电平,则为波形3.

3. 重复2的检测,知道持续出现700us左右的高电平,表示波形结束。

  当然这个持续时间可以根据自己需求来定义。


注意:延时函数必须非常准确,可参考我的另一博客:延时函数


参考代码如下:


    bool over=false;
    uint8 btype=0;
	if(Status2==0||(P0IFG&BV(0))>0) 
		{			
		while(!over){
		//检测波形
		while(Status2==0);//如果2一直为低电平,则直到检测到高电平结束
		Delay_us_New(75);//延时100us
		if(Status2==0){		
		    Delay_us_New(90); 
		    if(Status2==1)
				btype=1;
			Delay_us_New(75); 
			Delay_us_New(75);
		    Delay_us_New(75);
		}
		else
		{
			Delay_us_New(130); //延时170微妙
			if(Status2==0){								
				btype=2;
				Delay_us_New(75);
		        Delay_us_New(75);
				}
			else
			{	
			    Delay_us_New(130); 
				Delay_us_New(75);
				if(Status2==0)
					btype=3;
			}	
		}
               //670us左右仍是高电平
		Delay_us_New(75);
		Delay_us_New(75);
		if(Status2!=0){
			//表示波形结束
			over=true;
		}			
	}
    }


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于AT89C51单片机方波信号发生器代码: ```c #include <reg51.h> #define FREQ_MIN 10 // 最小频率 #define FREQ_MAX 1000 // 最大频率 #define FREQ_STEP 10 // 频率变化步长 sbit KEY_INC = P1^0; // 增加频率的按键 sbit KEY_DEC = P1^1; // 减少频率的按键 unsigned int freq = 100; // 初始频率为100Hz void delay(unsigned int t) // 延时函数 { unsigned int i, j; for (i = 0; i < t; i++) for (j = 0; j < 125; j++); } void main() { TMOD = 0x10; // 设置定时器1为工作模式1 TH1 = 0xFD; // 波特率9600 TL1 = 0xFD; SCON = 0x50; // 串口工作模式1 TR1 = 1; // 启动定时器1 TI = 1; // 允许发送数据 while (1) { if (!KEY_INC) // 按下增加频率的按键 { delay(20); // 延时去抖动 if (!KEY_INC) // 再次检测按键是否按下 { freq += FREQ_STEP; // 增加频率 if (freq > FREQ_MAX) // 频率超过最大值则重置为最小值 freq = FREQ_MIN; TH1 = 256 - (11059200 / 12 / freq); // 重新设置定时器1的计数初值 while (!KEY_INC); // 等待按键释放 } } if (!KEY_DEC) // 按下减少频率的按键 { delay(20); // 延时去抖动 if (!KEY_DEC) // 再次检测按键是否按下 { freq -= FREQ_STEP; // 减少频率 if (freq < FREQ_MIN) // 频率低于最小值则重置为最大值 freq = FREQ_MAX; TH1 = 256 - (11059200 / 12 / freq); // 重新设置定时器1的计数初值 while (!KEY_DEC); // 等待按键释放 } } } } void serial() interrupt 4 // 串口中断服务函数 { if (RI) // 接收到数据 { RI = 0; // 清除接收中断标志 } if (TI) // 发送数据 { TI = 0; // 清除发送中断标志 SBUF = freq; // 发送频率值 } } ``` 该代码实现了一个基于AT89C51单片机方波信号发生器,可以通过按键调整方波信号的频率,并将频率值通过串口发送给上位机。具体实现过程如下: 1. 定义了最小频率、最大频率频率变化步长等常量。 2. 定义了一个延时函数,用于去抖动。 3. 在主函数中,设置了定时器1为工作模式1,设置了波特率为9600,启动了定时器1,并允许发送数据。 4. 进入一个无限循环,检测是否按下增加频率或减少频率的按键,如果按下则增加或减少频率,并重新设置定时器1的计数初值,等待按键释放。 5. 定义了一个串口中断服务函数,用于发送频率值给上位机。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值