namefull 发表于 2009-4-26 13:51

旋转编码器计数完要如何才能得到转速和显示啊?

这是前辈给的计数程序&nbsp;基本看懂了&nbsp;&nbsp;可是不知道怎么才能把测速和显示的程序加进去。。转向我是用触发器鉴相<br /><br />帮忙看看原题图右何问题。<br />用中断测完脉冲后&nbsp;如何才能得到转速啊<br />我把我的硬件图贴上来&nbsp;还有计数的程序<br />麻烦大家帮我看看&nbsp;如何加进来。<br />这个是代码:<br /><br />//******************************************************************************<br />//&nbsp;旋转编码器脉冲计数程序,在8051上通过外部中断0实现<br />//&nbsp;特别说明:适应于旋转编码器脉冲频率较低的场合(对于12MHz晶体,大致可以支持&nbsp;4KHz<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;以下的旋转编码器脉冲频率),若旋转编码器脉冲频率更高,建议采用计数器<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T0和T1分别实现正反向计数,此时一般需要附加少量外部电路的配合<br />//&nbsp;以下代码仅供参考,由此产生的任何后果,本人不承担任何责任<br />//******************************************************************************<br />#include&nbsp;&quot;reg51.h&quot;<br /><br />long&nbsp;counter=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//旋转编码器的脉冲计数值,左转为正,右转为负<br />void&nbsp;main()<br />{<br />&nbsp;&nbsp;IT0&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//外部中断0为边沿触发<br />&nbsp;&nbsp;EX0&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//使能外部中断0<br />&nbsp;&nbsp;EA&nbsp;&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//使能中断<br />&nbsp;&nbsp;while(1)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在这里写代码实现你想做的事,比如计数值的进一步处理等等等等<br />&nbsp;&nbsp;}<br />}<br /><br />//******************************************************************************<br />//&nbsp;延时函数delay(unsigned&nbsp;char&nbsp;dly)<br />//&nbsp;延时值与晶体频率有关,可以自己调整变量x的值以取得合适的单位延时值<br />//******************************************************************************<br />void&nbsp;delay(unsigned&nbsp;char&nbsp;dly)<br />{<br />&nbsp;&nbsp;unsigned&nbsp;int&nbsp;x;<br />&nbsp;&nbsp;while(dly--)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;=&nbsp;1000;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(x--);<br />&nbsp;&nbsp;}<br />}<br /><br />//******************************************************************************<br />//&nbsp;外部中断0的中断处理函数void&nbsp;ISR0()<br />//&nbsp;注意:旋转编码器的A接P3.2,B接P1.7(跟你图上一样不变)<br />//******************************************************************************<br />void&nbsp;ISR0()&nbsp;&nbsp;&nbsp;interrupt&nbsp;0<br />{<br />&nbsp;&nbsp;&nbsp;if((P1&0x80)&nbsp;==&nbsp;0x80)<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delay(10);&nbsp;//消抖动,延时一会,确认P1.7仍然为高,如果频率比较高,延时要缩短<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((P1&0x80)&nbsp;==&nbsp;0x80)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;counter++;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delay(10);&nbsp;//消抖动,延时一会,确认P1.7仍然为低,如果频率比较高,延时要缩短<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((P1&0x80)&nbsp;==&nbsp;0x00)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;counter--;<br />&nbsp;&nbsp;&nbsp;}<br />}<br />http://laiba.cga.com.cn/laiba/images/9297343/12402466921014228071/A/1/m.jpg

李冬发 发表于 2009-4-26 15:01

哪有在中断里这样消抖的?

ayb_ice 发表于 2009-4-26 16:56

看来LZ对51不熟

if((P1&0x80)&nbsp;==&nbsp;0x80)这样的语句都出来了

namefull 发表于 2009-4-26 23:32

呵呵

呵呵&nbsp;<br />这个程序本来就是论坛上有人发的。&nbsp;楼上的,那个语句具体错到哪里了啊&nbsp;~<br /><br />我也是贴出来的&nbsp;&nbsp;我现在不知道怎么把脉冲计数才能转换成转速。<br />我这里的编码器是500个脉冲式1圈

高勇 发表于 2009-4-27 08:40

楼主已经了脉冲的积分数据

楼主你的中断程序目的就是旋转编码器的积分量。即:counter的数值。转速就是此量的微分即:△counter/△t。

gaohq 发表于 2009-4-27 09:39

if((P1&0x80) == 0x80)

if((P1&0x80)&nbsp;==&nbsp;0x80)&nbsp;&nbsp;这个P1是P1口啊,不能这样写的吧.

hanbing0898 发表于 2021-7-9 15:36

页: [1]
查看完整版本: 旋转编码器计数完要如何才能得到转速和显示啊?