/*----------------------------------------------- 功能:流水燈對(duì)稱移動(dòng)閃爍(雙閃爍) 作者:fei yu 日期:2010-6-14 ------------------------------------------------*/ #include<REG52.H> #define uint unsigned int void delay(uint); main() { uint comp1=0xfe; uint comp2=0x80; P1=0x7e; delay(30000); while(1) { P1=0xff; comp1<<=1; comp1|=0x01; comp2>>=1; P1&=comp1; P1^=comp2; delay(30000); if(P1==0xe7) { comp1<<=1; comp1|=0x01; comp2>>=1; } if(comp1==0x7f) { comp1=0xfe; comp2=0x80; } } } void delay(uint cnt) { while(cnt--); } /*----------------------------------------------------------------- 只循環(huán)一次,而沒(méi)有一直循環(huán)下去,出錯(cuò)地方在: 通過(guò)添加一條測(cè)試語(yǔ)句: if(comp1==0x7f) { comp1=0xfe; comp2=0x80; P1=0x00; delay(30000); } 發(fā)現(xiàn)if語(yǔ)句沒(méi)有被執(zhí)行,自然繼續(xù)左右移動(dòng): 1111 1111&1111 1111^0000 0000==11111 1111 所以看起來(lái)是執(zhí)行了一次while中的代碼。 具體為什么不行,還不清楚…… 更正下列代碼后,能夠?qū)崿F(xiàn)功能。 if(P1==0x7e) { comp1=0xfe; comp2=0x80; } 或者: if(comp2==0x01) { comp1=0xfe; comp2=0x80; } --------------------------------------------------------------*/ ************************************************************************************************************************************** /*----------------------------------------------- 功能:流水燈(單向單閃爍) 作者:fei yu 日期:2010-6-14 ------------------------------------------------*/ #include<reg52.h> #define uint unsigned int void delay(uint); main() { //uint fre=0x03; //uint comp1=0xfe,comp2=0x80; P1=0xfe; while(1) { /*------------------------------------------------------------------ 模塊1:循環(huán)單向閃爍,只有一個(gè)燈亮滅 執(zhí)行3次,轉(zhuǎn)入下一種閃爍 --------------------------------------------------------------------*/ while(1) { delay(30000); P1<<=1; P1|=0x01; if(P1=0x7f) { delay(30000); P1=0xfe; } } } } void delay(uint cnt){while(cnt--);} /*----------------------------------------- 程序運(yùn)行結(jié)果左右兩端跳動(dòng),原因是: if(P1=0x7f);中的等號(hào)也成了賦值號(hào),更正為if(P1==0x7f); 特別注意,不要把判斷語(yǔ)句種的等號(hào)誤寫(xiě)為賦值號(hào)。 -----------------------------------------*/ ************************************************************************************************************************************** /*----------------------------------------------- 功能:花樣燈(單向單閃爍+單向雙閃爍) 作者:fei yu 日期:2010-6-14 ------------------------------------------------*/ #include<reg52.h> #define uint unsigned int void delay(uint); main() { uint fre=0x04; uint comp1=0xfe,comp2=0x80; while(1) { /*------------------------------------------------------------------- 模塊1:循環(huán)單向閃爍,只有一個(gè)燈亮滅 執(zhí)行3次,轉(zhuǎn)入下一種閃爍 --------------------------------------------------------------------*/ P1=0xfe; while(1!=fre--) { delay(30000); P1<<=1; P1|=0x01; if(P1==0x7f) { delay(30000); P1=0xfe; } } /*------------------------------------------------------------------- 模塊2:循環(huán)單向閃爍,只有兩個(gè)燈亮或者滅 執(zhí)行3次,轉(zhuǎn)入下一種閃爍 --------------------------------------------------------------------*/ P1=0xfc; while(3!=fre++) { delay(30000); P1<<=2; P1|=0x03; if(P1==0x3f) { delay(30000); P1=0xfc; } } } } void delay(uint cnt) { while(cnt--); } /*---------------------------------------------------- 兩個(gè)模塊均沒(méi)有問(wèn)題,但是放在一起,并沒(méi)有得到想要的結(jié)果, 第一個(gè)循環(huán)沒(méi)有進(jìn)行完全,且兩個(gè)循環(huán)的循環(huán)的次數(shù)與要求的不符。 錯(cuò)誤地方在于:模塊1和模塊2的循環(huán)控制的只是一次亮滅,更正為: #include<reg52.h> #define uint unsigned int void delay(uint); main() { uint fre=0x04; uint fre1,fre2; uint comp1=0xfe,comp2=0x80; while(1) { /*-------------------------------------------------------------------- 模塊1:循環(huán)單向閃爍,只有一個(gè)燈亮滅 執(zhí)行3次,轉(zhuǎn)入下一種閃爍 --------------------------------------------------------------------------*/ P1=0xfe; while(1!=fre--) { fre1=0x08; while(1!=fre1--) { delay(3000000); P1<<=1; P1|=0x01; if(P1==0x7f) { delay(3000000); P1=0xfe; } } } /*------------------------------------------------------------------- 模塊2:循環(huán)單向閃爍,只有兩個(gè)燈亮或者滅 執(zhí)行3次,轉(zhuǎn)入下一種閃爍 --------------------------------------------------------------------*/ P1=0xfc; while(3!=fre++) { fre2=0x04; while(1!=fre2--) { delay(3000000); P1<<=2; P1|=0x03; if(P1==0x3f) { delay(3000000); P1=0xfc; } } } } } void delay(uint cnt) { while(cnt--); } 注意控制語(yǔ)句中fre++和fre--;并且fre1和fre2的初始化不能出錯(cuò), 由于if()語(yǔ)句的出現(xiàn),fre1和fre2的取值要比預(yù)想的減一。 ----------------------------------------------------------*/