欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標(biāo)題:
上位機(jī)發(fā)送命令控制單片機(jī)發(fā)送特定數(shù)量的脈沖,驅(qū)動(dòng)步進(jìn)電機(jī)驅(qū)動(dòng)器
[打印本頁]
作者:
愛學(xué)習(xí)愛交流
時(shí)間:
2018-10-18 09:55
標(biāo)題:
上位機(jī)發(fā)送命令控制單片機(jī)發(fā)送特定數(shù)量的脈沖,驅(qū)動(dòng)步進(jìn)電機(jī)驅(qū)動(dòng)器
比如上位機(jī)發(fā)送2A 2A F4 04 00 00 00 F8,則使單片機(jī)發(fā)送4個(gè)脈沖(命令第4個(gè)字節(jié)表示脈沖數(shù)),問題在與我用proteus仿真,發(fā)送這個(gè)命令后單片機(jī)一直發(fā)送脈沖,沒有按照我們的命令只發(fā)送4個(gè)脈沖,這怎么辦,
程序如下:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
const uint setpulse=1;
uint judge[8];
uchar cnt=0;
uint pulse;
uint point;
uchar mot_ZT;
uchar move_ok;
uint dcf_XY;
uint dcf_PY;
uint dcf_QX;
uint djuchar re_flag;
/**效驗(yàn)和參數(shù)設(shè)定**/
uchar sum;
/**端口引腳定義**/
sbit Mot_Dir=P2^7; //步進(jìn)電機(jī)方向
sbit Mot_En=P2^6; //步進(jìn)電機(jī)使能
sbit Mot_Pulse=P2^5; //步進(jìn)電機(jī)脈沖
sbit sw=P0^3; //限位開關(guān)
sbit Valve_XY=P2^0; //吸樣閥
sbit Valve_PY=P2^1; //排樣閥
sbit Valve_QX=P2^2; //清洗閥
/**定時(shí)器0的初始化子程序**/
void Init_Timer0(void)
{
TMOD |=0x01;
EA=1;
ET0=1;
TR0=1;
// PS=1; //串口的優(yōu)先級(jí)
PT0=1; // 定時(shí)器T0的優(yōu)先級(jí)
}
/**延時(shí)**/
void DelayUs2x(uchar t)
{
while(--t);
}
void DelayMs(uchar t)
{
while(t--)
{
//延遲1ms
DelayUs2x(245);
DelayUs2x(245);
}
}
//**串口初始化**//
void InitUART(void)
{
SCON=0x50;
TMOD |=0x20;
TH1=0xFD;
TL1=0xFD;
TR1=1;
EA=1;
ES=1;
ET0=0;
// PS=1;
}
/**效驗(yàn)和**/
void check(void)
{
uchar tmp;
uint cs=0;
for(tmp=2;tmp<7;tmp++)
{
cs+=judge[tmp];
}
tmp=cs>>8;
sum=cs&0x00ff;
if(sum==0xff)
{
sum=0;
}
sum+=tmp;
if(sum==0xff)
{
sum=0;
}
}
//**串口中斷程序**//
void UART_SER(void) interrupt 4
{
unsigned char Temp;
uchar i;
if(RI)
{
RI=0; // 標(biāo)志位清零
Temp=SBUF;
judge[cnt]=Temp;
if(judge[0]==0x2A)
{
cnt++;
if(cnt>=8)
{
check();
if(judge[7]==sum)
{
re_flag=1;
}
else
{
for(i=0;i<8;i++)
{
judge[i]=0x00;//緩存數(shù)組清零
}
}
cnt=0;
}
}
SBUF=Temp;//把接受的值再返還給電腦端
}
if(TI) //如果是發(fā)送標(biāo)志位,清零
{
TI=0;
}
}
//**定時(shí)器中斷子程序**//
void Timer0_(void) interrupt 1
{
sw=1; //為了測(cè)試程序先定義一個(gè)sw的狀態(tài)
TH0=(65536-2000)/256; //定時(shí)2ms
TL0=(65536-2000)%256;
switch(mot_ZT)
{
case 0://復(fù)位
if(sw==1)//觸點(diǎn)開關(guān) 開
{
Mot_Dir=0;
Mot_Pulse=0;
Mot_En=1;
}
else
{
Mot_Dir=0;
Mot_Pulse=~Mot_Pulse;
Mot_En=1;
}
if(sw==1)
{
move_ok=1;
mot_ZT=3;
}
break;
case 1: //探針上移
if(sw==1||pulse==0)
{
Mot_Dir=0;
Mot_Pulse=0;
Mot_En=1;
}
else
{
Mot_Dir=0;
Mot_Pulse=~Mot_Pulse;
Mot_En=1;
pulse--;
}
if(pulse==0)
{
move_ok=1;
mot_ZT=3;
}
break;
case 2://探針下移
if(pulse==0)
{
Mot_Dir=1;
Mot_En=1;
Mot_Pulse=0;
}
else
{
Mot_Dir=1;
Mot_Pulse=~Mot_Pulse;
Mot_En=1;
pulse--;
}
if(pulse==0)
{
move_ok=1;
mot_ZT=3;
}
break;
case 3: //電機(jī)不動(dòng)
Mot_Dir=1;
Mot_Pulse=0;
Mot_En=1;
break;
default:
Mot_Dir=1;
Mot_Pulse=0;
Mot_En=1;
break;
}
}
//**探針位置函數(shù)**//
void Motor(void)
{
Init_Timer0();
EA=1;
if(judge[2]==0xF3) //探針置位
{
mot_ZT=0; //狀態(tài)標(biāo)志為0,1,2 ,3
}
else if(judge[2]==0xF4)//探針上移
{
mot_ZT=1;
point=judge[3];
pulse=point*setpulse;
}
else if(judge[2]==0xF5)//探針下移
{
mot_ZT=2;
pulse=judge[3];
pulse=point*setpulse;
}
}
//**主函數(shù)**//
void main(void)
{
InitUART();
ES=1;
while(1)
{
if(re_flag==1)
{
if(judge[0]==0x2A&&judge[1]==0x2A)
{
if(judge[2]==0xF3||judge[2]==0xF4||judge[2]==0xF5)
{
Motor();
}
else if(judge[2]==0xF2)
{
beng(); //泵中的1為關(guān),0為開
}
}
}
}
}
復(fù)制代碼
作者:
wulin
時(shí)間:
2018-10-18 15:39
re_flag變量使用過就要清0,否則永久執(zhí)行后續(xù)命令。
作者:
愛學(xué)習(xí)愛交流
時(shí)間:
2018-10-19 15:10
wulin 發(fā)表于 2018-10-18 15:39
re_flag變量使用過就要清0,否則永久執(zhí)行后續(xù)命令。
謝謝,確實(shí)是疏忽了。
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1