sgchieh0414
一般會員
![](./myimg/board/mystar_empty.gif)
![](images/icon_photo_none.gif) 發表:17 回覆:16 積分:6 註冊:2005-08-08
發送簡訊給我
|
能幫我詳細解釋一下這段程式嗎?我跟本都完全看不懂說~一頭霧水~不太曉得它在做些什麼?我程式本身基處就較差~希望有高手能指點,指點~或能給我一些見意,如教學網站,範例,書藉等等的嗎??謝謝... #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 ;
}
|
阿信
版主
![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif)
![](images/icon_photo_none.gif) 發表:111 回覆:983 積分:813 註冊:2005-03-10
發送簡訊給我
|
可以詳細說明你的問題嗎 這是用8051單晶片的C語言 功能是讀取外部指撥開關 來控制馬達 你學過C語言嗎 學過8051嗎 為什麼要看一個完全看不懂的程式
|
sgchieh0414
一般會員
![](./myimg/board/mystar_empty.gif)
![](images/icon_photo_none.gif) 發表:17 回覆:16 積分:6 註冊:2005-08-08
發送簡訊給我
|
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或即時通嗎?讓我有機會可向您們請教嗎?謝謝,感激...
|
㊣
版主
![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif)
![](http://delphi.ktop.com.tw/download.php?download=upload/4623abf5479d8_beach.jpg) 發表:261 回覆:2302 積分:1667 註冊:2005-01-04
發送簡訊給我
|
po程式碼請做好縮排. 不知如何做請參考版規.
煩請修改配合!謝謝!
------ -------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
|
sgchieh0414
一般會員
![](./myimg/board/mystar_empty.gif)
![](images/icon_photo_none.gif) 發表:17 回覆:16 積分:6 註冊:2005-08-08
發送簡訊給我
|
to 版主 我是發問新人,版規在那呢?我怎都找不到來看 謝謝.....
|
阿信
版主
![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif)
![](images/icon_photo_none.gif) 發表:111 回覆:983 積分:813 註冊:2005-03-10
發送簡訊給我
|
引言:
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
|
㊣
版主
![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif)
![](http://delphi.ktop.com.tw/download.php?download=upload/4623abf5479d8_beach.jpg) 發表:261 回覆:2302 積分:1667 註冊:2005-01-04
發送簡訊給我
|
引言:
to 版主 我是發問新人,版規在那呢?我怎都找不到來看 謝謝.....
就在本頁裡, 找一下公告的部分.
------ -------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
|
sgchieh0414
一般會員
![](./myimg/board/mystar_empty.gif)
![](images/icon_photo_none.gif) 發表:17 回覆:16 積分:6 註冊:2005-08-08
發送簡訊給我
|
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
初階會員
![](./myimg/board/mystar.gif)
![](images/icon_photo_none.gif) 發表:57 回覆:55 積分:27 註冊:2003-06-25
發送簡訊給我
|
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的新手,若有發問一些蠢問題,敬請見諒。
對於各位的大力協助,感激不盡!
|