Robofun 機器人論壇
標題:
8051 C語言問題 (有附上我的程式) 請各位幫忙抓bug
[打印本頁]
作者:
xu3u4rmp4
時間:
2010-6-27 22:44
標題:
8051 C語言問題 (有附上我的程式) 請各位幫忙抓bug
本帖最後由 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秒
}
}
}
作者:
mzw2008
時間:
2010-6-28 01:23
那三行if應該有大問題
i=PWM[1]
---> 等號在C語言裡面是"指定運算子"
---> 兩個等號在C語言裡面是"比較運算子"
要比較應該使用"=="
作者:
xu3u4rmp4
時間:
2010-6-28 01:38
謝謝 mzw2008 大 回應
我打錯了.已修改為2個等號
模擬時 LED熄滅順序為 P0.2--> P0.0--> P0.1
但我要的功能是 熄滅順序為 P0.0--> P0.1--> P0.2
最大問題在這裡
作者:
naga
時間:
2010-6-28 10:39
>>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)
作者:
mac1
時間:
2010-6-28 11:06
同 naga 的說法
pwm[] 陣列都是從 0 開始的,
所以要注意 開始的index 用法~
作者:
xu3u4rmp4
時間:
2010-6-28 15:48
本帖最後由 xu3u4rmp4 於 2010-6-28 15:54 編輯
瞭解 我的觀念錯誤
問題已解決
謝謝 mzw2008 大 naga大 及mac1大 指正
作者:
xu3u4rmp4
時間:
2010-6-28 16:19
還有一個問題
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;
}
作者:
mzw2008
時間:
2010-6-28 17:19
a[j 1]= a[j];
這個a[j 1] 是什麼啊??
應該是a[j+1] 或是a[j-1]吧 ??
作者:
xu3u4rmp4
時間:
2010-6-28 19:16
本帖最後由 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
時間:
2010-6-28 20: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;
作者:
mzw2008
時間:
2010-6-28 23:14
原來是j1
你怎麼打成j 1呢? 多個空格差很多耶
而且這程式也很怪
for 迴圈裡面就怪怪的, 最後那個j這樣寫, 整個迴圈是根本不會變化吧
作者:
mac1
時間:
2010-6-29 13:14
1. 會出現 unmodifiable lvalue 通常關係到你宣告 a[]的型態
有加了 const 變成防寫的才會有這種 error
2. for 迴圈裡少了 j++, j1++的動作, 這樣會停在
a[0] = a[0] 的地方, 也可能是錯誤點
for 迴圈的基本用法要注意喔~
3. 氣泡排序在實用方面,我是建議資料在10個以內的可以用啦,
不然超過的資料用這方法找還真是誇張的慢,很多方法都可以加速找到,
例如二分法既不難又快速...
作者:
xu3u4rmp4
時間:
2010-6-30 01:28
1.我在模擬時有加上 j++及j1++
2.a[0] = a[0] 的地方, 也可能是錯誤點<------怎麼說呢?
3.可以舉例介紹一下二分法嗎?
4.加了 const 變成防寫<----這是什麼意思.那要怎樣改善?
歡迎光臨 Robofun 機器人論壇 (https://robofun.net/forum/)
Powered by Discuz! X3.2