找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 636|回复: 2
收起左侧

求大神指点 单片机串口通讯和步进电机控制失败

[复制链接]
ID:277993 发表于 2024-1-25 12:13 | 显示全部楼层 |阅读模式
    我最近在搞51单片机串口通讯和42步进电机控制,但是始终无法解决双定时器问题。    使用的是89c52芯片+步进电机驱动+42步进电机,我苦恼的是,单独使用串口通讯功能没有,单独控制42步进电机也没有问题,但是结合在一起,就不行了。
   求大神指点。

#include <reg52.h>

#define uchar unsigned char
#define uint  unsigned int

sbit shi_neng=P1^0;  //        使能控制位
sbit fang_xiang=P1^1;//        旋转方向控制位
sbit mai_chong=P1^2; // 脉冲控制位

sbit qi_dong=P2^0;//        启动按钮

sbit ting_zhi=P2^1;//停止按钮
sbit zheng_zhuan=P2^2;//正转按钮

sbit dg5=P1^5;
sbit dg6=P1^6;
sbit beep = P2^3;//蜂鸣器接口
uchar num,p1;//发送暂存变量

unsigned int m,f,s,pp,sa,xa,xb;
unsigned int p2;

void delay(uint i)//延时函数
{
        uchar j,k;
        for(j=0;j<i;j++)
        for(k=0;k<50;k++);
}
        
void UART_init()
{
        SCON=0X50;
        TMOD = 0x20;          //T1工作模式2  8位自动重装
        TH1 = 0xfd;
        TL1 = 0xfd;         //比特率9600
        TR1 = 1;                //启动T1定时器
        SM0 = 0;
        SM1 = 1;                 //串口工作方式1 10位异步
        REN = 1;                //串口允许接收
        EA  = 1;                //开总中断
        ES  = 1;                //串口中断打开
}
void djzf(uint x)
{
   if(x==1)
   {
        shi_neng=0;  //        使能控制位
        fang_xiang=1;//        旋转方向控制位
        dg5=0;
        dg6=1;
        }
    if(x==2)
        {shi_neng=0;  //        使能控制位
        fang_xiang=0;//        旋转方向控制位
        dg5=1;
        dg6=0;
        }
          if(x==3)
        {shi_neng=1;  //        使能控制位
        fang_xiang=0;//        旋转方向控制位
        dg5=1;
        dg6=1;
        }
}  


void main()
{
        unsigned int p3;
        UART_init(); //串口初始化
         p3=p2;
        switch (p2)
          {
          case 1:djzf(1);
          case 2:djzf(2);
          case 3:djzf(3);
          break;
           }
        while(1);
         {
          mai_chong=1; //输出时钟脉冲
                  delay(3);
                mai_chong=0;  
                  delay(3);        
         
         }
}


void UART() interrupt 4
{
        if(RI)        //检测是否接收完成
        {
                num = SBUF;          //num 取出接收缓存器的值
                p2=(int)num;
                beep = 0;
                delay(100);
        
                beep = 1;//蜂鸣器发出滴提示音

                num++;//把接收的数据加1并发送
                RI = 0;
                SBUF = num;        
                EA=0;
                while(!TI);
                TI = 0;
        }
}


回复

使用道具 举报

ID:883242 发表于 2024-1-25 16:10 | 显示全部楼层
就不应该用51来搞这一套。

2010年我接一个步进电机为核心的项目,想用STM32,一查定时器只有16位太没有诚意了,果断换成LPC1756
回复

使用道具 举报

ID:277993 发表于 2024-1-25 12:16 | 显示全部楼层
我分析的原因是,如果开串口通讯,那么T1是自动控制,T0不工作,我需要T0来产生驱动频率,但是采用TMOD=0X03后仍然不行,T0和T1始终无法实现同时工作,所以导致我无法实现通过串口控制步进电机
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表