• 2

[求助]關於AT89C51使用keil c編譯跟用AL-100燒入的問題?

我是用keil c下去編譯讓它產生.HEX在到ALL-100燒入到AT89C51!

定義使用reg51.h這樣應該是OK吧!?
#include
在keil c下偵錯只顯示警告都無錯誤!

燒入時可燒入進去!但去看燒入資料只有"3筆"!用電路下去測試也都無反應!
這樣是IC方面出了問題還是編譯程式有問題!?
在keil c編譯跟燒錄AL-100裡都選用89C51這個組譯下去編譯跟燒入!

之前是用DMA-USB 2131 (Keil C Compiler)下去做!現在改成使用AT89C51!
故我接腳要由PA改成P0是吧?
PA-P0
PB-P1
PC-P2
PD-P3
定義由#include
改成#include


程式太多!我用文字敘述!不好意思!
不知道是否是燒入跟編譯時有選不對的IC編號!還是定義錯誤!或者是IC壞了!?
2006-11-02 20:03 發佈
我想,這就要問施主啦.
光這樣是不可能知道為什麼的.
資訊太少了.
可能是燒錄器有問題,IC的EEPROM是壞的,IC沒接好,接反了,你程式沒寫好...

不過, complier的錯是不太可能發生的.八成是硬體問題吧.
與其上來問,
倒不如去請有經驗的同事幫忙看.

不知道做電子的三寶有什麼?
電表,示波器,LA? 反正有什麼寶貝就搬出來用就對了.

又不是遠端Debug...還是打電話教功夫(請見星爺的電影)....
#include<reg51.h>

void delay (int time);
void cowr(char com);
void dawr(char dat);
main()
{
char MSG0[] = "ERROR !!";
char MSG1[] = "PASS OK!";
char MSG2[] = "LOCK KEY!";
unsigned int sum;

int i,m,n,p,r,q=0;

loop2:
cowr(0x01); //規劃LCD:清除LCD
cowr(0x3b); //規劃LCD:為雙行且字型為5*7dot矩陣
cowr(0x0f); //規劃LCD:游標ON且閃爍

repeat:
cowr(0x86); //控制游標到第一列第五個格
dawr(0xa0); //清除前面留下之四個字
dawr(0xa0);
dawr(0xa0);
dawr(0xa0);
cowr(0x86);
while(1)
{
m=P0&0x1f; //&0x1f 讀入的port A 只取a0~a4 而a7~a5位元清除為0
if(m>=0x10)
{
m=m-0x10; //千位數
if (m==0x0f) //按f鍵回到loop2
{
goto loop2;
}
dawr(m+0x30);
while(1)
{
n=P0&0x1f;
if(n>=0x10)
{
n=n-0x10;//百位數
if (n==0x0f)
{
goto loop2;
}
dawr(n+0x30);
while(1)
{
p=P0&0x1f;
if(p>=0x10)
{
p=p-0x10;//十位數
if (p==0x0f)
{
goto loop2;
}
dawr(p+0x30);
while(1)
{
while(1)
{
r=P0&0x1f;
if(r>=0x10)
{
r=r-0x10;//個位數
if (r==0x0f)
{
goto loop2;
}
dawr(r+0x30);
sum=m*1000+n*100+p*10+r;//計算輸入鍵的數目
goto loop1;

}
loop1: if(sum==1234) //密碼設定
{
q=0;
cowr(0xc4); //控制游標到第二列第五個格
for(i=0;i<=7;i++)
dawr(MSG1[i]);
P2=0x08; //pc3高位元則門鎖開
for(i=0;i<=1;i++) //鎖定10秒
delay(5000);
P2=0x00; //pc3低位元則門鎖關
goto repeat;
}
else
{
cowr(0xc4);
for(i=0;i<8;i++)
dawr(MSG0[i]);
q=q+1;
if (q==3)
{
cowr(0xc4);
for(i=0;i<=8;i++)
dawr(MSG2[i]);
while(1)
{
P2=0x10; //pc4高位元則蜂鳴器響
for(i=0;i<=5;i++) //鎖定約半分鐘
delay(10000);
q=0;
P2=0x00; //pc4低位元蜂鳴器響關
goto loop2;

}
}
goto repeat;
}
}
}
}
}
}
}
}
}
}
void cowr(char com) //命令寫入LCD
{
P1=com;
P2=0x04;
delay(300);
P2=0x00;
return;
}

