C语言 怎么计算1s内的脉冲个数,求检测脉冲时间的C语言程序

cb6589b7b3cbf98822264432d6c1e081.png

娜美小宅女

2018.03.11

cb6589b7b3cbf98822264432d6c1e081.png

采纳率:58%    等级:42

已帮助:17万人

看了一下你的要求,单片机里有个GATE位的设置如果你懂得用,编这个程序就不难了。下面是我个人按照你要求刚编的程序:

/***********************

功能:内部定时/计数器记录脉冲个数和这些脉冲通过后所用的时间。

硬件:单片机用AT89c51,12M晶振。

原理:当门控位GATE为“1”时,TR0/1=1,INT0/1才能启动定时器。

利用这个特性可以测量外部输入脉冲的宽度。

分析:设外部脉冲由(P3.2)输入,T0工作于定时方式1(16位计数),

GATE设为1.测试时,应在INT0低电平时,设置TR0为1(避免检测

到正在进行的脉冲);当INT0为高电平时,就启动计数,INT0再

次变低时,停止计数。此计数值与机器周期的乘积即为被测正脉

冲的宽度。因晶振为12MHz,机器周期为1us.

************************/

#include

//sbit INT0=P3^2;//INT0在头文件里已定义为P3^2口

#define uint unsigned int

uint pulseWidth[30],num;

void init()

{

num=0;

TMOD=0x09;//选择定时器并设T0为方式1

TH0=0x00; //设计数初会为最大值

TL0=0x00;

}

main()

{

init();

while(1)

{

if(num<30) //记录30个脉冲

{

while(INT0);//等待INT0变低

TR0=1; //应在INT0低电平时,设置TR0为1

while(!INT0);//等待INT0变高,启动定时器开始计数

while(INT0); //等待INT0变低,停止定时器开始计数

TR0=0;

pulseWidth[num]=(uint)TL0;

pulseWidth[num]|=(uint)(TH0<<8);

//因机器周期为1us,故pulseWidth数组里存的数目加上单位us,

//即为所求的脉冲宽度

num++;

}

}

}追问:谢谢你!但是我还是疑问:问什么记录的是30个脉冲,我的意思是从P3^2输入方波信号,当方波信号结束时,求这段方波的正脉冲时间

10分享举报

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值