每50ms来了多少脉冲,那定时器就不能50ms中断一次,尽量快的中断会比较好,2个变量计数,一个计算50ms,一个累加脉冲
㈡ 求大神帮忙写个51单片机的接收脉冲程序。
用计数器T1的中断控制蜂鸣器发出1KHz音频
#include<reg51.h> // 包含51单片机寄存器定义的头文件
sbit sound=P3^7; //将sound位定义为P3.7引脚
/**************************************************************
函数功能:主函数
**************************************************************/
void main(void)
{
EA=1; //开总中断
ET1=1; //定时器T1中断允许
TMOD=0x10; //TMOD=0001 000B,使用定时器T1的模式1
TH1=(65536-921)/256; //定时器T1的高8位赋初值
TL1=(65536-921)%256; //定时器T1的高8位赋初值
TR1=1; //启动定时器T1
while(1)//无限循环等待中断
;
}
/**************************************************************
函数功能:定时器T1的中断服务程序
**************************************************************/
void Time1(void) interrupt 3 using 0 //“interrupt”声明函数为中断服务函数
{
sound=~sound;
TH1=(65536-921)/256; //定时器T1的高8位重新赋初值
TL1=(65536-921)%256; //定时器T1的高8位重新赋初值
}
改改 就成了你的
㈢ 如何编程实现51单片机每隔 t 时间发出一个脉冲求C语言详细编程。。。
给你个基本框架,根据你的具体要求再修改吧。使用定时1中断实现,精度比较高。
#include <reg52.h>
#define PERIODH (65536l-10000l)/0X100 //设10ms中断1次TH1初值
#define PERIODL (65536l-10000l)%0X100 //设10ms中断1次TL1初值
sbit P1_1 = 0x91; //假设从P1.1输出脉冲
unsigned int iCount; //延时间隔时间变量
unsigned int iPulseCount; //脉冲脉宽时间变量
void timer1() interrupt 3 using 1
{//定时器每0.01秒一次中断
TH1 = PERIODH;
TL1 = PERIODL;
if(iCount)
{//计数未到0,计数器-1
iCount--;
}
if(iPulseCount)
{//计数未到0,计数器-1
iPulseCount--;
}
}
main()
{
TMOD = 0X10;//方式1
EA = 1;//总中断允许
ET1 = 1;//定时器1中断允许
TR1 = 1;//启动定时器1
P1_1 = 0; //脉冲输出端口,假设输出正脉冲,预置为低电平
while(1)
{
iCount = 200;//每间隔200*10ms = 2秒一个脉冲,t值变化改此处
while(iCount);//等待2秒中
P1_1 = 1; //置为高电平,输出正脉冲
iPulseCount = 10;//每间隔10*10ms = 100ms一个脉冲,脉宽变化改此处
while(iPulseCount);//高电平保持100ms
P1_1 = 0; //置为低电平,输出正脉冲结束
}
}
㈣ 单片机C编程:计算脉冲数为何这么写
程序不全,但我推测程序原理大致是这样的,2个定时器,1个计内部脉冲是定时器,一个计外部脉冲,是计数器,定时器每中断一次将int_flag=1
主程序里将其清0,并且读计数器当前的值(读之前程序里应加TR0=0),加上中断次数所代表计数值即为总计数值(由于计数器中断一次是65536个脉冲,所以有T0Count*65536),然后分离出个十百千万十万等即可,程序里只分离出个十百千是不对的,是舍大取小,如果数码管不够,可只显示高位部分,除非计数器所测脉冲频率很低,那时计数器不会溢出T0Count=0,但 sum值也有可能上万
㈤ 单片机T0口怎么计数脉冲,谁能给个简单的程序
很简单的。
比如 计o端口的脉冲,就把 o端口连到 T0 (P3.4)
假如10s计一次。
定时10s,10s到了。
你就 MOV A,TL0。
TIME2: DJNZ T_10S,time_ret ;10s
MOV T_10S,#10
MOV A,TL0 ;A放置脉冲总数
㈥ 单片机采集脉冲信号编程
楼上回答有误,很明显输出入信号多于2路,用普通IO口可以。
程序中主要做好扫描和判断,不停读P1.0口,如果上次读到的为1,这次读到的是0,既可以判断为下降沿,这时可以设一个标记位,标示1秒脉冲来了。
然后进入P11~P14的判断,同理,判断上次和当前次电平,每个下降沿或者上升沿计数一次(开4个变量),当P1.0的标记位没有的时候(1秒过了),读出变量值即为脉冲个数,也就是频率了
㈦ 如何写一个单片机输入上升沿和下降沿的脉冲输出信号的c语言程序
如果是循环中查询的话我一般这样做, 定义一个变量比如keyLastStatus来记录上一次扫描周期的状态
sbit key=P2.0; char keyLastStatus=0;
keyLastStatus=key; //初始化
while (1)
{
if(key==0 && keyLastStatus!=key) Todo(); //上升沿
if(key==1 && keyLastStatus!=key) Todo(); //下降沿
keyLastStatus=key; //记录上一次的状态
}
㈧ 单片机如何发出脉冲信号
利用单片机产生脉冲信号有多种方法。最简单的方法,就是在单片机的程序中对一个引脚反复置1,清0,置1,清0....,这个引脚上就会出现脉冲信号。
当需要产生指定周期和宽度的脉冲信号时,通常使用单片机中的计数器来实现:给计数器赋于不同的计数初值,在计数到0时产生中断去置1或清0某引脚即可。
㈨ 单片机脉冲计数
将定时器设置为外部输入下降沿触发,开中断
在中断程序里做一个变量寄存器如TOCNT
每进一次中断t0cnt++;
if(t0cnt>10)
P1.1=~P1.1
㈩ 求单片机脉冲计数程序
,显示的是每分钟的脉冲个数。
----
需要等待一分钟后,显示出来吗?
对1Hz的脉冲计数,显示的数字,不就是 60 吗?
定时5MS,是什么意思?