如圖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.電路原理圖 file:///C:/Users/DELL/AppData/Local/Temp/msohtmlclip1/01/clip_image001.jpg 圖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.程序框圖 file:///C:/Users/DELL/AppData/Local/Temp/msohtmlclip1/01/clip_image002.gif 圖4.9.2 6.匯編源程序 ID EQU30H ; EQU ——標號賦值偽指令 SP1 BITP3.7 ;??不知定義這干嘛,后面又沒用到…. L1 BITP1.0 L2 BITP1.1 L3 BITP1.2 L4 BITP1.3 ORG0 ; ORG ——地址定義偽指令 MOVID,#00H START: JBK1,REL ;直接尋址位為1轉移 LCALLDELAY10MS JBK1,REL INCID MOVA,ID CJNEA,#04,REL ;累加器A與立即數data比較不相等時轉rel MOVID,#00H REL: JNBK1,$ ;直接尋址為0轉移 MOVA,ID CJNEA,#00H,IS0 CPLL1 ;閃爍 LCALLDELAY SJMPSTART IS0: CJNEA,#01H,IS1 CPLL2 LCALLDELAY SJMPSTART IS1: CJNEA,#02H,IS2 CPLL3 LCALLDELAY SJMPSTART IS2: CJNEA,#03H,IS3 CPLL4 LCALLDELAY SJMPSTART ;SJMP---相對短轉移 IS3: LJMPSTART ;LJMP -- 2KB范圍內長轉移 DELAY10MS: MOVR6,#20 LOOP1: MOVR7,#248 DJNZR7,$ DJNZR6,LOOP1 RET DELAY: MOVR5,#20 LOOP2: LCALLDELAY10MS DJNZR5,LOOP2 RET END 7.C語言源程序 #include <AT89X51.H> 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; } } }
|