微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 旋转编码器UART异步串口通信问题

旋转编码器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);               
        }
}




这是那种芯片?头文件好像不全,还有定时器初值有没问题 ?!

头文件不全吗?就用了51一个芯片,定时器初值应该是没问题的

头文件不全吗?就用了51一个芯片,定时器初值应该是没问题的

思路是没啥问题的,就看是哪里出错了,你可以分开调试,屏蔽发送数据部门,调试编码器 调通了以后再屏蔽编码器部分,调试数据发送部分即可

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top