|
最近,我們?cè)谡n上講了幾個(gè)小例子,在此再把Proteus圖及程序的詳細(xì)解釋列出來(lái),供大家參考。 - 應(yīng)用查詢方式,對(duì)連接在P1.4管腳上的按鍵次數(shù)進(jìn)行計(jì)數(shù),每5次在P1.0上連接的紅色LED亮或不亮。
本題考慮點(diǎn): - 應(yīng)用查詢方式,即讀和檢測(cè)P1.4管腳的狀態(tài),是1或0;
- 每5次翻轉(zhuǎn)一次,因此可設(shè)一個(gè)寄存器作為計(jì)數(shù)器,看是否到了5次,5次后清零;
- P1.0上的LED亮或不亮,即狀態(tài)翻轉(zhuǎn),CPL P1.0。
Proteus圖 應(yīng)用元器件:?jiǎn)纹瑱C(jī)80C51(或80C52)、按鍵Button、電阻Res、LED 圖1 找元器件的方法 單片機(jī)屬于微處理器庫(kù)里面的,因此,應(yīng)再點(diǎn)擊Microprocessor ICS,后同。 圖2. 1題圖 程序: ORG 0H ;程序從程序存儲(chǔ)器的0單元開(kāi)始存放 MAIN: MOV R0,#0 ;設(shè)R0為計(jì)數(shù)器,賦初始值0,注意,在這兒不賦值0,單片機(jī)一上電R0也等于0 LOOP: JB P1.4,$ ;若P1.4為高,表明沒(méi)鍵按下,等待 JNB P1.4,$ ;若P1.4為低,表明有鍵按下,等待該鍵的彈起 INC R0 ;按鍵彈起后,表明按鍵一次,計(jì)數(shù)器加1 CJNE R0,#6,LOOP ;若R0不等于6,表明還沒(méi)按夠5次,繼續(xù)查詢按鍵信息 MOV R0,#0 ;若R0=6,表明已經(jīng)被按下5次,計(jì)數(shù)器清零 CPL P1.0 ;P1.0翻轉(zhuǎn),即LED的狀態(tài)轉(zhuǎn)換 AJMP LOOP ;進(jìn)入下一個(gè)循環(huán) END ;程序結(jié)束 圖3 調(diào)試狀態(tài)
- 應(yīng)用定時(shí)器,控制從P1.0和P1.1輸出周期為300us和600us的方波程序。
本題考慮點(diǎn): 首先明確為應(yīng)用定時(shí)器,且輸出波形為方波,周期300us和600us,也就是說(shuō),如果用這兩個(gè)管腳輸出波形的話,其翻轉(zhuǎn)的時(shí)間分別為150us和300us。 然后確定應(yīng)用定時(shí)器的工作方式,對(duì)于6MHz的晶振來(lái)說(shuō),對(duì)于12分頻的單片機(jī)的機(jī)器周期為2us,即對(duì)機(jī)器周期的計(jì)數(shù)分別為75和150,都小于256,因此,可用8位定時(shí)器,并且300us是150us的整數(shù)倍,因此可用一個(gè)定時(shí)器解決。在此選用自動(dòng)裝入的8位定時(shí)器,即工作方式2,設(shè)用T0。 則TMOD的取值為: 先看TMOD的各位: GATE C\T M1 M0 GATE C\T M1 M0 因?yàn)橛肨0來(lái)計(jì)時(shí),且在本題目中T1不用,因此,TMOD的取值可為:00000010B , 16進(jìn)制:02H 初始值的計(jì)算,應(yīng)用公式: 計(jì)算得:X=106,16進(jìn)制為6AH,即TH0和TL0的賦值都為6AH(因方式2位自動(dòng)裝入模式) Proteus圖: 圖4 題2圖及調(diào)出示波器的位置 程序及解釋: ORG 0H ;程序從程序存儲(chǔ)器的0單元開(kāi)始存放 AJMP MAIN ;跳轉(zhuǎn)至以MAIN為標(biāo)號(hào)的主程序
ORG 0BH ;0B是定時(shí)器0的中斷子程序入口 AJMP T0INT ;跳轉(zhuǎn)到以T0INT為標(biāo)號(hào)的中斷子程序
ORG 30H ;主程序從30H單元開(kāi)始存放 MAIN: MOV TMOD,#20H ;設(shè)置定時(shí)器的工作方式,采用工作方式2即自動(dòng)裝入的8位 MOV TH0,#8AH ;給TH0賦初值 MOV TL0,#8AH ;給TL0賦初值 SETB EA ;打開(kāi)總中斷 SETB ET0 ;打開(kāi)T0的中斷 SETB TR0 ;讓T0開(kāi)始工作 SJMP $ ;踏步,等待中斷
T0INT: CPL P1.0 ;時(shí)間到,翻轉(zhuǎn)P1.0 INC R0 ;因?yàn)?00us正好是150us的整數(shù)倍,因而可用一個(gè)定時(shí)器 CJNE R0,#2,GOON ;用R0作為中斷幾次的計(jì)數(shù)器,若中斷2次既達(dá)到150us的兩倍 MOV R0,#0 ;若達(dá)到了兩倍,翻轉(zhuǎn),計(jì)數(shù)器清零 CPL P1.1 ;P1.1翻轉(zhuǎn) GOON: RETI ;中斷子程序返回
END ;程序結(jié)束
圖5 波形圖 - 應(yīng)用164帶3只數(shù)碼管,顯示從000-999的單個(gè)跳數(shù);
本題考慮點(diǎn): 164是移位寄存器,因此最好直接用串口,與164連接; 3位數(shù),可把三位數(shù)設(shè)為一個(gè)計(jì)數(shù)器,設(shè)從30H-32H,其中30H為最低位,31H為中間位,32H為最高位,然后從30H開(kāi)始加1,當(dāng)30H加到10后,30H清零,31H再加1,31H為10后,變?yōu)榱悖?2H再加1,當(dāng)32H為10后,清零。 把顯示部分編寫為一個(gè)子程序,30-32H內(nèi)的數(shù)每改變一次,調(diào)用一次顯示; 由于人的視力跟不上單片機(jī)一條指令的運(yùn)算時(shí)間,因此需要延時(shí)。 因此,在軟件設(shè)計(jì)上可分為三部分:一是加數(shù)部分,一是顯示部分,一是延時(shí)部分。 Proteus圖: 圖6 題3圖 (注意RXD、TXD的接法,以及后兩只164的接法) 程序: ORG 0H ;程序從程序存儲(chǔ)器的0單元開(kāi)始存放 AJMP MAIN ;跳轉(zhuǎn)到主程序
ORG 30H ;主程序從程序存儲(chǔ)器的30H單元開(kāi)始存放 MAIN: MOV 30H,#0 ;給30H單元賦初始值0 MOV 31H,#0 ;給31H單元賦初始值0 MOV 32H,#0 ;給32H單元賦初始值0
LOOP: INC 30H ;30H單元內(nèi)的數(shù)加1 MOV R1,30H ;將30H單元內(nèi)的數(shù)賦值給R1,以便應(yīng)用 CJNE Rn,#DATA,REL語(yǔ)言判斷并跳轉(zhuǎn) CJNE R1,#10,NEXT ;若30H內(nèi)的數(shù)不是10則跳轉(zhuǎn)到調(diào)用顯示 MOV 30H,#0 ;若30H內(nèi)的數(shù)是10,則清零 INC 31H ;上位30H的數(shù)等于10時(shí),下一位31H加1 MOV R1,31H ;將31H內(nèi)的數(shù)賦值給R1 CJNE R1,#10,NEXT ;間接地判斷31H內(nèi)的數(shù)是否等于10,如不是,轉(zhuǎn)顯示 MOV 31H,#0 ;若31H等于10,則清零,將32H加1 INC 32H ;32H加1(此為最高位) MOV R1,32H ;判斷32H的數(shù)值 CJNE R1,#10,NEXT ;間接判斷32H內(nèi)的數(shù)是否等于10,不是轉(zhuǎn)顯示 MOV 32H,#0 ;若是32H清零 NEXT: ACALL DISPLAY ;調(diào)用顯示子程序 ACALL DELAY ;調(diào)用延時(shí)子程序 SJMP LOOP ;跳轉(zhuǎn)到加1部分,循環(huán)
DISPLAY:MOV R0,#30H ;將顯示數(shù)據(jù)的存放首單元賦值給R0,以便調(diào)用循環(huán)將數(shù)值賦值給A MOV DPTR,#TAB ;將顯示碼的首地址賦值給DPTR DISLOP:MOV A,@R0 ;將以R0內(nèi)的數(shù)30H內(nèi)的數(shù)值賦值給A MOVC A,@A+DPTR ;查表語(yǔ)句,將顯示碼賦值給A MOV SBUF,A ;將顯示碼通過(guò)串行口送出去 JNB TI,$ ;如果TI不等于1,表明還沒(méi)送出去,等待 CLR TI ;若TI=1表明數(shù)據(jù)已經(jīng)送走,將送走的標(biāo)志位TI清零,以便進(jìn)行下次輸送 INC R0 ;指向下一單元 CJNE R0,#33H,DISLOP ;判斷是否將3個(gè)單元(30H,31H,32H)的數(shù)據(jù)都送完 RET ;子程序返回
DELAY: MOV R7,#0 ;延時(shí)子程序,給R7賦值0(相當(dāng)于256) DEL1: MOV R6,#0 ;給R6賦值0 DJNZ R6,$ ;若R6-1不等于0,在此語(yǔ)句循環(huán) DJNZ R7,DEL1 ;如R0=0則判斷R7-1是否為零,不為零則跳轉(zhuǎn)到DEL1,給R6重新賦值 RET ;子程序返回
TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ;顯示碼表 END ;程序結(jié)束 圖7 運(yùn)行狀態(tài)圖
- 應(yīng)用雙機(jī)通訊,實(shí)現(xiàn)在A機(jī)上的數(shù)碼管數(shù)字加到按另一鍵時(shí)的將該數(shù)發(fā)送到B機(jī)的數(shù)碼管上顯示。
本題考慮點(diǎn): 雙機(jī)通訊,串行口的通訊方式設(shè)置; 設(shè)采用串行口方式1,則需要設(shè)置波特率,應(yīng)用T1的工作方式2; 雙機(jī)都帶一只數(shù)碼管; 主機(jī)帶3只按鍵。 Proteus圖: 此處由于用P0口帶數(shù)碼管,因此因在P0各管腳上加上拉電阻,此處用排阻respack-8;公共端接高。 圖8 題4圖 編程考慮: 波特率生成器用T1的工作模式2,波特率選用9600,晶振6MHz,則TH1和TL1的賦值為0F4H,SCON選用工作模式1,且可接收。 TMOD= #20H
SCON=50H
編程: 主機(jī)程序: ORG 0H ;程序從程序存儲(chǔ)器的0單元開(kāi)始存放 AJMP MAIN ;跳轉(zhuǎn)到以MAIN為標(biāo)號(hào)的程序去 ORG 30H ;以下程序從程序存儲(chǔ)器的30H開(kāi)始存放 MAIN: MOV TMOD,#20H ;選用定時(shí)器2工作模式,即自動(dòng)賦初始值的8位定時(shí)器 MOV TH1,#0F4H ;給TH1賦值0F4H; MOV TL1,#0F4H ;給TL1賦值0F4H; SETB EA ;打開(kāi)總中斷允許位; SETB ET1 ;打開(kāi)定時(shí)器1的中斷允許位; SETB TR1 ;使定時(shí)器1運(yùn)行 MOV SCON,#50H ;設(shè)置串行口的工作模式,采用模式1
MOV DPTR,#TAB ;賦值顯示碼表的首地址 MOV R0,#0 ;設(shè)置R0為顯示數(shù)字的計(jì)數(shù)器 MOV R1,#0 ;R1設(shè)置為訊顯示碼的中轉(zhuǎn)寄存器
KEYSCAN:JB P1.0,KEY1 ;若按鍵1沒(méi)有被按下,轉(zhuǎn)去查詢鍵2 JNB P1.0,$ ;如鍵1被按下,則等待鍵1彈起 INC R0 ;鍵1彈起后,顯示數(shù)加1 CJNE R0,#10,NEXT ;如顯示數(shù)等于10,則從0開(kāi)始 MOV R0,#0 ;清零 NEXT: MOV A,R0 ;將顯示的數(shù)給A MOVC A,@A+DPTR ;查表取顯示的碼值 MOV R1,A ;將碼值給R1暫存 MOV P0,A ;將顯示碼值給P0顯示 key1: JB P1.1,KEYSCAN ;檢測(cè)第二個(gè)按鍵按下沒(méi)有 JNB P1.1,$ ;按下了等待彈起 MOV A,R1 ;將顯示碼給A MOV SBUF,A ;將顯示碼送去串行口 JNB TI,$ ;若TI不等于1,表明正在發(fā)送中 CLR TI ;TI=1,則表明已經(jīng)發(fā)送完畢,將標(biāo)志位清零,以便下次發(fā)送 SJMP KEYSCAN ;繼續(xù)檢測(cè)有按鍵是否被按下
TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ;顯示碼 END ;程序結(jié)束
從機(jī)程序: ORG 0H ;程序從程序存儲(chǔ)器的0單元開(kāi)始存放 AJMP MAIN ;跳轉(zhuǎn)到以MAIN為標(biāo)號(hào)的程序去 ORG 30H ;以下程序從程序存儲(chǔ)器的30H開(kāi)始存放 MAIN: MOV TMOD,#20H ;選用定時(shí)器2工作模式,即自動(dòng)賦初始值的8位定時(shí)器 MOV TH1,#0F4H ;給TH1賦值0F4H; MOV TL1,#0F4H ;給TL1賦值0F4H; SETB EA ;打開(kāi)總中斷允許位; SETB ET1 ;打開(kāi)定時(shí)器1的中斷允許位; SETB TR1 ;使定時(shí)器1運(yùn)行 MOV SCON,#50H ;設(shè)置串行口的工作模式,采用模式1
LOOP: JNB RI,$ ;若RI不等于1,表明無(wú)數(shù)據(jù)通過(guò)串行口送入 CLR RI ;如RI=1,表明有數(shù)據(jù)送入,將RI清零,以便下次接收 MOV A,SBUF ;將串行口接收到的數(shù)據(jù)給A MOV P0,A ;A將接收到的數(shù)據(jù)傳送給P0,顯示 SJMP LOOP ;繼續(xù)等待接收到數(shù)據(jù)
END ;程序結(jié)束 圖9 題4運(yùn)行狀態(tài)圖
- 應(yīng)用外部中斷,對(duì)連接在P3.2管腳上的按鍵次數(shù)進(jìn)行計(jì)數(shù),每5次在P1.0上連接的綠色LED亮或不亮。
本題考慮點(diǎn): 要求應(yīng)用外部中斷,則必須應(yīng)用中斷子程序,且在子程序內(nèi)計(jì)數(shù),滿5次讓P1.0翻轉(zhuǎn)。 Proteus圖: 圖10 題5圖 編程: ORG 0H ;程序從程序存儲(chǔ)器的0單元開(kāi)始存放 AJMP MAIN ;跳轉(zhuǎn)到以標(biāo)號(hào)為MAIN處
ORG 03H ;外部中斷0的9子程序入口 AJMP INT0 ;調(diào)用外部中斷子程序INT0
ORG 30H ;主程序從程序存儲(chǔ)器的30H單元開(kāi)始存放 MAIN: SETB EA ;打開(kāi)總中斷 SETB EX0 ;打開(kāi)外部中斷0的中斷 SETB IT0 ;將外部中斷0的觸發(fā)信號(hào)設(shè)置為下降沿 SJMP $ ;在此等待中斷發(fā)生
INT0: INC R0 ;用R0作為計(jì)數(shù)器,每中斷一次加1 CJNE R0,#5,NEXT ;若沒(méi)中斷5次返回,等待下一次 MOV R0,#0 ;將計(jì)數(shù)器清零 CPL P1.0 ;將P1.0翻轉(zhuǎn) NEXT: RETI ;中斷子程序返回
END ;程序結(jié)束
圖11 題5運(yùn)行狀態(tài)圖
- 應(yīng)用計(jì)數(shù)器,對(duì)連接在P3.4管腳上的按鍵次數(shù)進(jìn)行計(jì)數(shù),每5次在P1.0上連接的黃色LED亮或不亮。
本題考慮點(diǎn): 題意用計(jì)數(shù)器,且在P3.4管腳上,即應(yīng)用計(jì)數(shù)器T0; 未說(shuō)明用查詢還是中斷方式,本題選用中斷方式。 Proteus圖: 圖12 題6圖 程序: ORG 0H ;主程序入口 AJMP MAIN ;跳轉(zhuǎn)到以MAIN為標(biāo)號(hào)的程序
ORG 0BH ;計(jì)數(shù)器中斷0的子程序入口 AJMP INT0 ;調(diào)用外部中斷子程序INT0
ORG 30H ;主程序從程序存儲(chǔ)器的30H單元開(kāi)始存放 MAIN: MOV TMOD,#06H ;設(shè)置計(jì)數(shù)器為8位自動(dòng)裝入模式 MOV TH0,#251 ;設(shè)置TH0初始值為256-5=251 MOV TL0,#251 ;設(shè)置TL0同上 SETB EA ;打開(kāi)總中斷 SETB ET0 ;打開(kāi)計(jì)數(shù)器0的中斷 SETB TR0 ;將計(jì)數(shù)器0打開(kāi) MOV R0,#0 ;給R0賦值0 SJMP $ ;在此等待中斷發(fā)生
INT0: CPL P1.0 ;將P1.0翻轉(zhuǎn) NEXT: RETI ;中斷子程序返回
END ;程序結(jié)束
|