線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1599
推到 Plurk!
推到 Facebook!

請問這個程式編譯時出現的一個warning在哪裡?!

尚未結案
abc02161
一般會員


發表:2
回覆:0
積分:0
註冊:2011-04-25

發送簡訊給我
#1 引用回覆 回覆 發表時間:2011-04-27 21:45:19 IP:163.21.xxx.xxx 訂閱
各位大大好~以下是小弟我寫的控制步進馬達程式
但是我在編譯時出現了一個warning不知道在哪?!
請各位前輩指點:
謝謝^^~

[code c#]
#include
#include

#define LCD_Data P0 // 傳送的資料
#define BF 0x80 //忙碌旗標(BF=1 忙碌)
char ankle[10]={0x70,0x30,0x71,0x30,0x72,0x30,0x73,0x30,0x74,0x30}; // RS232 傳送實際角度的值
// p 萬 千 百 十 個
/****************************************************************************/
// RS232
int get_data; // 收到的資料
int x; // 次方
int e,f,g,h; // 千百十個 位數
// LCM顯示
unsigned int sum,i,j,k,l,m,n,o,p,q;
sbit RS=P2^0;// 處理資料=1,處理指令=0
sbit RW=P2^1;// 讀寫(讀取=1,寫入=0)
sbit E=P2^2; // 致能

// 步進馬達
sbit zero=P3^7; // 歸零信號
int step_num=0,step_sum=0; // step_num=激磁代碼,step_sum=馬達步數
int step_set=0; // step_set=設定的步數
int step_angle=0; // 步進馬達實際角度
//char step_motor[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};//半步激磁編碼(0.9度 400步)正->逆時針_反->順時針
char step_motor[4]={0x01,0x02,0x04,0x08};//兩相激磁編碼(1.8度 200步)正->逆時針_反->順時針/************************************副程式*********************************************/
/****************************************************************************/
// 延遲1ms=0.001s
void delay(int count)
{
int i,j;
for(i=0;i for(j=0;j<150;j )
;
}
/****************************************************************************/
//讀狀態
unsigned char ReadStatusLCD(void)
{
LCD_Data = 0xFF;
RS = 0;
RW = 1;
E = 0; //若振盪速度太高需在這後加小的延時
delay(1);
E = 1;
while (LCD_Data & BF); //檢測忙信號
return(LCD_Data);
}
/****************************************************************************/
//寫資料
void WriteDataLCD(unsigned char WDLCD)
{
ReadStatusLCD(); //檢測忙
LCD_Data = WDLCD;
RS = 1;
RW = 0;
E = 0; //若振盪速度太高需在這後加小的延時
delay(1);
E = 1;
}
/****************************************************************************/
//寫指令
void WriteCommandLCD(unsigned char WCLCD,BuysC) //BuysC為0時忽略忙檢測
{
if (BuysC) ReadStatusLCD(); //根據需要檢測忙
LCD_Data = WCLCD;
RS = 0;
RW = 0;
E = 0; //若振盪速度太高需在這後加小的延時
delay(1);
E = 1;
}
/****************************************************************************/
//LCM初始化
void LCDInit(void)
{
LCD_Data = 0;
WriteCommandLCD(0x38,1); //顯示模式設定:資料長度8位元,且檢測忙信號
WriteCommandLCD(0x01,1); //清除顯示幕,並把游標移至左上角
WriteCommandLCD(0x08,1); //關閉顯示,關閉游標,游標所在字元不反白
WriteCommandLCD(0x06,1); //輸入模式設定:位置遞增,顯示幕不位移
WriteCommandLCD(0x0c,1); //開啟顯示,關閉游標,游標所在字元不反白
}
/****************************************************************************/
//按指定位置顯示一個字
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
Y &= 1;
X &= 15; //限制X不能大於15,Y不能大於1
if (Y) X |= 0x40; //當要顯示第二行時位址碼 64個位置回到第二行;
X |= 0x80; // 算出指令碼
WriteCommandLCD(X, 0); //這裡不檢測忙信號,發送位址碼
WriteDataLCD(DData);
}
/****************************************************************************/
// 步進馬達歸零
void step_zero_search()
{
zero_search:
step_num ;
if(step_num==4)
{
step_num=0;
}
P1=step_motor[step_num];
delay(40);
if(zero!=1)
{
goto zero_search;
}
P1=0x00;
step_sum=0; // 步數歸零
}
/****************************************************************************/
// LCD顯示步數
void LCD_Display()
{
step_angle=step_sum*0.18*100;

// 馬達步數
i=step_sum/1000;//千位
j=(step_sum00)/100;//百位
k=((step_sum00)0)/10;//十位
l=((step_sum00)0);//個位

// 馬達角度
m=step_angle/10000;//萬位
n=(step_angle000)/1000;//千位
o=((step_angle000)00)/100;//百位
p=(((step_angle000)00)0)/10;//十位
q=(((step_angle000)00)0);//個位

// 實際角度
ankle[1]=m 0x30; // 萬位
ankle[3]=n 0x30; // 千位
ankle[5]=o 0x30; // 百位
ankle[7]=p 0x30; // 十位
ankle[9]=q 0x30; // 個位


DisplayOneChar(6,0,i 0x30); // 顯示字元(X ,Y ,Data)
DisplayOneChar(7,0,j 0x30);
DisplayOneChar(8,0,k 0x30);
DisplayOneChar(9,0,l 0x30);
DisplayOneChar(7,1,m 0x30); // 顯示字元(X ,Y ,Data)
DisplayOneChar(8,1,n 0x30);
DisplayOneChar(9,1,o 0x30);
DisplayOneChar(11,1,p 0x30);
DisplayOneChar(12,1,q 0x30);
}
/****************************************************************************/
// 移動至設定步數
void goto_step_set()
{
regoto_step_set:
if(step_set {
step_num ;
step_sum--;
if(step_num==4)
{
step_num=0;
}
P1=step_motor[step_num]; // 東轉
LCD_Display();
delay(40);
}

if(step_set>step_sum) // 往西
{
if(step_num==0) // 西轉
{
step_num=4;
}
step_num--;
step_sum ;
P1=step_motor[step_num];
LCD_Display();
delay(40);
}
if(step_set!=step_sum)
{
goto regoto_step_set;
}
P1=0x00;
LCD_Display(); // LCM顯示
for(i=0;i<10;i ) // 傳送ankle內的值至PC
{
SBUF=ankle[i];
delay(100);
}
}
/****************************************************************************/
// RS232接收
void serial_INT(void) interrupt 4 // RS232接收中斷副程式
{
if(RI==1) //是否接收完畢?!
{
RI=0; //清除接收旗標
get_data=SBUF;
switch(get_data)
{
case 'u': // PC端要求歸零代碼'u'
if(step_sum!=0) // 不是在零度就進行歸零
{
regoto_zero:
step_num ;
step_sum--;
if(step_num==4)
{
step_num=0;
}
P1=step_motor[step_num]; // 東轉
LCD_Display();
delay(40);
if(step_sum!=0) // 是否到零度
{
goto regoto_zero;
}
}
P1=0x00;
SBUF='u'; // 歸零完成訊號
break;


case 'a': // 下一個資料是千位數
x=4;
break;
case 'b': // 下一個資料是百位數
x=3;
break;
case 'c': // 下一個資料是十位數
x=2;
break;
case 'd': // 下一個資料是個位數
x=1;
break;
default: // 資料數值
if(x==4) // 千
{
e=get_dataH;
}
if(x==3) // 百
{
f=get_dataH;
}
if(x==2) // 十
{
g=get_dataH;
}
if(x==1) // 個
{
h=get_dataH;
step_set=e*1000 f*100 g*10 h; // 計算所收到的設定步數
goto_step_set(); // 移動至設定步數
}
break;
}
}
}
/****************************************************************************/
main() // PC控制步進馬達角度(接收步數(a千b百c十d個)後開始轉動,轉玩回傳現在角度(p 萬 千 百 十 個) )
{
IE=0x90; // 整體中斷控制致能,串列埠中斷控制致能
SCON=0x50; // 8 bit UART(Mode1)
TMOD=0x20; // Timer1(Mode2),使用內部計時器
TH1=0xe6; // TH1=TL1 = 256 - (振盪器頻率 / (32 * 12 * 鮑率))
TL1=0xe6; // 設定鮑率=1200
delay(400);//400ms 啟動等待,等LCD進入工作狀態
LCDInit(); //LCD初始化
P1=0x00; // 關閉步進馬達停止吃電
DisplayOneChar(0,0,'R');
DisplayOneChar(1,0,'e');
DisplayOneChar(2,0,'s');
DisplayOneChar(3,0,'e');
DisplayOneChar(4,0,'t');
DisplayOneChar(5,0,'i');
DisplayOneChar(6,0,'n');
DisplayOneChar(7,0,'g');
DisplayOneChar(8,0,'.');
DisplayOneChar(9,0,'.');
DisplayOneChar(10,0,'.');
step_zero_search(); // 步進馬達歸零
LCDInit(); //LCD初始化
DisplayOneChar(0,0,'S');
DisplayOneChar(1,0,'t');
DisplayOneChar(2,0,'e');
DisplayOneChar(3,0,'p');
DisplayOneChar(4,0,':');
DisplayOneChar(5,0,' ');
DisplayOneChar(0,1,'A');
DisplayOneChar(1,1,'n');
DisplayOneChar(2,1,'g');
DisplayOneChar(3,1,'l');
DisplayOneChar(4,1,'e');
DisplayOneChar(5,1,':');
DisplayOneChar(10,1,'.');
DisplayOneChar(13,1,0xdf); // 度
DisplayOneChar(14,1,' ');
LCD_Display(); // LCD顯示步數
TR1=1; // 啟動Timer1(rs232開啟)
SBUF='u'; // 歸零完成訊號 lag????
while(1);
}
[/code]
------
Nick~
系統時間:2024-04-25 16:00:39
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!