㈠ 用C51单片机统计脉冲次数
举例解答如下:
利用定时器T1,对外部脉冲(P3.5引脚输入)计数,
每输入200次脉冲产生一次中断,累加器+1,
选用T1,计数器模式,方式2(自动重装初值8位计数器),
TMOD
=0110
0000B
=60H
计数初值
=2^8
-200
=256
-200
=56d
=38H,
汇编程序如下:
;
;
主程序:
MAIN:
CLR
A
;
;
累加器清零
MOV
TMOD,
#60H
;
;置T1计数模式、方式2
MOV
TL1,
#38H
;
;
写入计数初值
MOV
TH1,
#38H
;
;
写入留待自动重装的初值
SETB
TR1
;
;
启动T1计数
SETB
ET1
;
;
允许T1中断
SETB
EB
;
;
CPU开中断
SJMP
$
;
;
等待一轮对外部脉冲计数溢出中断
;
;
以下是T1中断处理子程序:
T1_INT:
INC
A
;
;
累加器加1
RETI
;
;
中断返回
㈡ 51单片机怎么实现外部脉冲计数
#include<reg51.h>
#define uint unsigned int
uint dat=0,time=0;
bit flag=0;
sbit key=P1^0;
void int00() interrupt 0
{
dat++;
}
void t0isr() interrupt 1
{
time++;
if(time>=400)flag=1;
}
main()
{
TMOD=0x22;
TH0=6;
TL0=6;
TH1=0xfd;
TL1=0xfd;
TR1=1;
SCON=0x40;
ET0=1;
EX0=1;
IT0=1;
PX0=1;
EA=1;
while(1)
{
if(key==0)
{
while(key==0);
TR0=1;
while(flag==0);
TR0=0;
flag=0;
SBUF=dat;
while(TI==0);
TI=0;
SBUF=dat>>8;
while(TI==0);
TI=0;
}
}
}
㈢ 如何用单片机记脉冲数
1、用单片机产生200ms,占空比为50%的周期信号,即高低电平各100ms;
2、将该200ms信号接到INT0或INT1上,将外部脉冲信号接到T0或T1上,注意要对应接,即INT0与TO一起用或INT1和T1一起用。
3、设置定时器/计数器工作方式控制寄存器TMOD的GATE = 1(门控方式) ,C/T = 1 (计数方式)。
这样,就可以用100ms作为一个控制门,在这个门有效(相应外部中断)时,外部计数脉冲就可以进入这个门,定时器/计数器计数初值设为加1就溢出,中断服务程序中计数就可以了。
㈣ 单片机脉冲计数
将定时器设置为外部输入下降沿触发,开中断
在中断程序里做一个变量寄存器如TOCNT
每进一次中断t0cnt++;
if(t0cnt>10)
P1.1=~P1.1
㈤ 51单片机如何用计数器检测脉冲信号(高低电平),程序怎么做!没有思路!
可以利用51单片机的计数器T0、T1,例如用计数器0的外部计数脉冲输入端T0计数,当计满100个脉冲数量后,触发中断。进入计数服务中断程序。
如果有脉冲信号,经过电容微分后,在下降沿会产生一个向下的尖端脉冲,电阻R2是作为一个偏置,当有向下的尖端脉冲来后,反相端的电压会低于同向端的电压。
从而比较器输出高电平,这个电路图要注意的两个参数是,1,比较器的选择,你可以选LM339,要加上拉电阻。
(5)单片机脉冲计数实验扩展阅读:
通向输入端的那两个电阻是用来产生一个参考电压的,电容用来微分你的PWM波,你可以用示波器在反向输入端观察微分信号。
主程序中可根据不同运行状态调用部分子函数。需要开机按键设置时,优先执行按键程序,其它需要设置以后才能运行的子函数暂时不调用,减少单片机被占用过多。
设置后,不需要按键了,就不调用按键程序了。如果需要随时按键都要反应,可以把按键接到外部中断上,以中断方式响应按键,不受其他子函数影响。
㈥ 51单片机脉冲计数
你好!
那就用外部中断来检测吧,速度快精度高
void outside() interrupt 0
{
T0count++;
}
然后将计数,通过液晶显示出来就可
㈦ 单片机定时/计数器实验--脉冲计数器
这是个简易频率计,程序如下:
;---------------------------------
ORG0000H
JMPSTART
ORG000BH
JMPT0_INT
;---------------------------------
START:
MOVTMOD,#51H;/*01010001T1计数,T0定时*/
MOVTH0,#HIGH(65536-50000);50ms@12MHz
MOVTL0,#LOW(65536-50000)
MOVTH1,#0
MOVTL1,#0
SETBTR0
SETBTR1
SETBET0
SETBEA
MOVR7,#20
SJMP$
;---------------------------------
T0_INT:;50ms执行一次
MOVTL0,#LOW(65536-50000);重新写入初始值
MOVTH0,#HIGH(65536-50000);50ms@12MHz
DJNZR7,T0_END
MOVR7,#20
MOVP1,TL1
MOVP2,TH1
MOVTL1,#0
MOVTH1,#0
T0_END:
RETI
;---------------------------------
用PROTEUS仿真如下图。
图中信号的频率是5000Hz,显示的是16进制,这是题目中要求的形式。