旋转编码器UART异步串口通信问题
时间:10-02
整理:3721RD
点击:
实现旋转编码器旋转将数据通过串口助手发回电脑显示,帮忙看一下下面的程序问题出在哪里?
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit Xuan_A = P2^0;
sbit Xuan_B = P2^1;
sbit Xuan_C = P2^2;
uchar i;
uchar Counter = 0;
uchar Flag = 0;
uchar Last_Xuan_B,Current_Xuan_B;
uchar T0RH,T0RL;
void Delay(int n)
{
int j;
for(; n > 0; n--)
{
for(j = 0; j < 110; j++);
}
}
void Xuan_Direction()
{
Last_Xuan_B = Xuan_B;
while(!Xuan_A)
{
Flag = 1;
Current_Xuan_B = Xuan_B;
}
if(1 == Flag)
{
Flag = 0;
if((0 == Last_Xuan_B)&&(1 ==Current_Xuan_B ))
{
if(Counter<255)
{
Counter ++;
}
else
{
Counter = 0;
}
}
if((1 == Last_Xuan_B)&&(0 ==Current_Xuan_B ))
{
if(Counter>0)
{
Counter --;
}
else
{
Counter = 255;
}
}
}
}
void ConfigTimer0(unsigned int ms)//这个函数很重要
{
unsigned long tmp; //临时变量
tmp = 11059200 / 12; //定时器计数频率
tmp = (tmp * ms) / 1000; //计算所需的计数值,因为晶振的时间单位是us,转换成ms要除以1000
tmp = 65536 - tmp; //计算定时器重载值
tmp = tmp + 18; //补偿中断响应延时造成的误差
T0RH = (unsigned char)(tmp>>8); //定时器重载值拆分为高低字节
T0RL = (unsigned char)tmp;
TMOD &= 0xF0; //清零T0的控制位
TMOD |= 0x01; //配置T0为模式1
TH0 = T0RH; //加载T0重载值
TL0 = T0RL;
ET0 = 1; //使能T0中断
TR0 = 1; //启动T0
}
void Time0_interrupt() interrupt 1
{
TH0 = T0RH; //加载T0重载值
TL0 = T0RL;
}
void Uart_TX_interrupt() interrupt 4
{
if(TI == 1)
{
TI = 0;
SBUF = Counter;
}
}
void ConfigUART(unsigned int baud)
{
SCON = 0x50; //配置串口为模式1
TMOD &= 0x0F; //清零T1的控制位
TMOD |= 0x20; //配置T1为模式2
TH1 = 256 - (11059200/12/32)/baud; //计算T1重载值
TL1 = TH1; //初值等于重载值
ET1 = 0; //禁止T1中断
ES = 1; //使能串口中断
TR1 = 1; //启动T1
}
void main()
{
EA = 1;
ConfigTimer0(10);
ConfigUART(9600);
while(1)
{
Xuan_Direction();
Delay(500);
}
}
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit Xuan_A = P2^0;
sbit Xuan_B = P2^1;
sbit Xuan_C = P2^2;
uchar i;
uchar Counter = 0;
uchar Flag = 0;
uchar Last_Xuan_B,Current_Xuan_B;
uchar T0RH,T0RL;
void Delay(int n)
{
int j;
for(; n > 0; n--)
{
for(j = 0; j < 110; j++);
}
}
void Xuan_Direction()
{
Last_Xuan_B = Xuan_B;
while(!Xuan_A)
{
Flag = 1;
Current_Xuan_B = Xuan_B;
}
if(1 == Flag)
{
Flag = 0;
if((0 == Last_Xuan_B)&&(1 ==Current_Xuan_B ))
{
if(Counter<255)
{
Counter ++;
}
else
{
Counter = 0;
}
}
if((1 == Last_Xuan_B)&&(0 ==Current_Xuan_B ))
{
if(Counter>0)
{
Counter --;
}
else
{
Counter = 255;
}
}
}
}
void ConfigTimer0(unsigned int ms)//这个函数很重要
{
unsigned long tmp; //临时变量
tmp = 11059200 / 12; //定时器计数频率
tmp = (tmp * ms) / 1000; //计算所需的计数值,因为晶振的时间单位是us,转换成ms要除以1000
tmp = 65536 - tmp; //计算定时器重载值
tmp = tmp + 18; //补偿中断响应延时造成的误差
T0RH = (unsigned char)(tmp>>8); //定时器重载值拆分为高低字节
T0RL = (unsigned char)tmp;
TMOD &= 0xF0; //清零T0的控制位
TMOD |= 0x01; //配置T0为模式1
TH0 = T0RH; //加载T0重载值
TL0 = T0RL;
ET0 = 1; //使能T0中断
TR0 = 1; //启动T0
}
void Time0_interrupt() interrupt 1
{
TH0 = T0RH; //加载T0重载值
TL0 = T0RL;
}
void Uart_TX_interrupt() interrupt 4
{
if(TI == 1)
{
TI = 0;
SBUF = Counter;
}
}
void ConfigUART(unsigned int baud)
{
SCON = 0x50; //配置串口为模式1
TMOD &= 0x0F; //清零T1的控制位
TMOD |= 0x20; //配置T1为模式2
TH1 = 256 - (11059200/12/32)/baud; //计算T1重载值
TL1 = TH1; //初值等于重载值
ET1 = 0; //禁止T1中断
ES = 1; //使能串口中断
TR1 = 1; //启动T1
}
void main()
{
EA = 1;
ConfigTimer0(10);
ConfigUART(9600);
while(1)
{
Xuan_Direction();
Delay(500);
}
}
这是那种芯片?头文件好像不全,还有定时器初值有没问题 ?!
头文件不全吗?就用了51一个芯片,定时器初值应该是没问题的
头文件不全吗?就用了51一个芯片,定时器初值应该是没问题的
思路是没啥问题的,就看是哪里出错了,你可以分开调试,屏蔽发送数据部门,调试编码器 调通了以后再屏蔽编码器部分,调试数据发送部分即可
