- 註冊時間
- 2009-8-6
- 最後登錄
- 2023-12-29
- 主題
- 查看
- 積分
- 216
- 閱讀權限
- 50
- 文章
- 230
- 相冊
- 0
- 日誌
- 0
 
狀態︰
離線
|
本帖最後由 Jackchen00 於 2011-11-21 18:53 編輯
你的程式除了樓上大大的回覆之外
我想跟你分享ㄧ些觀念
如果你的變數沒有正負號話
最好是宣告為unsigned char(8bit)或unsigned int(16bit)
主程式main()只能有一個
如果你的這兩行
char o[10] ={0x0a,0x09,0x01,0x01,0x0a,0x07,0x08,0x06,0x03,0x08}; /*0,9,1,1,0,7,8,6,3,8*/
char o1[10] ={0x0a,0x04,0x02,0x05,0x02,0x0a,0x01,0x07,0x02,0x08}; /*0425201728*/
只是一個常數不會變動的話
你應該宣告成
unsigned char code o[10]={0x0a,0x09,0x01,0x01,0x0a,0x07,0x08,0x06,0x03,0x08}; /*0,9,1,1,0,7,8,6,3,8*/
unsigned char code o1[10]={0x0a,0x04,0x02,0x05,0x02,0x0a,0x01,0x07,0x02,0x08}; /*0425201728*/
放在程式碼裡面才不會佔用資料記憶體(暫存器)
還有用RS232做傳輸最好還是加上Parity check及Checksum以避免傳輸中發生錯誤
你的部分主程式我幫你改成以下的程式
while(1) /*程式開始*/
{
P2=signal;
if(t==1)
{
if(w<=10)
{
q[w]=x;
SBUF=x;
w++;
}
t=2;
}
else if(t==2) /*判斷號碼程式*/
{
if (((q[1]==o[0]) && (q[2]==o[1]) && (q[3]==o[2]) && (q[4]==o[3])
&& (q[5]==o[4]) && (q[6]==o[5]) && (q[7]==o[6]) && (q[8]==o[7])
&& (q[9]==o[8]) && (q[10]==o[9])) ||
((q[1]==o1[0]) && (q[2]==o1[1]) && (q[3]==o1[2]) && (q[4]==o1[3])
&& (q[5]==o1[4]) && (q[6]==o1[5]) && (q[7]==o1[6]) && (q[8]==o1[7])
&& (q[9]==o1[8]) && (q[10]==o1[9])))
{
signal=a1;
P2=signal;
}
t=0;
}
}
另外
void EX0_int(void) interrupt 0 /*INT0中斷程式碼*/
{
char a=0xff;
char b=0x0f;
a=b&P1;
x=a;
t=1;
}
這段程式中
1, a不需設初值,設初值會增加一個指令
2, 不需設a,b這個變數,只要將a=b&P1改成x = P1 & 0x0f;即可
EX0_int() interrupt 0 /*INT0中斷程式碼*/
{
x = P1 & 0x0f;
t = 1;
}
還有你的變數w在大於10以後並沒有做歸零的動作
if(w<=10)
{
q[w]=x;
SBUF=x;
w++;
}
你的這段程式可能會有問題 |
-
總評分: 威望 + 2
查看全部評分
|