找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1690|回復: 1
收起左側

單片機串口通信問題

[復制鏈接]
ID:661664 發(fā)表于 2020-1-2 16:46 | 顯示全部樓層 |閱讀模式
請教大神 我想用按鍵或者串口接受數(shù)據(jù)來控制步進電機  但是只能按鍵控制   串口接收不到數(shù)據(jù) 是為什么?
#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()                  //延時函數(shù)
{
    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的優(yōu)先級高于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;            //設置計數(shù)器工作方式2
    TMOD=0X21;            //設置計數(shù)器工作方式2     和定時器0
    PCON=0X80;            //波特率加倍
    //TH1=0XF4;                //計數(shù)器初始值設置,注意波特率是4800的
    //TL1=0XF4;
    TH1=0XFA;                //計數(shù)器初始值設置,注意波特率是9600的
    TL1=0XFA;
    ES=1;                        //打開接收中斷
    EA=1;                        //打開總中斷
    TR1=1;
    CLK=~CLK;
                        //打開計數(shù)器
}

void Usart() interrupt 4
{
    receiveData=SBUF;//出去接收到的數(shù)據(jù)
    RI = 0;//清除接收中斷標志位
   
}

/************************按鍵掃描程序************************
   功能:讀取各按鍵值,判斷是否按下,再處理相應事件
   
   注:按鍵控制程序,由于按鍵中斷優(yōu)先級高,且每個按鍵都設計
       為彈起有效, 所以長時間按住不放會導致電機減速甚至停
       止直至放開按鍵              
*************************************************************/
void Key_scan()                          
{
    static char j=0;

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


回復

使用道具 舉報

ID:213173 發(fā)表于 2020-1-3 09:46 | 顯示全部樓層
1.定時器1作為比特率發(fā)生器,在使用串口時不可與T1中斷同時共用。
2.如果晶振是12M,比特率不宜高于4800。
3.T0中斷周期20us太短,嚴重干擾主程序正常運行。以12M時鐘計算,完成一次中斷任務耗時至少1.43ms。CPU一個中斷還沒有完成,一大串中斷請求已丟失,哪來時間處理其它任務?
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表