学到了一种很精确测量脉冲宽度的方法。
具体思想是:
利用定时器的内部资源(当GATE = 1时,计数器的停止和开始受TR和INT的电平共同控制),我们这里用定时器0 ,将外部脉冲接在INT0上,配置定时器0和外部中断0。当脉冲是高电平时,计数器(TH0,TL0)计数,当计数器溢出时,触发定时器中断。当脉冲为下降沿时,触发外部中断,此时停止计数,所记下的时间也就是脉冲的宽度。
代码如下:
#include #include #define uint unsigned int #define uLint unsigned long int //长整型 uLint pulse_w = 0 ;//计算脉冲的时间,用长整型可以达到10的9次方us,如果用uint,最大只能达到65535us(还不到100ms) sbit in = P3^2 ; void Int0 (void) interrupt 0 { pulse_w += TL0 ; TL0 = 0 ; } void Time0(void) interrupt 1 { pulse_w += 256 ;//计数寄存器溢出,直接加最大值 } int main() { //初始化 TMOD = 0xA ; //定时器0,模式2,GATE0 = 1 TH0 = 0 ; //填初值 TL0 = 0 ; TR0 = 0 ; ET0 = 1 ;//开定时器0中断 IT0 = 1 ;//外部中断0下降沿触发中断 EX0 = 1 ;//开外部中断0 EA = 1 ;//开总中断 while(1) { if(in == 0)//见下面的解释 TR0 = 1 ; } } 信号函数: signal void test(double cc) { port3 &= ~(0x1<<2) ; swatch(1) ; port3 |= (0x1<<2) ; swatch(cc) ; port3 &= ~(0x1<<2) ; swatch(0.1) ; _break_ = 1 ; } 输入波形(脉冲高电平1s) 查看变量的值(0xF4240 = 1000000) 注释1:由于单片机复位后所有port都为高电平,所以如果不做一些措施的话,单片机一复位,计数器就会计数,造成测量误差。我的做法是:开始设TR0= 0,这样port3.2就无法开启计数器。当外部脉冲低电平时,我才让TR0 = 1,这时port3.2才能开启计数器,达到精准计时的要求 注释2:单片机的晶振为12M,所以时钟周期为1us 注释3:计算十六进制的数可以使用win7内部的计算器:使用很简单,自己点一点就会了
上一篇:51单片机测量脉冲周期
下一篇:51模拟SPI
推荐阅读最新更新时间:2024-11-13 16:15
设计资源 培训 开发板 精华推荐
- S5U2R72A04F0100、S2R72A系列LSI评估板手册
- [多P视频测试]PCB+铜柱作为骨架的全协议双向快充移动电源
- L4964 大电流开关稳压器的典型应用
- PI3302-00-EVAL1,使用 PI3302 Cool-Power ZVS 降压稳压器的评估板
- AOZ1284 EZBuck 4A 简单降压稳压器的典型应用
- 使用 Infineon Technologies AG 的 IRU1117 的参考设计
- LDK130C33R 3.3V、300mA 低静态电流极低噪声 LDO 的典型应用可调版本电路
- 使用 Infineon Technologies AG 的 OMR7815NH 的参考设计
- LT1372HVIS8 低纹波 5V 至 -3V Cuk 转换器的典型应用
- USB2TTL