单片机用c语言编一个程序,要求用内部定时/计数器对30个脉冲进行计数,并同时对这三十个脉冲进行计时。

单片机用c语言编一个程序,要求用内部定时/计数器对30个脉冲进行计数,并同时对这三十个脉冲进行计时。就是用c语言编一个,同时用内部定时/计数器记录脉冲个数和这些脉冲通过后... 单片机用c语言编一个程序,要求用内部定时/计数器对30个脉冲进行计数,并同时对这三十个脉冲进行计时。
就是用c语言编一个,同时用内部定时/计数器记录脉冲个数和这些脉冲通过后所用的时间。单片机用AT89c51,12M晶振。
展开
 我来答
dosculler
推荐于2016-06-01 · TA获得超过106个赞
知道小有建树答主
回答量:81
采纳率:0%
帮助的人:97.9万
展开全部
看了一下你的要求,单片机里有个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 <reg51.h>
//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++;
}
}
}
百度网友87ac042
2010-10-14
知道答主
回答量:21
采纳率:0%
帮助的人:7.3万
展开全部
你首先须确定脉冲的频率,
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
电力物联网小学生
2010-10-19 · TA获得超过480个赞
知道小有建树答主
回答量:249
采纳率:0%
帮助的人:87.8万
展开全部
你的30个脉冲会不会超出定时器的范围呢?没有悬赏,只能回答这么多...
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式