|
如圖4.9.1所示,開關(guān)SP1接在P3.7/RD管腳上,在AT89S51單片機(jī)的P1端口接有四個(gè)發(fā)光二極管,上電的時(shí)候,L1接在P1.0管腳上的發(fā)光二極管在閃爍,當(dāng)每一次按下開關(guān)SP1的時(shí)候,L2接在P1.1管腳上的發(fā)光二極管在閃爍,再按下開關(guān)SP1的時(shí)候,L3接在P1.2管腳上的發(fā)光二極管在閃爍,再按下開關(guān)SP1的時(shí)候,L4接在P1.3管腳上的發(fā)光二極管在閃爍,再按下開關(guān)SP1的時(shí)候,又輪到L1在閃爍了,如此輪流下去。 2.電路原理圖 file:///C:/Users/DELL/AppData/Local/Temp/msohtmlclip1/01/clip_image001.jpg 圖4.9.1 3.系統(tǒng)板上硬件連線 (1. 把“單片機(jī)系統(tǒng)”區(qū)域中的P3.7/RD端口連接到“獨(dú)立式鍵盤”區(qū)域中的SP1端口上; (2. 把“單片機(jī)系統(tǒng)”區(qū)域中的P1.0-P1.4端口用8芯排線連接到“八路發(fā)光二極管指示模塊”區(qū)域中的“L1-L8”端口上;要求,P1.0連接到L1,P1.1連接到L2,P1.2連接到L3,P1.3連接到L4上。 4.程序設(shè)計(jì)方法 (1. 設(shè)計(jì)思想由來 在我們生活中,我們很容易通過這個(gè)叫張三,那個(gè)叫李四,另外一個(gè)是王五;那是因?yàn)槊總(gè)人有不同的名子,我們就很快認(rèn)出,同樣,對(duì)于要通過一個(gè)按鍵來識(shí)別每種不同的功能,我們給每個(gè)不同的功能模塊用不同的ID號(hào)標(biāo)識(shí),這樣,每按下一次按鍵,ID的值是不相同的,所以單片機(jī)就很容易識(shí)別不同功能的身份了。 (2. 設(shè)計(jì)方法 從上面的要求我們可以看出,L1到L4發(fā)光二極管在每個(gè)時(shí)刻的閃爍的時(shí)間是受開關(guān)SP1來控制,我們給L1到L4閃爍的時(shí)段定義出不同的ID號(hào),當(dāng)L1在閃爍時(shí),ID=0;當(dāng)L2在閃爍時(shí),ID=1;當(dāng)L3在閃爍時(shí),ID=2;當(dāng)L4在閃爍時(shí),ID=3;很顯然,只要每次按下開關(guān)K1時(shí),分別給出不同的ID號(hào)我們就能夠完成上面的任務(wù)了。下面給出有關(guān)程序設(shè)計(jì)的框圖。 5.程序框圖 file:///C:/Users/DELL/AppData/Local/Temp/msohtmlclip1/01/clip_image002.gif 圖4.9.2 6.匯編源程序 ID EQU30H ; EQU ——標(biāo)號(hào)賦值偽指令 SP1 BITP3.7 ;??不知定義這干嘛,后面又沒用到…. L1 BITP1.0 L2 BITP1.1 L3 BITP1.2 L4 BITP1.3 ORG0 ; ORG ——地址定義偽指令 MOVID,#00H START: JBK1,REL ;直接尋址位為1轉(zhuǎn)移 LCALLDELAY10MS JBK1,REL INCID MOVA,ID CJNEA,#04,REL ;累加器A與立即數(shù)data比較不相等時(shí)轉(zhuǎn)rel MOVID,#00H REL: JNBK1,$ ;直接尋址為0轉(zhuǎn)移 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---相對(duì)短轉(zhuǎn)移 IS3: LJMPSTART ;LJMP -- 2KB范圍內(nèi)長轉(zhuǎn)移 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; } } }
|