1. 51单片机ec11编码器中断法
配置一个1ms定时器,并设置为自动清零模式,配置好后记得打开定时器中断。首先要开启定时器TIM3,我们使用这个 HAL_TIM_IC_Start_IT(htim, Channel);启动定时器。
使用定时器回调函数
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
在里面编写上面的程序,因为我们将B相接在PA7引脚,所以我们使用switch case语句进行判断引脚电平,如果单片机检测到A相为高电平就会进入这个中断判断B相电平,低电平为反转,高电平极为正转(程序中的cnt为计数作用)。
2. 51单片机 编码器 程序问题
把你想实现的功能,或者出现的问题,描述清楚,
你这个不清晰
“
本来是想中断0 1角变高电平 中断1触发1角变低电平
结果是 通电以后 中断0触发后 只有一段时间会变高电平
然后再不管触发哪个中断都不会有反应。
”
3. 你好,怎么通过单片机读取编码器脉冲的c语音程序
怎么用单片机判断编码器的正反转啊? 区别正反转需要用到绝对编码器, 通过两个输出的相位差来判断正反转
4. 51单片机开发板和绝对式编码器连接测量角度的程序
#include <reg52.h>
#include "inc/delay.h"
#include "inc/hc595.h"
#define uchar unsigned char
#define uint unsigned int
sbit PIN_ROTARY_A = P2^0; //引脚1接口
sbit PIN_ROTARY_B = P2^1; //引脚2接口
sbit PIN_ROTARY_C = P2^2; //按下的接口
sbit PIN_ROTARY_D = P2^3; //按下的接口
//uchar code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
/* 存储待发送的数据 */
/* 1->8的段码表 */
code unsigned char ucDis_Segmentcode[16] = {0x3f,0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
/* 位码表 */
code unsigned char ucDis_Bitcode[8] = {0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F};
uchar dis_XS[8] = {0x3f,0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d};
uchar count = 0;
uchar flag;
uchar Last_BMB_status;
uchar Current_BMB_status;
void display()
{
uchar i;
dis_XS[0] = ucDis_Segmentcode[count/100]; //百位
dis_XS[1] = ucDis_Segmentcode[count%100/10]; //十位
dis_XS[2] = ucDis_Segmentcode[count%10]; //个位
if(i < 2)
{
i++;
}
else
{
i = 0;
}
// for (i = 0; i < 3; i++ )
{
Send_Data(dis_XS[i], ucDis_Bitcode[i]);
//PIN_ROTARY_D = 0;
// Delay1ms(1);
}
}
//************************************************
void main()
{
TMOD=0x01; //定时器0,工作方式1
TH0=0xD8;
TL0=0xF0; //给定时器装上初值,10ms中断一次
ET0=1; //打开定时器中断
EA =1; //打开总中断
TR0=1; //启动定时器0
while(1)
{
//display();
Last_BMB_status=PIN_ROTARY_B;
while(!PIN_ROTARY_A) //BMA为低电平时
{
Current_BMB_status = PIN_ROTARY_B;
flag = 1; //标志位置为1说明编码开关被旋转了
}
if(flag == 1)
{
flag = 0; //时刻要注意这一点!给标志位清零
if((Last_BMB_status == 0)&&(Current_BMB_status == 1)) //BMB上升沿表示正转
{
count++;
if(count == 255)
{
count = 0;
}
}
if((Last_BMB_status == 1)&&(Current_BMB_status == 0)) //BMB下降沿表示反转
{
count--;
if(count == 0)
{
count = 255;
}
}
}
}
}
//***********************************************
void timer0() interrupt 1//定时器0的中断服务程序
{
TH0=0xF8; // TH0=0xD8;
TL0=0xF0; //再次装入初值
display(); //每隔10ms显示一次
if(!PIN_ROTARY_C) //按下旋转编码开关则计数清零
{
count = 0;
}
PIN_ROTARY_D = !PIN_ROTARY_D;
}
5. 51单片机怎么写编码器的程序
可以用T0或T1的计数器模式来处理编码器的脉冲信号。
6. 求单片机C程序,判断旋转编码器正转和反转,以及转数
旋转编码器一般输出3路信号ABZ,AB相位差是90°
将A接到中断。当A下降沿时:B为高就是正转一步,B为低则是反转一步。
转速可以用若干步用的时间进行计算。
7. 用单片机数编码器的脉冲需要加消抖程序吗编码器的方波应该不是理想型吧,求做过的大神解释谢谢您
编码器输入不需要加消抖程序,加了的话,反而会有不良效果的,而且编码器的脉冲信号是经过硬件处理的,输出是很干净的。
8. 怎么用51单片机和编码器判断正反转啊求51单片机的C程序,谢谢
编码器的正转与反转的相位是用差别的,首先你要了解你使用的编码器的正转及反转的相位。编程的方法有很多,比如可以用查询IO口电平变化的方式去判断
9. 51单片机检测增量式旋转光电编码器汇编程序有点问题,请高手看看,分数不是问题
不明白你写的,你把题目说的清晰一点 ,看了好几遍,程序编的挺简单