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

单片机用c语言编一个程序,要求用内部定时/计数器对30个脉冲进行计数,并同时对这三十个脉冲进行计时。
就是用c语言编一个,同时用内部定时/计数器记录脉冲个数和这些脉冲通过后所用的时间。单片机用AT89c51,12M晶振。

看了一下你的要求,单片机里有个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++;
}
}
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-10-14
你首先须确定脉冲的频率,
第2个回答  2010-10-19
你的30个脉冲会不会超出定时器的范围呢?没有悬赏,只能回答这么多...

单片机用c语言编一个程序,要求用内部定时\/计数器对30个脉冲进行计数,并...
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);\/...

...程序设计:对传感器传出的脉冲信号进行计数,并同时进行计时,当计数达 ...
我记得用一个定时器和一个外部中断就可以搞定

c语言怎么样编写一个时钟程序
iAngle[0]=(pst->wHour*30)%360+pst->wMinute\/2;

本人菜鸟,写了一段单片机(c语言)测频率的程序,有两个问题
void mian(viod)??这是什么意思?应该是void main(void)吧,这种细节问题不注意很难写出高质量的程序哦,再说了,TH1=0x3C; TL1=0xAF; \/\/50ms???应该是TH1=0x3C; \/\/50ms TL1=0xB0;600脉冲也很简单啊, 用600作初值,算出TH0和TL0,然后写出中断服务程序,主函数中设置点P1口LED灯...

用单片机对外来脉冲计数(C语言程序)
要设定16位定时读数器T0或T1,工作方式1、2、3,计数值最大为65536=0xFFFFH,即给高低位分别装入计数初始值TH0(TH1)=FFH,TL0=FFH,可设为中断函数,当计数溢出后自动引发中断,在程序运行时调用即可~键盘设置到处都有,搜一下就行了

利用定时\/计数器产生定时时钟,由P1口控制8个指示灯,编写程序(c语言写...
重置初值,清除溢出位 } TR0=0; \/\/ 关闭定时器}void main(){ while(1) { P1=_crol_(P1); delay(); \/\/ 延时 } 你要告诉我你的单片机的时钟频率,不然没法计算计数初值的

用C语言编写8051单片机程序
{ if(stop==1)\/\/判断stop信号,为1后便关闭定时器 { TR0=0;ET0=0;EA=0;} } } \/***中断***\/ void timer0() interrupt 1 { TH0=0xf8;\/\/重新赋值定时2ms TL0=0x30;if(flag==0)\/\/定义用于判断计数是否到了250,若到了则不再计数,转向else执行流水灯闪烁任务 { t++;if(t==50...

求一个51单片机定时闹钟程序。要C语言。能够调时间
我来发一个C语言51单片机时钟程序,希望能帮到你 \/* 程序功能:带定时闹铃时钟 *\/ \/*---*\/ include <AT89X51.H> \/*包含器件配置文件*\/ define uchar unsigned char define uint unsigned int char DATA_7SEG[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,};\/*...

51单片机用C语言编写程序实现从30H单元开始的连续10个单元取数,一次存...
mov a,30h ;只是把地址为30h的单元中的内容传给a (30h)=40h应该是在前面保存的值,与这句话无关的

用c语言编写一个计数器(单片机为51型,数码管为共阴)要求有三个按键分别...
一看到你说是计数器,又看到你要求有停止功能,意思是把Timer改为计数器,然后可以通过一个键停止计数对吧?如果这样的话挺简单的,51单片机的计数器io口记得好像是P3^0和P3^1,但不管怎么,首先设置TMOD,将C\/T位置1,这就改为计数器了,然后可以编写函数来对一个变量进行加减;同样利用51单片机的...

相似回答