1.實驗任務 如圖4.9.1所示,開關SP1接在P3.7/RD管腳上,在AT89S51單片機的P1埠接有四個發光二極體,上電的時候,L1接在P1.0管腳上的發光二極體在閃爍,當每一次按下開關SP1的時候,L2接在P1.1管腳上的發光二極體在閃爍,再按下開關SP1的時候,L3接在P1.2管腳上的發光二極體在閃爍,再按下開關SP1的時候,L4接在P1.3管腳上的發光二極體在閃爍,再按下開關SP1的時候,又輪到L1在閃爍了,如此輪流下去。 2.電路原理圖 ͼ4.9.1 3.系統板上硬體連線 (1. 把“單片機系統”區域中的P3.7/RD埠連接到“獨立式鍵盤”區域中的SP1埠上; (2. 把“單片機系統”區域中的P1.0-P1.4埠用8芯排線連接到“八路發光二極體指示模塊”區域中的“L1-L8”埠上;要求,P1.0連接到L1,P1.1連接到L2,P1.2連接到L3,P1.3連接到L4上。 4.程序設計方法 (1. 設計思想由來 在我們生活中,我們很容易通過這個叫張三,那個叫李四,另外一個是王五;那是因為每個人有不同的名子,我們就很快認出,同樣,對於要通過一個按鍵來識別每種不同的功能,我們給每個不同的功能模塊用不同的ID號標識,這樣,每按下一次按鍵,ID的值是不相同的,所以單片機就很容易識別不同功能的身份了。 (2. 設計方法 從上面的要求我們可以看出,L1到L4發光二極體在每個時刻的閃爍的時間是受開關SP1來控制,我們給L1到L4閃爍的時段定義出不同的ID號,當L1在閃爍時,ID=0;當L2在閃爍時,ID=1;當L3在閃爍時,ID=2;當L4在閃爍時,ID=3;很顯然,只要每次按下開關K1時,分別給出不同的ID號我們就能夠完成上面的任務了。下面給出有關程序設計的框圖。 5.程序框圖 ͼ4.9.2 6. 彙編源程序 ID EQU 30H SP1 BIT P3.7 L1 BIT P1.0 L2 BIT P1.1 L3 BIT P1.2 L4 BIT P1.3 ORG 0 MOV ID,#00H START: JB K1,REL LCALL DELAY10MS JB K1,REL INC ID MOV A,ID CJNE A,#04,REL MOV ID,#00H REL: JNB K1,$ MOV A,ID CJNE A,#00H,IS0 CPL L1 LCALL DELAY SJMP START IS0: CJNE A,#01H,IS1 CPL L2 LCALL DELAY SJMP START IS1: CJNE A,#02H,IS2 CPL L3 LCALL DELAY SJMP START IS2: CJNE A,#03H,IS3 CPL L4 LCALL DELAY SJMP START IS3: LJMP START DELAY10MS: MOV R6,#20 LOOP1: MOV R7,#248 DJNZ R7,$ DJNZ R6,LOOP1 RET DELAY: MOV R5,#20 LOOP2: LCALL DELAY10MS DJNZ R5,LOOP2 RET END 7. C語言源程序 #include unsigned char ID; void delay10ms(void) { unsigned char i,j; for(i=20;i>0;i--) for(j=248;j>0;j--); } void delay02s(void) { unsigned char i; for(i=20;i>0;i--) {delay10ms(); } } void main(void) { while(1) { if(P3_7==0) {delay10ms(); if(P3_7==0) { ID++; if(ID==4) { ID=0; } while(P3_7==0); } } switch(ID) { case 0: P1_0=~P1_0; delay02s(); break; case 1: P1_1=~P1_1; delay02s(); break; case 2: P1_2=~P1_2; delay02s(); break; case 3: P1_3=~P1_3; delay02s(); break; } } } |