利用单片机 进行高电平 计数

有一个51单片机,一个红外探头,探头探测到信号会发出一个高电平,想把高电平的次数统计出来,在数码管上显示出来,应该怎样编程,初学c,希望大神指导。

中断方式:
1)红外探头与51单片机的中断连接,并设置高电平响应中断;
2)增加一个全局变量(统计次数)并初始化为0,在上述中断对应的处理函数中全局变量累加;
3)将全局变量的结果显示到数码管(可以在中断处理函数中显示统计值)。

轮询方式:
1)根据红外探头检测信号的频率,确定轮询的间隔(检测间隔的频率要大于两倍该红外探头检测信号的频率);
2)一次高电平变化,统计一次,并将结果输出至数码管;

上述两种方式,如果想要做得好的,应该考虑信号干扰,程序去抖。追问

这个是 按键一下 记一下数,我把黄色线改为接探头之后,也计数,但扫描太快了,想叫他每隔60秒扫描一次应该怎么做??

追答

扫描程序的实现?

追问

探头一直在返回高电平,我想做成当不返回高电平的时候计数1,然后继续返回,当再次不返回高电平时候计数2.不知道能不能实现,以前没接触过单片机,初学者。谢谢你这么耐心为我解答,刚刚你给我说的很有用。

追答

你采用的应该是轮询的方式吧?
探头的检测频率是多少?建议检测到上升沿(即低电平->高电平变化)时且20ms检测2次后仍为高顶棚时计数统计一次。

追问

就是这种探头,探测频率参数上没写,我也没找到。

追答

那就应该不存在频率问题,高低电平的变化是由外界触发。
用万用表量一下,是不是你的探头链接直接把信号拉高了?

追问

拉高了是什么意思?探头工作电压是5v,输出的也是5v

追答

拉高:由低电平变为高电平。
如果探头一直输出为高电平,那如何判断信号的变化?

追问

确实是拉高了 拉高了0.5v

追答

单片机的输入电平:
高电平应该在2.7v以上,5v以上的都是高电平了。
低电平应该在1v以下。
之前你的按键所以可以计数是因为按键触发时有明显的高低电平输出。而飞线后,输入信号被强制拉高了。电路的设计需要重新调整。
具体翻阅一下书籍。

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-08-17
"一个红外探头,探头探测到信号会发出一个高电平",是高电平?你确定?
如果是高电平那得加一个反向器然后再送到外部中断端口,把通过这个电平拉触发外中断,进一次中断统计一次,这样高电平的次数就统计出来了。
如有错误请指正。
第2个回答  2013-08-17

一个简单的仿真实例,供参考,仿真试试。

用51单片机对输入高电平的次数进行计数
先用反相器将高电平反相,这样就可以用外部中断计数脉冲数。可以随时返回计数值,如果想要自已控制然后看到计数值,可以再用外部中断1,按键后显示计数值。

怎样用51单片机计数器测量一个高电平脉冲的宽度,c语言程式,高电平开 ...
设你的P0.0接入脉冲,用T0定时计数器计数:TR0 = 0;while(P0.0 == 0) \/\/当检测到高电平,开启计数器 TR0 =1;while(P0.0 == 1) \/\/当脉冲变低,关闭计数器 TR0 = 0;然后直接读取 TH0和TL0中的计数数据,再乘以你的计数时间间隔(每计一个数的时间,跟你的时钟频率有关系)。

用51单片机来实现对某个引脚出现高电平次数的计数
DisplayListChar(0,0,"num:",5); if (level == 1) num++; num3 = (num\/1000)%10; num2 = (num\/100)%10; num1 = (num\/10)%10; num0 = num%10; DelayMs(20); DispOneChar(6,0,num3 + '0'); DispOneChar(7,...

单片机一个角发高电平开始计时到另一个角接受到高电平结束所用的时间...
可用延时程序来计数,也可用定时器 假设定时器不溢出的话,可不用中断,当然也可用自动重装模式 TMOD=0X01 TH0=0;TL0=0;while(p1^0=0);TR0=1;while(p0^1=0);TR0=0;TIME=TH0*256+TLO'TIME即是计时结果 或者 while(p1^0=0);while(p0^1=0){ delay100us();a++;} a即是计时结果 ...

如何给单片机IO口输入高电平
if(countsingle=1) \/\/错 if(countsingle==1) \/\/应该是“双等号”。后面还有一个错的地方。--- 试试下面这个:main(){ while(1) { if(countsingle == 1) { \/\/当计数输入为高电平时 relay1 = 1; \/\/产生信号让继电器1吸合 relay3 = 1; \/\/产生信号让继电器3吸合 relay...

51单片机 C语言 怎样测量高电平持续的时间
假设定时器不溢出,P1.0为高电平输入引脚:while(P1^0==1);\/\/等待眼前的高电平过去 while(P1^0==0);\/\/等待下一个高电平来到 TR0=1;\/\/启动定时器 while(P1^0==1);\/\/等待高电平结束 TR0=0;\/\/关闭定时器 HIGH=TL0+TH0*256;\/\/读取时间 ...

单片机如何检测计时器电平
设置P0.0接入脉冲I\/O然后值为1(设定为输入模式),用T0定时计数器计数:TR0 = 0;while(P0.0 == 0)\/\/当检测到高电平,开启计数器TR0 =1;while(P0.0 == 1)\/\/当脉冲变低,关闭计数器TR0 = 0;如果计时器溢出就设定一个值COUNT+1 然后直接读取 TH0和TL0中的计数数据,再乘以你的...

avr单片机,如何对其pwn模式下输出脉冲计数?
pwm是使用占空比的,比如,10ms一个周期,可以使用pwm将高电平设置为5ms,输出就只有50%的功率。你非要计数的话你可以使用T0捕获功能,不过我没试过。我一般使用外部中断,上升沿触发,在中断服务程序加一个计数语句。在显示器显示计数。

51单片机计数程序怎么写
ACALL DISP ;调用显示程序,显示30H单元数字 JB P0.2,$ ;等P0.2变低电平 CLR P0.1 DEC 30H ACALL DISP AJMP START 这个程序可以完成你的要求,但是,但是,但是,根据你的叙述,计数器只会在0-1之间变化。因为你要求:“。。。将p0-1口至高电瓶,一直持续到p0...

单片机复位电路(高低电平复位分别)
128 KB容量的ROM、2个16位定时\/计数器、4个8位并行口、全双工串口行口、ADC\/DAC、SPI、I2C、ISP、IAP等功能。系统结构简单,使用方便,实现模块化。单片机可靠性高,可工作到10^6 ~10^7小时无故障。处理功能强,速度快。低电压,低功耗,便于生产便携式产品。控制功能强。环境适应能力强。

相似回答
大家正在搜