我是用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壞了!?
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檔!
不知道程式有寫錯嗎?
你把燒錄時的畫面post上來看看再說.
不懂什麼叫燒3筆. 不記得河洛的燒錄器有什麼燒3筆的. 你是不是有搞錯什麼.
再來,如果燒錄時有鎖住 IC, 那也讀不出來.
燒錄時型號要完全正確 AT89C51不只一種,還有包裝,電壓,都要選對....
你還是問同事較快吧.
不然就拿示波器看看有沒有在動. 搞不好電路板有問題.
需有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筆資料!
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模擬器模擬
內文搜尋

X