Robofun 機器人論壇

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

8051 C語言問題 (有附上我的程式) 請各位幫忙抓bug

[複製鏈接]
xu3u4rmp4 該用戶已被刪除
跳轉到指定樓層
1#
發表於 2010-6-27 22:44:55 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最後由 xu3u4rmp4 於 2010-6-28 01:34 編輯

delay副程式我下面就省略不打出來

我想要的功能是
當i等於PWM[]中的資料時
Port 0上對應的腳位LED熄滅

for迴圈為1秒執行一次,共10次
PWM[]中的資料為2.4.6三個
我想要的結果因該是第2.4.6秒時LED依序熄滅

但功能錯誤,是否是我的語法錯誤,請各位前輩幫忙抓bug

#include <AT89X51.h>
void delay(unsigned int );
char i;
unsigned int code PWM[]={2,4,6};
main()
{
P0=0xff;//Port 0上的LED全亮
while(1)
{
        for(i=0;i<10;i++)
        {       
                if(i==PWM[1])P0_0=0;//若i=2則P0.0上的LED熄滅
                if(i==PWM[2])P0_1=0;//若i=4則P0.1上的LED熄滅
                if(i==PWM[3])P0_2=0;//若i=6則P0.2上的LED熄滅
                delay(1);//延時1秒
        }
}

}
2#
發表於 2010-6-28 01:23:24 | 只看該作者
那三行if應該有大問題
i=PWM[1]
---> 等號在C語言裡面是"指定運算子"
---> 兩個等號在C語言裡面是"比較運算子"

要比較應該使用"=="
xu3u4rmp4 該用戶已被刪除
3#
 樓主| 發表於 2010-6-28 01:38:10 | 只看該作者
謝謝 mzw2008 大  回應
我打錯了.已修改為2個等號  
模擬時            LED熄滅順序為 P0.2--> P0.0--> P0.1
但我要的功能是      熄滅順序為 P0.0--> P0.1--> P0.2
最大問題在這裡
4#
發表於 2010-6-28 10:39:23 | 只看該作者
>>unsigned int code PWM[]={2,4,6};
以這個而言是 PWM[0]=2, PWM[1]=4,PWM[2]=6,
PWM[3]=0<< PWM3沒宣告所以是0
因 i從零開始 所以一開始是 pwm[3] 也就是p0.2 >> pwm1(p0.0)>>pwm2(p0.1)
5#
發表於 2010-6-28 11:06:42 | 只看該作者
同 naga 的說法
pwm[] 陣列都是從 0 開始的,
所以要注意 開始的index 用法~
xu3u4rmp4 該用戶已被刪除
6#
 樓主| 發表於 2010-6-28 15:48:26 | 只看該作者
本帖最後由 xu3u4rmp4 於 2010-6-28 15:54 編輯

瞭解 我的觀念錯誤
問題已解決
謝謝 mzw2008 大 naga大 及mac1大 指正
xu3u4rmp4 該用戶已被刪除
7#
 樓主| 發表於 2010-6-28 16:19:37 | 只看該作者
還有一個問題
if (運算式)  {指令區塊;}
if選擇指令中.指令區塊我有3個動作如下
模擬時出現這2行錯誤
    a[j 1]= a[j];
    a[j]= temp;
會不會是.指令區塊只能有1個動作
那我要3個動作怎麼辦

  if (a[j]> a[j 1])       //相互做比較,a[j]大於a[j 1]將兩資料互換
  {
    temp =a[j 1];
    a[j 1]= a[j];
    a[j]= temp;
   }
8#
發表於 2010-6-28 17:19:02 | 只看該作者
a[j 1]= a[j];
這個a[j 1] 是什麼啊??
應該是a[j+1] 或是a[j-1]吧 ??
xu3u4rmp4 該用戶已被刪除
9#
 樓主| 發表於 2010-6-28 19:16:42 | 只看該作者
本帖最後由 xu3u4rmp4 於 2010-6-28 19:17 編輯

這是我在知識家看到的程式
我先貼完整的
他是氣泡排序法
#include <reg51.h>   
unsigned  char a[]={31,30,27,26,25,28,24,
23,22,21,29,20,17,16,15,18,
14,13,12,11,19,10,7,6,5,8,4,3,2,1,9,0};
void main(void)
{
char  j=0,j1=0,temp;
for ( j1=0;  j1<31;   j1   ) //j1迴圈的連續31所有數排好 
    {
  for( j=0;  j<31;   j   ) //j迴圈連續31次就可以最大數移到下面, 
  {
  if (a[j]> a[j1])       //相互做比較,a[j]大於a[j 1]將兩資料互換
  {
    temp =a[j1];
    a[j1]= a[j];
    a[j]= temp;
   }
   }
}
}
把數小到大排好有很多方法,最為簡易泡沫排序法, 所謂泡沫排序是上下兩相鄰的資料相互做比較,
如果上比較大將兩資料互換,依次由上往下比,大的會往下移,由上到下一次就可最大數移到下面,上到
下連續31所有數排好O
xu3u4rmp4 該用戶已被刪除
10#
 樓主| 發表於 2010-6-28 20:30:30 | 只看該作者
Keil c 模擬
出現錯誤
1.C(23): error C183: unmodifiable lvalue
1.C(24): error C183: unmodifiable lvalue
分別為 這2行
    a[j1]= a[j];
    a[j]= temp;
11#
發表於 2010-6-28 23:14:21 | 只看該作者
原來是j1
你怎麼打成j 1呢?   多個空格差很多耶

而且這程式也很怪
for 迴圈裡面就怪怪的, 最後那個j這樣寫, 整個迴圈是根本不會變化吧
12#
發表於 2010-6-29 13:14:01 | 只看該作者
1. 會出現 unmodifiable lvalue 通常關係到你宣告 a[]的型態
有加了 const 變成防寫的才會有這種 error

2. for 迴圈裡少了 j++, j1++的動作, 這樣會停在
a[0] = a[0] 的地方, 也可能是錯誤點
for 迴圈的基本用法要注意喔~

3. 氣泡排序在實用方面,我是建議資料在10個以內的可以用啦,
不然超過的資料用這方法找還真是誇張的慢,很多方法都可以加速找到,
例如二分法既不難又快速...
xu3u4rmp4 該用戶已被刪除
13#
 樓主| 發表於 2010-6-30 01:28:55 | 只看該作者
1.我在模擬時有加上  j++及j1++

2.a[0] = a[0] 的地方, 也可能是錯誤點<------怎麼說呢?

3.可以舉例介紹一下二分法嗎?

4.加了 const 變成防寫<----這是什麼意思.那要怎樣改善?
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-11-23 21:02 , Processed in 0.119314 second(s), 9 queries , Apc On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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