基于51单片机转速测量的程序,望高手帮我解释一下。

基于51单片机转速测量的程序,望高手帮我解释一下。,第1张

#include <reg51.h>

#include <INTRINS.H>

#define FOSC 11.0592

unsigned int speed

unsigned char key

unsigned char led_table[10]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xff,0xf6}

long speed_count,speed_count1

unsigned char speed_check

unsigned int second_flag

unsigned char speed_table[4]

unsigned char speed_table1[10]

//定时器频率1000Hz

void timer1_init(void)

{

EA=0

TMOD=0x10

//TH1=1000*FOSC/12/256

//TL1=(unsigned int)(1000*FOSC/12)%256

TH1=254

TL1=51

TR1=1

TCON|=0X04 //外部中断下降触发

EX1=1 //允许外部中断

ET1=1

EA=1

}

void int1_routine(void) interrupt 2

{

speed_count++

P1^=0X02

}

void timer1_routine(void) interrupt 3

//void timer1_routine(void)

{

TH1=254

//TH1=0xf0

TL1=51

//speed_count++

second_flag++

}

void main(void)

{

unsigned int i,j,k

// unsigned char sum

unsigned speed_table[3]

long time_id

timer1_init()

speed=0

P2=0x0f

P0=0xf0

P3=0x08

key=0

P1=0x00

speed_check=0

while(1)

{

//P1^=0XFE

j=1

//speed=1234

speed_table[0]=speed/1000

speed_table[1]=speed%1000/100

speed_table[2]=speed%100/10

speed_table[3]=speed%10

for(i=0i<4i++)

{

P2=j^0xff

j<<=1

P0=(led_table[speed_table[i]])&0xfe

for(k=0k<250k++)

}

//speed=speed_count

if(second_flag>=1000) /*中断1000次进入 */

{

second_flag=0

time_id++

speed_table1[time_id%10]=speed_count/*外部中断量转存(是很聪明的方法学习了)*/

speed_count=0

speed=(speed_table1[0]+speed_table1[1]+speed_table1[2]+speed_table1[3]+speed_table1[4]+speed_table1[5]+speed_table1[6]+speed_table1[7]+speed_table1[8]+speed_table1[9])*6/*(10X6)10秒的外部中断量乘以6就是转速了*/

//speed=speed/2+(speed_table[0]+speed_table[1]+speed_table[2])*6

}

}

}

编写方式如下:

要是用的是测速电机的话,得用电压变换模块通过AD模块输入PLC,得测一下实际转速和测速电机的电压对应关系,然后根据测量的电压计算出电机转速。如用编码器,根据编码器一转的脉冲数,单位时间内(如1秒做为一个测量周期)测量所得的脉冲数计算出实际每分钟的转速。再用比较指令判定输出即可。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/11156879.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存