亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 31635|回復(fù): 14
打印 上一主題 下一主題
收起左側(cè)

幾個(gè)單片機(jī)匯編語(yǔ)言教學(xué)例程及詳細(xì)分析

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
#
ID:304891 發(fā)表于 2018-4-10 09:32 | 只看該作者 回帖獎(jiǎng)勵(lì) |正序?yàn)g覽 |閱讀模式
最近,我們?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),是10
  • 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.0P1.1輸出周期為300us600us的方波程序。
本題考慮點(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)用1643只數(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
GATE
C\T
M1
M0
GATE
C\T
M1
M0
0
0
1
0
0
0
0
0

SCON=50H
SM0
SM1
SM2
REN
TB8
RB8
TI
RI
0
1
0
1
0
0
0
0

編程:
主機(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é)束



完整的Word格式文檔51黑下載地址:
近期的幾個(gè)單片機(jī)例程及詳細(xì)分析 (1).doc (283.5 KB, 下載次數(shù): 93)


評(píng)分

參與人數(shù) 1黑幣 +15 收起 理由
copower + 15 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏11 分享淘帖 頂3 踩
回復(fù)

使用道具 舉報(bào)

14#
ID:126173 發(fā)表于 2020-6-20 18:09 | 只看該作者
這個(gè)寫得真好,謝謝
回復(fù)

使用道具 舉報(bào)

13#
ID:117690 發(fā)表于 2020-5-26 16:23 | 只看該作者
謝謝分享
回復(fù)

使用道具 舉報(bào)

12#
ID:737006 發(fā)表于 2020-4-24 14:55 | 只看該作者
謝謝分享,學(xué)習(xí)了。
回復(fù)

使用道具 舉報(bào)

11#
ID:736846 發(fā)表于 2020-4-24 11:39 來(lái)自觸屏版 | 只看該作者
謝謝樓主分享,很好的學(xué)習(xí)資料。
回復(fù)

使用道具 舉報(bào)

10#
ID:348676 發(fā)表于 2020-1-6 14:15 | 只看該作者
謝謝樓主分享,不錯(cuò)的基礎(chǔ)學(xué)習(xí)資料
回復(fù)

使用道具 舉報(bào)

9#
ID:475236 發(fā)表于 2019-10-10 18:22 | 只看該作者
謝謝樓主分享,不錯(cuò)的基礎(chǔ)學(xué)習(xí)資料
回復(fù)

使用道具 舉報(bào)

8#
ID:575629 發(fā)表于 2019-7-1 14:21 | 只看該作者
程序二有一個(gè)小錯(cuò)誤,應(yīng)該是mov tmod #02h
回復(fù)

使用道具 舉報(bào)

7#
ID:336233 發(fā)表于 2019-5-30 09:18 | 只看該作者

學(xué)習(xí)一下!!!
回復(fù)

使用道具 舉報(bào)

6#
ID:89835 發(fā)表于 2019-3-31 23:34 | 只看該作者
這些例子很經(jīng)典,值得認(rèn)真學(xué)習(xí)一下
回復(fù)

使用道具 舉報(bào)

5#
ID:219544 發(fā)表于 2019-3-22 18:18 | 只看該作者
有沒(méi)有初級(jí)學(xué)習(xí)的 實(shí)例教的全套
回復(fù)

使用道具 舉報(bào)

地板
ID:255377 發(fā)表于 2019-2-19 03:20 來(lái)自觸屏版 | 只看該作者
在MAIN:MOV  P1,#0FFH  增加此命令
回復(fù)

使用道具 舉報(bào)

板凳
ID:69115 發(fā)表于 2019-2-13 13:48 | 只看該作者
都是很好的例子,學(xué)習(xí)了。
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:416015 發(fā)表于 2018-10-26 20:57 | 只看該作者
學(xué)習(xí)一下!!!
回復(fù)

使用道具 舉報(bào)

樓主
ID:352726 發(fā)表于 2018-6-15 22:54 | 只看該作者
很不錯(cuò),太棒了
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表