找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1657|回复: 1
收起左侧

单片机串口通信问题

[复制链接]
ID:661664 发表于 2020-1-2 16:46 | 显示全部楼层 |阅读模式
请教大神 我想用按键或者串口接受数据来控制步进电机  但是只能按键控制   串口接收不到数据 是为什么?
#include<reg51.h>
unsigned char Direction=0,Speed=0;

unsigned char receiveData='0';
void UsartConfiguration();
//电机控制引脚
sbit CLK  = P1^0;
sbit ENA  = P1^1;
sbit DIR  = P1^2;
//按键控制引脚           
sbit SS_Step = P3^1;

unsigned int Tspeed[3]={20,40,100};           //调速等级表
unsigned int StepAngle[4]={25,50,60,80};   //步进角度表--90度/180度/360度/720度
bit Run_Status=0;
bit CY_status=0;
unsigned int CYCLE=20;
unsigned int cy_count=0;
unsigned PWM_count=0;

void Init_time();
void Key_scan();
void Step(unsigned int step_count);
/*void delay()                  //延时函数
{
    unsigned int i = 200;
    while (i--);
} */
void main()
{
    ENA=1;
    CLK=0;
    DIR=0;   
    UsartConfiguration();       //初始化电机
    Init_time();    //初始化定时器     
  
    while(1)
    {
     if(receiveData=='1')               //转动
                {
                              //消除抖动                       
                                Direction=1;
                                                                          
                }            
                 Key_scan();               
                     Direction=0;
        
    }   
}
void Init_time()                 //初始化定时器
{
    TMOD |= 0x01;
    TH0=(65536-CYCLE)/256;          //给time0装初值
    TL0=(65536-CYCLE)%256;
    //TH1=(65536-2000)/256;         //给time1装初值
    //TL1=(65536-2000)%256;
    IE = 0x82;
    //PT1=1;                       //使得time1的优先级高于time0
    TR0=1;                         //打开两个中断
    //TR1=1;
}
void Enter_Timer0() interrupt 1                //进入定时器中断
{
    TH0=(65536-CYCLE)/256;
    TL0=(65536-CYCLE)%256;
    CLK=~CLK;
    PWM_count++;
    if(PWM_count==(2*cy_count)&&CY_status)
    {
        PWM_count=0;
        TR0=0;
        ENA=0;
    }   
}
void Enter_timer1() interrupt 3
{
    TH1=(65536-2000)/256;         //给time1装初值
    TL1=(65536-2000)%256;
    Key_scan();
}
void UsartConfiguration()
{
    SCON=0X50;            //设置为工作方式1
    //TMOD=0X20;            //设置计数器工作方式2
    TMOD=0X21;            //设置计数器工作方式2     和定时器0
    PCON=0X80;            //波特率加倍
    //TH1=0XF4;                //计数器初始值设置,注意波特率是4800的
    //TL1=0XF4;
    TH1=0XFA;                //计数器初始值设置,注意波特率是9600的
    TL1=0XFA;
    ES=1;                        //打开接收中断
    EA=1;                        //打开总中断
    TR1=1;
    CLK=~CLK;
                        //打开计数器
}

void Usart() interrupt 4
{
    receiveData=SBUF;//出去接收到的数据
    RI = 0;//清除接收中断标志位
   
}

/************************按键扫描程序************************
   功能:读取各按键值,判断是否按下,再处理相应事件
   
   注:按键控制程序,由于按键中断优先级高,且每个按键都设计
       为弹起有效, 所以长时间按住不放会导致电机减速甚至停
       止直至放开按键              
*************************************************************/
void Key_scan()                          
{
    static char j=0;

         if((SS_Step==0)||(Direction=='1'))
        {
            
            Step(StepAngle[j]);
        }
    //}
}
/***********************角度控制函数*************************/
void Step(unsigned int step_count)
{
    PWM_count=0;
    CY_status=1;
    cy_count=step_count;
    ENA=1;
    TR0=1;
}


回复

使用道具 举报

ID:213173 发表于 2020-1-3 09:46 | 显示全部楼层
1.定时器1作为比特率发生器,在使用串口时不可与T1中断同时共用。
2.如果晶振是12M,比特率不宜高于4800。
3.T0中断周期20us太短,严重干扰主程序正常运行。以12M时钟计算,完成一次中断任务耗时至少1.43ms。CPU一个中断还没有完成,一大串中断请求已丢失,哪来时间处理其它任务?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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