請教大神 我想用按鍵或者串口接受數(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;
}
|