久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
上位機發送命令控制單片機發送特定數量的脈沖,驅動步進電機驅動器
[打印本頁]
作者:
愛學習愛交流
時間:
2018-10-18 09:55
標題:
上位機發送命令控制單片機發送特定數量的脈沖,驅動步進電機驅動器
比如上位機發送2A 2A F4 04 00 00 00 F8,則使單片機發送4個脈沖(命令第4個字節表示脈沖數),問題在與我用proteus仿真,發送這個命令后單片機一直發送脈沖,沒有按照我們的命令只發送4個脈沖,這怎么辦,
程序如下:
#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;
/**效驗和參數設定**/
uchar sum;
/**端口引腳定義**/
sbit Mot_Dir=P2^7; //步進電機方向
sbit Mot_En=P2^6; //步進電機使能
sbit Mot_Pulse=P2^5; //步進電機脈沖
sbit sw=P0^3; //限位開關
sbit Valve_XY=P2^0; //吸樣閥
sbit Valve_PY=P2^1; //排樣閥
sbit Valve_QX=P2^2; //清洗閥
/**定時器0的初始化子程序**/
void Init_Timer0(void)
{
TMOD |=0x01;
EA=1;
ET0=1;
TR0=1;
// PS=1; //串口的優先級
PT0=1; // 定時器T0的優先級
}
/**延時**/
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;
}
/**效驗和**/
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; // 標志位清零
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;//緩存數組清零
}
}
cnt=0;
}
}
SBUF=Temp;//把接受的值再返還給電腦端
}
if(TI) //如果是發送標志位,清零
{
TI=0;
}
}
//**定時器中斷子程序**//
void Timer0_(void) interrupt 1
{
sw=1; //為了測試程序先定義一個sw的狀態
TH0=(65536-2000)/256; //定時2ms
TL0=(65536-2000)%256;
switch(mot_ZT)
{
case 0://復位
if(sw==1)//觸點開關 開
{
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: //電機不動
Mot_Dir=1;
Mot_Pulse=0;
Mot_En=1;
break;
default:
Mot_Dir=1;
Mot_Pulse=0;
Mot_En=1;
break;
}
}
//**探針位置函數**//
void Motor(void)
{
Init_Timer0();
EA=1;
if(judge[2]==0xF3) //探針置位
{
mot_ZT=0; //狀態標志為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;
}
}
//**主函數**//
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為關,0為開
}
}
}
}
}
復制代碼
作者:
wulin
時間:
2018-10-18 15:39
re_flag變量使用過就要清0,否則永久執行后續命令。
作者:
愛學習愛交流
時間:
2018-10-19 15:10
wulin 發表于 2018-10-18 15:39
re_flag變量使用過就要清0,否則永久執行后續命令。
謝謝,確實是疏忽了。
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
成年视频在线观看福利资源
|
jlzzjlzz国产精品久久
|
天天夜天天操
|
亚洲综合区
|
久久精品一级
|
午夜免费视频
|
午夜视频一区二区三区
|
成人精品一区二区三区
|
日韩精品专区在线影院重磅
|
色久影院
|
欧美综合一区二区三区
|
亚洲国产成人精品女人久久久野战
|
亚洲精品福利在线
|
91偷拍精品一区二区三区
|
少妇av片
|
亚洲免费视频在线观看
|
欧美高清视频
|
中文字幕观看
|
精品一区国产
|
伊人伊成久久人综合网站
|
日韩免费视频一区二区
|
久久成
|
久久精品色欧美aⅴ一区二区
|
综合久久久
|
久久精品亚洲欧美日韩精品中文字幕
|
久草院线
|
一级国产精品一级国产精品片
|
国产一区在线免费观看视频
|
国产一区二区三区久久久久久久久
|
亚洲午夜精品视频
|
亚洲视频一区二区三区四区
|
色本道
|
午夜免费福利影院
|
日韩精品一区二区三区在线播放
|
亚洲97
|
国产在线1
|
久草在线视频中文
|
国产精品欧美一区二区三区不卡
|
亚洲成人在线免费
|
欲色av
|
在线观看中文字幕dvd播放
|