void dawr(char dat) //資料寫入LCD
{
P1=dat;
P2=0x05;
delay(300);
P2=0x00;
return;
}

int j,k;
void delay (int time)
{
for (k=0; k<time; k++) // 多少 milliseconds
for (j=0; j<400; j++);
}



以上是我的程式!偵錯都無問題!也能產生.HEX檔!
不知道程式有寫錯嗎?
不會是source code的問題....都complie出來了.
你把燒錄時的畫面post上來看看再說.
不懂什麼叫燒3筆. 不記得河洛的燒錄器有什麼燒3筆的. 你是不是有搞錯什麼.
再來,如果燒錄時有鎖住 IC, 那也讀不出來.
燒錄時型號要完全正確 AT89C51不只一種,還有包裝,電壓,都要選對....

你還是問同事較快吧.
不然就拿示波器看看有沒有在動. 搞不好電路板有問題.


我是使用AT89C51 20PC 0009燒錄時型號用 AT89C51應該試沒錯吧!
用ALL-100燒入器!
我燒完把資料叫出來看!它只有寫入3筆資料而已!照道理說應該不只3筆!
我想應該是燒入方面有問題!我在試看看囉!
電路板測試過!都OK!


謝謝longyeekimo大大!


程式須不須設起始位址,在assembler 須有org定義,看看產生的.lst檔或.hex檔是否在0000至0fff中有程式
燒錄前有沒有將前一次程式清除,或燒錄時腳座是否有夾緊
1.程式須不須設起始位址,在assembler 須有org定義
需有org定義??不懂耶!大大妳能解釋嗎?
妳的意思事說:要告訴編譯器到C語言目錄裡的include目錄找表頭檔<reg51.h>
#include<reg51.h>
式這個意思嗎?

2.看看產生的.lst檔或.hex檔是否在0000至0fff中有程式

試再keil c裡看嗎?
我在ALL-100燒入完時去看燒完資料,只有前3筆有資料!
意思我燒入只有3筆!
** ** ** 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00


有清除!也有夾緊!也換過IC!都是顯示只燒入3筆資料!






無關解答...

剛看一下程式,雖然是丟字串,不過還是一個字一個字的送喔...

所以...dawr(MSG1[ i ]);

應該才會把字碼送到LCD吧

build後也沒warning了^^"
我是習慣寫assembier,對於c不是很熟,但是就算用c寫,他最後都要轉成機械碼,

ORG 是宣告程式放在ORG 後面指定的位址

3個byte應該是 02 xx xx吧,那是RESET後將執行的第一個指令位址,若第30pin為high,且外部並沒有ROM,那02 XX XX中的XX XX,卻超過0000-0FFF的話,那程式就會跑到0000-0FFF以外,但又沒ROM在外部,所以CPU找不到程式執行

若30PIN為LOW,那程式燒在8051內並無意義,因為根本不會去執行,他會到外部找ROM內的程式來執行

在ALL100,中DUMP來看,繼續往下找應該找得到

不過看來應該是程式已經超出0000-0FFF(4K)的位址了,因為沒有程式的位址都補00

測試版OK,是用MICE模擬,還是ROM模擬器模擬
無關解答...

剛看一下程式,雖然是丟字串,不過還是一個字一個字的送喔...

所以...dawr(MSG1[ i ]);

應該才會把字碼送到LCD吧

build後也沒warning了^^"

嗯嗯!我程式是有寫dawr(MSG1[ i ]);
不知為什麼貼上來被你發現少了[i]
謝謝你囉!
  • 2
內文搜尋
X
評分
評分
複製連結
Mobile01提醒您
您目前瀏覽的是行動版網頁
是否切換到電腦版網頁呢?