51单片机电机测速程序c语言,基于51单片机光电编码器测速.doc
时间: 2023-06-18 15:04:56 浏览: 203
抱歉,由于涉及到版权问题,我无法提供该文档的代码。但是,以下是一个简单的51单片机测速程序的示例代码,仅供参考:
```
#include <reg52.h>
#include <intrins.h>
sbit motor_pin = P1^0; // 电机控制引脚,此处为P1.0
sbit sensor_pin = P3^2; // 光电编码器输出引脚,此处为P3.2
unsigned char count = 0; // 计数器,记录电机转动次数
unsigned char speed = 0; // 电机转速,单位:r/min
void delay(unsigned int t) // 延时函数
{
unsigned int i, j;
for (i = t; i > 0; i--)
for (j = 110; j > 0; j--);
}
void main()
{
TMOD = 0x05; // 设置定时器0为模式1,定时器1为模式0
TH0 = 0x00; // 定时器0的初始计数值为0
TL0 = 0x00;
TH1 = 0x00; // 定时器1的初始计数值为0
TL1 = 0x00;
ET0 = 1; // 允许定时器0中断
TR0 = 1; // 启动定时器0
EA = 1; // 允许总中断开关
while (1)
{
motor_pin = 1; // 电机开始转动
delay(1000); // 延时1秒钟,让电机转动一定的时间
motor_pin = 0; // 电机停止转动
speed = count * 60; // 计算电机转速
count = 0; // 计数器清零
// 将电机转速通过串口输出
// ...
}
}
void timer0_isr() interrupt 1 // 定时器0中断服务函数
{
static bit sensor_state = 0; // 光电编码器状态,0表示未检测到光电信号,1表示检测到光电信号
TH0 = 0x4C; // 定时器0的重载值,使定时器计数1ms
TL0 = 0x00;
if (sensor_pin == 0 && sensor_state == 1) // 电机转动一圈
{
count++; // 计数器加1
sensor_state = 0; // 光电编码器状态置为0
}
else if (sensor_pin == 1 && sensor_state == 0) // 电机转动未满一圈
sensor_state = 1; // 光电编码器状态置为1
}
```
上述代码实现的功能为通过光电编码器测量电机转速。在程序中,通过定时器0产生1ms的定时中断,检测光电编码器输出引脚的状态,当检测到从高电平到低电平的跳变时,表示电机转动一圈,计数器加1;反之,表示电机转动未满一圈。通过计算计数器的值,即可得到电机的转速。
阅读全文