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

能幫我詳細解釋一下這段程式嗎?感激...

缺席
sgchieh0414
一般會員


發表:17
回覆:16
積分:6
註冊:2005-08-08

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-09-24 21:24:32 IP:220.138.xxx.xxx 未訂閱
能幫我詳細解釋一下這段程式嗎?我跟本都完全看不懂說~一頭霧水~不太曉得它在做些什麼?我程式本身基處就較差~希望有高手能指點,指點~或能給我一些見意,如教學網站,範例,書藉等等的嗎??謝謝...     #include  #include #include #include #include /* P3 */ sbit P3_7 = P3^7; sbit P3_6 = P3^6; sbit P3_5 = P3^5; sbit P3_4 = P3^4; sbit P3_3 = P3^3; sbit P3_2 = P3^2; sbit P3_1 = P3^1; sbit P3_0 = P3^0; #define MOTORSPEED P3_4 #define MOTOREN P3_5 unsigned char xdata SEGOUT _at_ (0X8001); unsigned char xdata LEDAOUT _at_ (0X8002); unsigned char xdata LEDBOUT _at_ (0X8003); unsigned char xdata DIPSWIN _at_ (0X8101); unsigned char bdata SWDIPDATA ; sbitSW_0 = SWDIPDATA^0; sbitSW_1 = SWDIPDATA^1; sbitSW_2 = SWDIPDATA^2; sbitSW_3 = SWDIPDATA^3; sbitSW_4 = SWDIPDATA^4; sbitSW_5 = SWDIPDATA^5; sbitSW_6 = SWDIPDATA^6; sbitSW_7 = SWDIPDATA^7; unsigned int SPEED ; void INITT0(); void SPEEDSW(); void main() { INITT0() ; while (1) { SWDIPDATA=~DIPSWIN; if ( SW_0 == 1 ) {MOTOREN = 0 ;} else {MOTOREN = 1 ;} SPEEDSW(); SEGOUT = SPEED / 100 ; LEDAOUT = SWDIPDATA ; LEDBOUT = (~SWDIPDATA) & 0X07 ; } } void SPEEDSW() { unsigned char i ; i = (~SWDIPDATA)&0X0F ; switch (i) { case 0 :SPEED = 500;break ; case 1 :SPEED = 600;break ; case 2 :SPEED = 700;break ; case 3 :SPEED = 800;break ; case 4 :SPEED = 900;break ; case 5 :SPEED = 1000;break ; case 6 :SPEED = 1100;break ; case 7 :SPEED = 1200;break ; case 8 :SPEED = 1300;break ; case 9 :SPEED = 1400;break ; case 10 :SPEED = 1500;break ; case 11 :SPEED = 1600;break ; case 12 :SPEED = 1700;break ; case 13 :SPEED = 1800;break ; case 14 :SPEED = 1900;break ; case 15 :SPEED = 2000;break ; default :; break; } } void INITT0() { EA = 0 ; IP = 0X10 ; EA = 1 ; SPEED = 800 ; TH0 = (65536- SPEED)/256 ; TL0 = (65536- SPEED)%6 ; TMOD =1; TR0 = 1; ET0 =1 ; } void T0_int (void) interrupt 1 { TR0 = 0 ; TH0 = (65536- SPEED)/256 ; TL0 = (65536- SPEED)%6 ; MOTORSPEED =~MOTORSPEED ; TR0 = 1 ; }
阿信
版主


發表:111
回覆:983
積分:813
註冊:2005-03-10

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-09-25 00:22:02 IP:220.228.xxx.xxx 未訂閱
可以詳細說明你的問題嗎 這是用8051單晶片的C語言 功能是讀取外部指撥開關 來控制馬達 你學過C語言嗎 學過8051嗎 為什麼要看一個完全看不懂的程式
sgchieh0414
一般會員


