展开全部
需求没说清楚,脉宽的具体宽度,数量级先搞清楚。对具体实施很关键的。
方法有一下:
1、如果单片机有捕捉功能,则在沿上捕捉后记录定时器时间,然后计算出时间,即可比较输出信号。
2、如果没有,接入单片机的中断管脚(上下沿中断,如果没有,进入后立马改变下次中断触发方式,进行上升下降沿中断的切换),单片机外部中断服务中记录定时器时间,然后下次中断来临后计算时间,即可比较输出信号。
3、如果都没有,功能且单一,脉宽比较宽,要求不高,硬件又没有在中断管脚上,可以考虑主程序定时查询,记录时间。
5ms,很宽的,如果功能单一的话,定时器都可以免了,直接用单片机指令周期算时间,定义一个长整型变量,不断监测管脚,监测完变量加一,后再比较。
不过呢,希望还是用我提到的方法2吧,通用些。具体实施自己多想想,另位朋友的代码慎重使用,问题较多,不一一说明了
方法有一下:
1、如果单片机有捕捉功能,则在沿上捕捉后记录定时器时间,然后计算出时间,即可比较输出信号。
2、如果没有,接入单片机的中断管脚(上下沿中断,如果没有,进入后立马改变下次中断触发方式,进行上升下降沿中断的切换),单片机外部中断服务中记录定时器时间,然后下次中断来临后计算时间,即可比较输出信号。
3、如果都没有,功能且单一,脉宽比较宽,要求不高,硬件又没有在中断管脚上,可以考虑主程序定时查询,记录时间。
5ms,很宽的,如果功能单一的话,定时器都可以免了,直接用单片机指令周期算时间,定义一个长整型变量,不断监测管脚,监测完变量加一,后再比较。
不过呢,希望还是用我提到的方法2吧,通用些。具体实施自己多想想,另位朋友的代码慎重使用,问题较多,不一一说明了
追问
能不能给个程序,谢谢啦
展开全部
可以的,用外部中断0(1)和一个定时器可以搞掂,当然需要设置定时器的GATE位为1.程序如下:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit LED=P1^0;
sbit p32=P3^2;
main()
{
uint time;
TMOD=0x09;
IT0=1;
LED=1;
while(1)
{
TH0=0;
TL0=0;
while(p32);
TR0=1;
while(!p32);
while(p32);
TR0=0;
time=TH0*256+TL0;
if(time<5000)LED=0;
}
}
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit LED=P1^0;
sbit p32=P3^2;
main()
{
uint time;
TMOD=0x09;
IT0=1;
LED=1;
while(1)
{
TH0=0;
TL0=0;
while(p32);
TR0=1;
while(!p32);
while(p32);
TR0=0;
time=TH0*256+TL0;
if(time<5000)LED=0;
}
}
追问
请问你测试过了吗,谢谢您了
追答
测试过,没有问题
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
如果晶振频率是 12MHz,脉宽,测量到 65535us,还是很轻松的。
但是,题目要求,测量脉宽的最小值!
要知道,被测量的脉冲,可不能太小了。
你要是说:小于等于0.3us,则输出一个信号,比如灯亮,大于0.3,灯灭
这可就办不到了。呵呵
但是,题目要求,测量脉宽的最小值!
要知道,被测量的脉冲,可不能太小了。
你要是说:小于等于0.3us,则输出一个信号,比如灯亮,大于0.3,灯灭
这可就办不到了。呵呵
追问
如果脉宽在1.5到5ms之间,能不能麻烦给个程序,万分感谢
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询