Robofun 機器人論壇

 找回密碼
 申請會員
搜索
熱搜: 活動 交友 discuz
查看: 8531|回復: 9
打印 上一主題 下一主題

關於AT89C2051使用C語言,燒錄後跑不出來

[複製鏈接]
跳轉到指定樓層
1#
發表於 2008-7-3 02:32:15 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
我的問題如下:

我用AT89C2051測試LED燈的亮滅,間隔0.5秒。

使用軟體為KEIL C。

我用組合語言編寫燒錄後,放入硬體測試沒問題。

可是我用C語言編寫燒錄後,卻不行。燒錄機是WELLON VP280

我用其他ic AT89C51 AT89S51 用c語言都沒問題,可是換成AT89C2051就不行。


我的組合語言如下
ORG0000H
LOOP:
MOVP1,#00000000B
ACALLDELAY
MOVP1,#11111111B
ACALLDELAY
AJMPLOOP
DELAY:
MOVR5,#10
DL1:
MOVR6,#250
DL2:
MOVR7,#200
DL3:
DJNZR7,DL3
DJNZR6,DL2
DJNZR5,DL1
RET
END

C語言如下
#include<AT89x051.H>
sbit led=P1^0;
delay(int d)
{
int i,j,k;
for(i=0;i<d;i++)
for(j=0;j<120;j++)
for(k=0;k<100;k++) ;
}
main()
{
while(1)
{
led=0;
delay(5);
led=1;
delay(5);
}
}

我有include檔案進去,debug時是沒問題的。

有高手遇過這種問題嗎?

我測試了很久,都沒辦法。

有人能幫我解答嗎?

感謝

[ 本帖最後由 draw3299 於 2008-7-3 02:33 編輯 ]
2#
發表於 2008-7-3 11:40:23 | 只看該作者
for(k=0;k<100;k++) ;
多一個  ;
3#
 樓主| 發表於 2008-7-3 13:20:53 | 只看該作者
sansam大大
for(k=0;k<100;k++) ;
這個; 在那個DELAY副程式裡面 for迴圈結尾如果沒敘述的話,不就是要加個  ; 嗎??
就像是單純的無限迴圈 while(1); 一樣
如果拿掉的話 不能build
而且我也照你說的把; 拿掉,的確是不能build。

我上面那個問題,我測試了好久,就是c語言沒辦法作用。我的.head檔應該是沒問題的,只是不知道到底為什麼會這樣,用c語言在其他晶片(at89c51)是沒問題的。
不曉得有沒有大大遇到這樣的問題??
4#
發表於 2008-7-3 13:37:41 | 只看該作者
請參考
http://www.atmel.com/dyn/resources/prod_documents/doc0368.pdf

P3

4.3 Port 1
The Port 1 is an 8-bit bi-directional I/O port. Port pins P1.2 to P1.7 provide internal pull-ups. P1.0
and P1.1 require external pull-ups.
P1.0 and P1.1 also serve as the positive input (AIN0) and the
negative input (AIN1), respectively, of the on-chip precision analog comparator. The Port 1 output
buffers can sink 20 mA and can drive LED displays directly. When 1s are written to Port 1
pins, they can be used as inputs. When pins P1.2 to P1.7 are used as inputs and are externally
pulled low, they will source current (IIL) because of the internal pull-ups.
Port 1 also receives code data during Flash programming and verification.


看看上列加底線的說明
試試看是否有效
5#
 樓主| 發表於 2008-7-3 15:41:01 | 只看該作者
回austin12112大

剛剛測試過,還是不行。

他的P1.0與P1.1是可以當比較器用。

之前用組合語言的程式,我P1.0與P1.1沒有裝提升電阻,不過照樣能執行。
真的蠻怪的...AT89C2051 我用C語言燒錄...卻不行...

不然這顆IC很可愛的說....

有大大能幫我寫一個AT89C2051的C語言的簡單的LED燈亮滅程式,與弄成HEX檔,讓我燒錄看看可以嗎?
我想測試看看。感謝。

因為我是在想,會不是是KEIL C Build hex檔時,有錯誤(應該不太可能)。
6#
發表於 2008-7-4 09:22:10 | 只看該作者
你說你寫組語可以,但是C不可以RUN

那我知道
是 Keil C 最佳化把你的 Delay 函式省掉了
所以你可以用示波器量量看LED,應該有很高速的Hi Lo 變化
處理方法
方法一:
在程式開頭加入下行
#include <intrins.h>
修改Delay 函式
delay( unsigned int d )
{
        int i,j,k;

        for(i=0;i<d;i++)
                for(j=0;j<120;j++)
                        for(k=0;k<100;k++)
                        {
                                _nop_() ;
                        }
}


方法二:
Options  for  Target 的 畫面中
C51 子選項
Code Optimization 的 Level 選 "0"

以上

試試看吧
7#
 樓主| 發表於 2008-7-4 16:10:06 | 只看該作者
austin1211大

我有按照你的方法去做,不過...orz  沒有......

不過我按照你的觀念去改變了程式,只讓led燈全亮,不作亮滅的動作,不過依然還是沒亮。

我在想是不是head檔出了問題還是....那顆ic對c語言過敏,可是我試了兩顆結果都一樣...還是說的operation target面地方需要改,

不過偏偏就只有c2051不能...其他ic都ok  。我也覺得艇怪的...
8#
發表於 2008-7-5 22:32:04 | 只看該作者
Dear Draw3299,

我建議您先將你的C編譯出來的檔案(反組譯回ASM) 跟你原本的ASM做比較. 我認為應該是你目前的用的init.S的MCU type與你目前系統不合. 我建議您可能自己寫一個簡單的init.S然後jump到C的main這樣問題會比較收斂喔.

Regards,
Kaffe

原帖由 draw3299 於 2008-7-4 16:10 發表
austin1211大

我有按照你的方法去做,不過...orz  沒有......

不過我按照你的觀念去改變了程式,只讓led燈全亮,不作亮滅的動作,不過依然還是沒亮。

我在想是不是head檔出了問題還是....那顆ic對c語言過敏 ...
9#
發表於 2008-7-10 21:22:38 | 只看該作者
改成如下一定可以 ,for只能兩層
#include<AT89x51.H>
sbit led=P1^0;
void delay(int  d)
            {        int i,j;
                   for(i=0;i< d;i++)
                    for(j=0;j<1940;j++);
                       
                }
void main()
{
        while(1)
        {
                led=0;
                delay(100);
                led=1;
                delay(100);
        }
}
10#
發表於 2008-7-11 03:15:40 | 只看該作者
有沒有在P1.0加上提升電阻? ˙3˙
89C2051的P1.0、P1.1是沒提升電阻的喔
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

小黑屋|手機版|Archiver|機器人論壇 from 2005.07

GMT+8, 2024-11-24 02:39 , Processed in 0.146624 second(s), 7 queries , Apc On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表