發表:17
回覆:16
積分:6
註冊:2005-08-08

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-09-25 18:02:22 IP:220.138.xxx.xxx 未訂閱
to 阿信    我有學過c語言和8051,但學的非常差,我們專題要做電腦鼠,用步進馬達來動作 這是範例程式,還在了解它中,可以請教您以下問題嗎,謝謝...    #include  #include #include 以上幾個是標頭檔吧?是做什麼用途的呢? /* P3 */ sbit P3_7 = P3^7; sbit P3_6 = P3^6; sbit P3_5 = P3^5; sbit P3_4 = P3^4; sbit P3_3 = P3^3; sbit P3_2 = P3^2; sbit P3_1 = P3^1; sbit P3_0 = P3^0; 以上是對port3的0.1.2.3.4.5.6.7隻腳來做定義嗎?為何用sbit呢?以前都沒看 過說? #define MOTORSPEED P3_4 #define MOTOREN P3_5 這兩行是對port3的4.5腳定義為MOTORSPEED和MOTOREN是嗎?我查過8051的 3.4是T0,3.5是T1都為計時器,我總覺得MOTORSPEED是馬達速度,用計時器來控制 很合理,但MOTOREN是馬達致能,感覺上是控制馬達動或不動,不太解說,您覺得呢? unsigned char xdata SEGOUT _at_ (0X8001); unsigned char xdata LEDAOUT _at_ (0X8002); unsigned char xdata LEDBOUT _at_ (0X8003); unsigned char xdata DIPSWIN _at_ (0X8101); unsigned char bdata SWDIPDATA 我上面這幾行是定義外部記憶體位置,可否請問xbata和bdata上的意思嗎? sbitSW_0 = SWDIPDATA^0; sbitSW_1 = SWDIPDATA^1; sbitSW_2 = SWDIPDATA^2; sbitSW_3 = SWDIPDATA^3; sbitSW_4 = SWDIPDATA^4; sbitSW_5 = SWDIPDATA^5; sbitSW_6 = SWDIPDATA^6; sbitSW_7 = SWDIPDATA^7; 上面這些也是定義SW開關的0.1.2.3.4.5.6.7腳為SWDIPDATA的0.1.2.3.4.5.6.7是嗎? void INITT0(); void SPEEDSW(); 為何我的主程式在底下void main(),但上面定義部份卻已出現void INITT0(); 和void SPEEDSW();呢?是為何要這樣定義呢? void main() { INITT0() ; 這行是先執行過我下面的INITT0()程式再往下做是嗎? while (1) 這行是不斷的迴圈掃瞄以下的動作是嗎? { SWDIPDATA=~DIPSWIN; 這行是DIPSWIN值做反相放進SWDIPDATA是嗎? if ( SW_0 == 1 ) 這行是如果SW_0等於1就將MOTOREN = 0是嗎? {MOTOREN = 0 ;} else 否則MOTOREN = 1是嗎? {MOTOREN = 1 ;} SPEEDSW(); 這行是執行過我下面的SPEEDSW()再往下做是嗎? SEGOUT = SPEED / 100 ; 這行是將我速度除以100再給SEGOUT是嗎? LEDAOUT = SWDIPDATA ; 這行是SWDIPDATA值給LEDAOUT是嗎? LEDBOUT = (~SWDIPDATA) & 0X07 ; 這行是SWDIPDATA反相後和0X07做AND將值 給LEDBOUT是嗎?但我不懂0X07是什麼意思說,我查8051是暫存器0位址,也就是說SWDIPDATA反相後和暫存器0位址內的內容做AND是嗎? } } 以下部份我想是做速度的變換的樣子,是用i這變數來切換我的速度對吧? void SPEEDSW() { unsigned char i ; i = (~SWDIPDATA)&0X0F ; 上面這行是SWDIPDATA反相再和0X0F(是暫存器1的位址是嗎?)來做AND再放到i這變數是嗎?但我的SWDIPDATA不是有0.1.2.3.4.5.6.7嗎?也就是2進制8個值是嗎? 但我i只有1~15種選擇,我不太懂它是怎樣運算過後,i的值可選擇為1~15的值說 switch (i) { case 0 :SPEED = 500;break ; case 1 :SPEED = 600;break ; case 2 :SPEED = 700;break ; case 3 :SPEED = 800;break ; case 4 :SPEED = 900;break ; case 5 :SPEED = 1000;break ; case 6 :SPEED = 1100;break ; case 7 :SPEED = 1200;break ; case 8 :SPEED = 1300;break ; case 9 :SPEED = 1400;break ; case 10 :SPEED = 1500;break ; case 11 :SPEED = 1600;break ; case 12 :SPEED = 1700;break ; case 13 :SPEED = 1800;break ; case 14 :SPEED = 1900;break ; case 15 :SPEED = 2000;break ; default :; break; } 接下來這段我感覺像是做中斷,但我不太懂底下的一些設定 void INITT0() { EA = 0 ; 這行是將中斷致能位元設為0時,下面設定IP = 0X10 嗎? IP = 0X10 ; 這行是將中段優先次序暫存器,設為0X10?但0X10是代表什麼呢? EA = 1 ; 這行是將中斷致能位元設為1時,下面設定速度剛開始800, TMOD =1為計時器0設為模式1(為16bit計時器),如果像我剛開使速度是800就是(65536-800)除256後為252.875取前面的整數252再轉為二進制放入TH0的8bit內,餘數方面,是(65536-800)除256後餘數為224轉為二進制放入TL0的8bit內,是這樣子做嗎?TR0 = 1,是代表TR0內值為1時計時器0開始計數嗎?還有下面的 ET0 =1,我不太曉得它是設定什麼? SPEED = 800 ; TH0 = (65536- SPEED)/256 ; TL0 = (65536- SPEED)%6 ; TMOD =1; TR0 = 1; ET0 =1 ; } 下面感覺是像做脈波產生,但還是有些問題 void T0_int (void) interrupt 1 這行內為何中間又一個(void)這是代表什 麼意思呢?我以前都沒看過說? { TR0 = 0 ; 這行是TR0 = 0,也就是計時器0還沒開始時,是看我SPEED中的i選 擇那種速度,再去做運算,放入TH0和TL0這樣嗎?但底下怎又出現TR0 = 1,還有我覺得怪怪的脈波產生不是應該要設定TR0 = 1 才合理說,怎會一開始設TR0 = 0,然後底下又多一個TR0的設定,我不太了解 TH0 = (65536- SPEED)/256 ; TL0 = (65536- SPEED)%6 ; MOTORSPEED =~MOTORSPEED ; TR0 = 1 ; } 以上就是我遇到的許多問題,希望您能盡量幫我回答好嗎?由於我是一個人做這專題,加上我本身底子又不好,專題老師也很忙,他希望我們能自己去解決問題,也沒有同學或學長可問,這樣的情況下,讓我感覺很吃力,但我真的很想把專題好好完成,如果您(或者有那位高手)不覺得帶給您困擾的,可以方便留下您們的msn或即時通嗎?讓我有機會可向您們請教嗎?謝謝,感激...

版主


發表:261
回覆:2302
積分:1667
註冊:2005-01-04

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-09-25 18:41:49 IP:203.203.xxx.xxx 未訂閱
po程式碼請做好縮排. 不知如何做請參考版規. 煩請修改配合!謝謝!
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
sgchieh0414
一般會員


發表:17
回覆:16
積分:6
註冊:2005-08-08

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-09-25 19:38:30 IP:220.138.xxx.xxx 未訂閱
to 版主 我是發問新人,版規在那呢?我怎都找不到來看 謝謝.....
阿信
版主


發表:111
回覆:983
積分:813
註冊:2005-03-10

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-09-25 21:08:41 IP:220.228.xxx.xxx 未訂閱
引言:
to 阿信    我有學過c語言和8051,但學的非常差,我們專題要做電腦鼠,
用步進馬達來動作這是範例程式,還在了解它中,
可以請教您以下問題嗎,謝謝...    #include  
#include  
#include      以上幾個是標頭檔吧?是做什麼用途的呢?    /* P3 */ 
sbit P3_7 = P3^7; 
sbit P3_6 = P3^6; 
sbit P3_5 = P3^5; 
sbit P3_4 = P3^4; 
sbit P3_3 = P3^3; 
sbit P3_2 = P3^2; 
sbit P3_1 = P3^1; 
sbit P3_0 = P3^0;     以上是對port3的0.1.2.3.4.5.6.7隻腳來做定義嗎?
為何用sbit呢?以前都沒看過說?    #define MOTORSPEED P3_4 
#define MOTOREN P3_5     這兩行是對port3的4.5腳定義為MOTORSPEED和MOTOREN是嗎?
我查過8051的3.4是T0,3.5是T1都為計時器,我總覺得MOTORSPEED
是馬達速度,用計時器來控制很合理,但MOTOREN是馬達致能,
感覺上是控制馬達動或不動,不太解說,您覺得呢?    unsigned char xdata SEGOUT _at_ (0X8001); 
unsigned char xdata LEDAOUT _at_ (0X8002); 
unsigned char xdata LEDBOUT _at_ (0X8003); 
unsigned char xdata DIPSWIN _at_ (0X8101);     unsigned char bdata SWDIPDATA     我上面這幾行是定義外部記憶體位置,
可否請問xbata和bdata上的意思嗎?    sbitSW_0 = SWDIPDATA^0; 
sbitSW_1 = SWDIPDATA^1; 
sbitSW_2 = SWDIPDATA^2; 
sbitSW_3 = SWDIPDATA^3; 
sbitSW_4 = SWDIPDATA^4; 
sbitSW_5 = SWDIPDATA^5; 
sbitSW_6 = SWDIPDATA^6; 
sbitSW_7 = SWDIPDATA^7;     上面這些也是定義SW開關的0.1.2.3.4.5.6.7腳
為SWDIPDATA的0.1.2.3.4.5.6.7是嗎?    void INITT0(); 
void SPEEDSW();     為何我的主程式在底下void main(),但上面定義部份
卻已出現void INITT0(); 和void SPEEDSW();呢?
是為何要這樣定義呢?    void main() 
{ 
INITT0() ;  這行是先執行過我下面的INITT0()程式再往下做是嗎?
while (1)   這行是不斷的迴圈掃瞄以下的動作是嗎?
{ 
SWDIPDATA=~DIPSWIN;  這行是DIPSWIN值做反相放進SWDIPDATA是嗎?
if ( SW_0 == 1 )     這行是如果SW_0等於1就將MOTOREN = 0是嗎?
{MOTOREN = 0 ;} 
else                 否則MOTOREN = 1是嗎?
{MOTOREN = 1 ;} 
SPEEDSW();           這行是執行過我下面的SPEEDSW()再往下做是嗎?
SEGOUT = SPEED / 100 ;    這行是將我速度除以100再給SEGOUT是嗎?
LEDAOUT = SWDIPDATA ;     這行是SWDIPDATA值給LEDAOUT是嗎?
LEDBOUT = (~SWDIPDATA) & 0X07 ;  這行是SWDIPDATA反相後和0X07
做AND將值給LEDBOUT是嗎?但我不懂0X07是什麼意思說,我查8051是
暫存器0位址,也就是說SWDIPDATA反相後和暫存器0位址內的內容做AND是嗎?    } 
}    以下部份我想是做速度的變換的樣子,是用i這變數來切換我的速度對吧?    void SPEEDSW() 
{ 
unsigned char i ; 
i = (~SWDIPDATA)&0X0F ;      上面這行是SWDIPDATA反相再和0X0F(是暫存器1的位址是嗎?)
來做AND再放到i這變數是嗎?但我的SWDIPDATA不是有0.1.2.3.4.5.6.7嗎?
也就是2進制8個值是嗎?但我i只有1~15種選擇,我不太懂它是怎樣運算過後,
i的值可選擇為1~15的值說    switch (i) 
{ 
case 0 :SPEED = 500;break ; 
case 1 :SPEED = 600;break ; 
case 2 :SPEED = 700;break ; 
case 3 :SPEED = 800;break ; 
case 4 :SPEED = 900;break ; 
case 5 :SPEED = 1000;break ; 
case 6 :SPEED = 1100;break ; 
case 7 :SPEED = 1200;break ; 
case 8 :SPEED = 1300;break ; 
case 9 :SPEED = 1400;break ; 
case 10 :SPEED = 1500;break ; 
case 11 :SPEED = 1600;break ; 
case 12 :SPEED = 1700;break ; 
case 13 :SPEED = 1800;break ; 
case 14 :SPEED = 1900;break ; 
case 15 :SPEED = 2000;break ; 
default :; break; 
}     接下來這段我感覺像是做中斷,但我不太懂底下的一些設定    void INITT0() 
{ 
EA = 0 ;   這行是將中斷致能位元設為0時,下面設定IP = 0X10 嗎?
IP = 0X10 ;   這行是將中段優先次序暫存器,設為0X10?但0X10是代表什麼呢?
EA = 1 ;      這行是將中斷致能位元設為1時,下面設定速度剛開始800,    TMOD =1為計時器0設為模式1(為16bit計時器),如果像我剛開使速度是800
就是(65536-800)除256後為252.875取前面的整數252再轉為二進制
放入TH0的8bit內,餘數方面,是(65536-800)除256後餘數為224轉為
二進制放入TL0的8bit內,是這樣子做嗎?TR0 = 1,是代表TR0內值
為1時計時器0開始計數嗎?還有下面的ET0 =1,我不太曉得它是設定什麼?    SPEED = 800 ; 
TH0 = (65536- SPEED)/256 ; 
TL0 = (65536- SPEED)%6 ; 
TMOD =1; 
TR0 = 1; 
ET0 =1 ; 
}    下面感覺是像做脈波產生,但還是有些問題    void T0_int (void) interrupt 1  這行內為何中間又一個(void)
這是代表什麼意思呢?我以前都沒看過說?
{     TR0 = 0 ;   這行是TR0 = 0,也就是計時器0還沒開始時,是看我SPEED中
的i選擇那種速度,再去做運算,放入TH0和TL0這樣嗎?但底下怎又出現
TR0 = 1,還有我覺得怪怪的脈波產生不是應該要設定TR0 = 1 才合理說,
怎會一開始設TR0 = 0,然後底下又多一個TR0的設定,我不太了解    TH0 = (65536- SPEED)/256 ; 
TL0 = (65536- SPEED)%6 ; 
MOTORSPEED =~MOTORSPEED ; 
TR0 = 1 ; 
}    以上就是我遇到的許多問題,希望您能盡量幫我回答好嗎?由於我是一個人
做這專題,加上我本身底子又不好,專題老師也很忙,他希望我們能自己去
解決問題,也沒有同學或學長可問,這樣的情況下,讓我感覺很吃力,
但我真的很想把專題好好完成,如果您(或者有那位高手)不覺得帶給您困擾的
,可以方便留下您們的msn或即時通嗎?讓我有機會可向您們請教嗎?
謝謝,感激...    
發表文章時請適當斷行! 發表人 - 阿信 於 2005/09/25 21:17:20

版主


發表:261
回覆:2302
積分:1667
註冊:2005-01-04

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-09-25 21:28:50 IP:203.203.xxx.xxx 未訂閱
引言: to 版主 我是發問新人,版規在那呢?我怎都找不到來看 謝謝.....
就在本頁裡, 找一下公告的部分.
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
sgchieh0414
一般會員


發表:17
回覆:16
積分:6
註冊:2005-08-08

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-09-26 13:50:03 IP:220.138.xxx.xxx 未訂閱
to 阿信    我有學過c語言和8051,但學的非常差,我們專題要做電腦鼠,用步進馬達來動作這是範例程式,還在了解它中,可以請教您以下問題嗎,謝謝...    
    #include  
#include  
#include      /*以上幾個是標頭檔吧?是做什麼用途的呢?*/    /* P3 */ 
sbit P3_7 = P3^7; 
sbit P3_6 = P3^6; 
sbit P3_5 = P3^5; 
sbit P3_4 = P3^4; 
sbit P3_3 = P3^3; 
sbit P3_2 = P3^2; 
sbit P3_1 = P3^1; 
sbit P3_0 = P3^0;     /*以上是對port3的0.1.2.3.4.5.6.7隻腳來做定義嗎?為何用sbit呢?以前都沒看過說?*/    #define MOTORSPEED P3_4 
#define MOTOREN P3_5     /*這兩行是對port3的4.5腳定義為MOTORSPEED和MOTOREN是嗎?我查過8051的3.4是T0,3.5是T1都為計時器,我總覺得MOTORSPEED是馬達速度,用計時器來控制很合理,但MOTOREN是馬達致能,感覺上是控制馬達動或不動,不太解說,您覺得呢?*/    unsigned char xdata SEGOUT _at_ (0X8001); 
unsigned char xdata LEDAOUT _at_ (0X8002); 
unsigned char xdata LEDBOUT _at_ (0X8003); 
unsigned char xdata DIPSWIN _at_ (0X8101);     unsigned char bdata SWDIPDATA     /*我上面這幾行是定義外部記憶體位置,可否請問xbata和bdata上的意思嗎?*/    sbitSW_0 = SWDIPDATA^0; 
sbitSW_1 = SWDIPDATA^1; 
sbitSW_2 = SWDIPDATA^2; 
sbitSW_3 = SWDIPDATA^3; 
sbitSW_4 = SWDIPDATA^4; 
sbitSW_5 = SWDIPDATA^5; 
sbitSW_6 = SWDIPDATA^6; 
sbitSW_7 = SWDIPDATA^7;     /*上面這些也是定義SW開關的0.1.2.3.4.5.6.7腳 ,為SWDIPDATA的0.1.2.3.4.5.6.7是嗎?*/    void INITT0(); 
void SPEEDSW();     /*為何我的主程式在底下void main(),但上面定義部份,卻已出現void INITT0(); 和void SPEEDSW();呢?是為何要這樣定義呢?*/    void main() 
{ 
INITT0() ;      /*上面這行是先執行過我下面的INITT0()程式再往下做是嗎?*/    while (1)       /*上面這行是不斷的迴圈掃瞄以下的動作是嗎?*/    { 
SWDIPDATA=~DIPSWIN;      /*上面這行是DIPSWIN值做反相放進SWDIPDATA是嗎?*/    if ( SW_0 == 1 )         /*上面這行是如果SW_0等於1就將MOTOREN = 0是嗎?*/    {MOTOREN = 0 ;} 
else                     /*上面是否則MOTOREN = 1是嗎?*/    {MOTOREN = 1 ;} 
SPEEDSW();               /*上面這行是執行過我下面的SPEEDSW()再往下做是嗎?*/    SEGOUT = SPEED / 100 ;        /*上面這行是將我速度除以100再給SEGOUT是嗎?*/    LEDAOUT = SWDIPDATA ;         /*上面這行是SWDIPDATA值給LEDAOUT是嗎?*/    LEDBOUT = (~SWDIPDATA) & 0X07 ;      /*上面這行是SWDIPDATA反相後和0X07,做AND將值給LEDBOUT是嗎?但我不懂0X07是什麼意思說,我查8051是暫存器0位址,也就是說SWDIPDATA反相後和暫存器0位址內的內容做AND是嗎?*/    } 
}    /*以下部份我想是做速度的變換的樣子,是用i這變數來切換我的速度對吧?*/    void SPEEDSW() 
{ 
unsigned char i ; 
i = (~SWDIPDATA)&0X0F ;      /*上面這行是SWDIPDATA反相再和0X0F(是暫存器1的位址是嗎?)來做AND再放到i這變數是嗎?但我的SWDIPDATA不是有0.1.2.3.4.5.6.7嗎?也就是2進制8個值是嗎?但我i只有1~15種選擇,我不太懂它是怎樣運算過後,i的值可選擇為1~15的值說*/    switch (i) 
{ 
case 0 :SPEED = 500;break ; 
case 1 :SPEED = 600;break ; 
case 2 :SPEED = 700;break ; 
case 3 :SPEED = 800;break ; 
case 4 :SPEED = 900;break ; 
case 5 :SPEED = 1000;break ; 
case 6 :SPEED = 1100;break ; 
case 7 :SPEED = 1200;break ; 
case 8 :SPEED = 1300;break ; 
case 9 :SPEED = 1400;break ; 
case 10 :SPEED = 1500;break ; 
case 11 :SPEED = 1600;break ; 
case 12 :SPEED = 1700;break ; 
case 13 :SPEED = 1800;break ; 
case 14 :SPEED = 1900;break ; 
case 15 :SPEED = 2000;break ; 
default :; break; 
}     /*接下來這段我感覺像是做中斷,但我不太懂底下的一些設定*/    void INITT0() 
{ 
EA = 0 ;       /*上面這行是將中斷致能位元設為0時,下面設定IP = 0X10 嗎?*/    IP = 0X10 ;       /*上面這行是將中段優先次序暫存器,設為0X10?但0X10是代表什麼呢?*/    EA = 1 ;          /*上面這行是將中斷致能位元設為1時,下面設定速度剛開始800,TMOD =1為計時器0設為模式1(為16bit計時器),如果像我剛開使速度是800就是(65536-800)除256後為252.875取前面的整數252再轉為二進制,放入TH0的8bit內,餘數方面,是(65536-800)除256後餘數為224轉為,二進制放入TL0的8bit內,是這樣子做嗎?TR0 = 1,是代表TR0內值,為1時計時器0開始計數嗎?還有下面的ET0 =1,我不太曉得它是設定什麼?*/    SPEED = 800 ; 
TH0 = (65536- SPEED)/256 ; 
TL0 = (65536- SPEED)%6 ; 
TMOD =1; 
TR0 = 1; 
ET0 =1 ; 
}    /*下面感覺是像做脈波產生,但還是有些問題*/    void T0_int (void) interrupt 1      /*上面這行內為何中間又一個(void)
這是代表什麼意思呢?我以前都沒看過說?*/    {     TR0 = 0 ;       /*上面這行是TR0 = 0,也就是計時器0還沒開始時,是看我SPEED中的i選擇那種速度,再去做運算,放入TH0和TL0這樣嗎?但底下怎又出現TR0 = 1,還有我覺得怪怪的脈波產生不是應該要設定TR0 = 1 才合理說,怎會一開始設TR0 = 0,然後底下又多一個TR0的設定,我不太了解*/    TH0 = (65536- SPEED)/256 ; 
TL0 = (65536- SPEED)%6 ; 
MOTORSPEED =~MOTORSPEED ; 
TR0 = 1 ; 
}
以上就是我遇到的許多問題,希望您能盡量幫我回答好嗎?由於我是一個人 做這專題,加上我本身底子又不好,專題老師也很忙,他希望我們能自己去 解決問題,也沒有同學或學長可問,這樣的情況下,讓我感覺很吃力, 但我真的很想把專題好好完成,如果您(或者有那位高手)不覺得帶給您困擾的 ,可以方便留下您們的msn或即時通嗎?讓我有機會可向您們請教嗎? 謝謝,感激... 我更改過版面了,這樣好多了嗎?如果還有那裡需更改,請多指教,謝謝...
leeli
初階會員


發表:57
回覆:55
積分:27
註冊:2003-06-25

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-09-27 18:49:42 IP:218.168.xxx.xxx 未訂閱
8051上用的C,大部分都是是使用Keil C這套軟體編譯的。你可以去書局找找, 我記得有幾本書寫得還不錯,滿適合你這種新手的。不過書名我忘記了~ 至於你的問題,我就盡量在我的能力範圍裡幫你解答吧。 <>< face="Verdana, Arial, Helvetica">引言:#include #include #include 以上幾個是標頭檔吧?是做什麼用途的呢? 標頭檔的作用,應該不用多說吧。如果不知道的話,請去翻一下C相關的書籍。 REG52.H 這個主要是定義8051的一些IO腳以及一些相關的address用法。 其他的都是標準C的標頭檔。
引言: /* P3 */ sbit P3_7 = P3^7; sbit P3_6 = P3^6; sbit P3_5 = P3^5; sbit P3_4 = P3^4; sbit P3_3 = P3^3; sbit P3_2 = P3^2; sbit P3_1 = P3^1; sbit P3_0 = P3^0; 以上是對port3的0.1.2.3.4.5.6.7隻腳來做定義嗎?為何用sbit呢?以前都沒看 過說?
sbit是Keil C裡面才有的語法。主要是用來定義成bit來使用的。像
 sbit P3_1=P3^1;
這邊就是把P3_1定義為port3的第一跟IO腳。你也可以直接將P3^1直接寫成他的 address;而P3_1是可以隨你高興寫的,只要你能在要用的時候記得他就什麼就 好了。
引言: #define MOTORSPEED P3_4 #define MOTOREN P3_5 這兩行是對port3的4.5腳定義為MOTORSPEED和MOTOREN是嗎?我查過8051的 3.4是T0,3.5是T1都為計時器,我總覺得MOTORSPEED是馬達速度,用計時器來控制 很合理,但MOTOREN是馬達致能,感覺上是控制馬達動或不動,不太解說,您覺得呢?
雖然,3.4 3.5是計時器。不過,如果你沒有把計時或計數的功能打開的話,她 還是一般的I/O port而已。至於,他是怎麼控制你的馬達,這就要看你的電路 圖,以及你想怎麼控制才能知道了。
引言:unsigned char xdata SEGOUT _at_ (0X8001); unsigned char xdata LEDAOUT _at_ (0X8002); unsigned char xdata LEDBOUT _at_ (0X8003); unsigned char xdata DIPSWIN _at_ (0X8101); unsigned char bdata SWDIPDATA 我上面這幾行是定義外部記憶體位置,可否請問xbata和bdata上的意思嗎? sbitSW_0 = SWDIPDATA^0; sbitSW_1 = SWDIPDATA^1; sbitSW_2 = SWDIPDATA^2; sbitSW_3 = SWDIPDATA^3; sbitSW_4 = SWDIPDATA^4; sbitSW_5 = SWDIPDATA^5; sbitSW_6 = SWDIPDATA^6; sbitSW_7 = SWDIPDATA^7; 上面這些也是定義SW開關的0.1.2.3.4.5.6.7腳為SWDIPDATA的0.1.2.3.4.5.6.7是嗎?
xdata跟bdata都是使用外部記憶體。只是用bdata定義參數的話,是可以將裡面 所有的bit來出來單獨使用。所以後面才會有sbit.........這兩個bdata 跟 sbit是要搭配使用的。 我們知道8051是8位元的單晶片,所以他一個數值的長短就是只有8bits=1 byte 所以你在前面宣告了一個byte的參數SWDIPDATA;而
 sbit SW_0=SWDIPDATA^0;
就是定義SW_0為SWDIPDATA的bit0。
引言: void INITT0(); void SPEEDSW(); 為何我的主程式在底下void main(),但上面定義部份卻已出現void INITT0(); 和void SPEEDSW();呢?是為何要這樣定義呢?
void INITT0(); void SPEEDSW(); 都算是副函式,所以你必須在開始要先宣告才能使用。這是C語言的基礎。我不多解釋了。
引言:void main() { INITT0() ; 這行是先執行過我下面的INITT0()程式再往下做是嗎?<--(1) while (1) 這行是不斷的迴圈掃瞄以下的動作是嗎?<--(2)
(1)就是你說的意思。 (2)如果不用無窮回圈的話,是因為8051如果將所有程式執行完後,就會重頭開 始,簡單的說就是會reset重新開始。這樣說你明白迴圈的意義了嗎? 今天我就先說明到此。強烈建議你先去書局找找C語言跟keil c的相關書籍,先 研讀一下。因為,我覺得你的基礎真的快等於是沒有。所以建議你先學習一下 吧。 其實8051的keil C是很簡單的C語法的應用。畢竟8051只是8位元的單晶片,能 處理的事情不多。所以不太需要太高深的C語言。只要你用點心,一定能很快上 手的。 在此就先祝福你吧,有任何問題歡迎你在找我討論。 小弟我是BCB的新手,若有發問一些蠢問題,敬請見諒。 對於各位的大力協助,感激不盡! 發表人 - leeli 於 2005/09/27 18:53:51
------
小弟我是BCB的新手,若有發問一些蠢問題,敬請見諒。
對於各位的大力協助,感激不盡!
系統時間:2024-07-04 16:27:38
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!