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

QQ登錄

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

帖子
查看: 5631|回復(fù): 6
打印 上一主題 下一主題
收起左側(cè)

關(guān)于c51單片機(jī)交通燈匯編程序怎么加一個(gè)緊急狀態(tài)按鍵的問(wèn)題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:447275 發(fā)表于 2018-12-30 14:49 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
能不能在這個(gè)交通燈系統(tǒng)里,加上一個(gè)緊急狀態(tài)按鍵,使所有紅燈亮。


單片機(jī)程序在下面:
         ORG 0000H ;主函數(shù)地址
         LJMP MAIN
         ORG 000BH ;中斷定時(shí)器0 地址
         LJMP INTERPUT

         ORG 0030H ;表的首地址
         LJMP TABLE
TABLE:   DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H

MAIN:
         MOV P2, #00H             ;給P2 口賦初值,讓數(shù)碼管剛開(kāi)始都不亮
         MOV R2, #60              ;給R2 賦60,使東西的數(shù)碼管顯示初值為60
         MOV R3, #40              ;給R3 賦40,使南北的數(shù)碼管顯示初值為40
         MOV P3, #0              ;使人形道的燈初始都不亮
         MOV R5, #0                ;給R5,R6 賦初值0
         MOV R6, #0
         MOV TMOD, #01H              ;定時(shí)器0 工作方式1
         MOV TH0, #79                  ;給定時(shí)器賦初值
         MOV TL0, #0AEH
         SETB EA                     ;允許總中斷
                 SETB EX0
                 SETB IT0
         SETB ET0             ;開(kāi)啟定時(shí)器0 中斷
         SETB TR0                  ;開(kāi)啟定時(shí)器計(jì)時(shí)
                  
L2:
       LCALL DISPLAY1                    ;顯示東西數(shù)碼管
       LCALL DISPLAY2               ;顯示南北數(shù)碼管
       LCALL CHOOSE1                ;調(diào)用東西判斷函數(shù)
       LCALL CHOOSE2             ;調(diào)用南北判斷函數(shù)
       SJMP L2                     ;一直循環(huán)




INTERPUT:
            MOV TH0, #22H           ;定時(shí)器中斷里重現(xiàn)給定時(shí)器0 賦初值
            MOV TL0, #0D8H
            MOV A, R4
            INC R4                  ;定時(shí)器中斷一次50MS,中斷一次R4+1
            CJNE A, #20,L3           ; 判斷是不是加到20 了,即定時(shí)器定時(shí)1S
            MOV R4, #0              ;R4 加到20,則清0
            DEC R3                  ;要是定時(shí)1S 到了,則把R2,和R3 的值都減1
            DEC R2
L3:
             RETI                   ;中斷退出




CHOOSE1:                            ;東西判斷函數(shù)
            MOV A, R5                   ;R5是一個(gè)標(biāo)志
           CJNE A, #1, K1               ;判斷R5 是不是等于1,不等于1 跳到K1
           MOV A, R2                ;要是標(biāo)志位等于1
           CJNE A, #4, K5              ;而且R2 等于4,則開(kāi)啟黃燈,關(guān)閉車(chē)道綠燈
           SETB P3.2
             CLR P3.3
            SJMP K3
  K5:      JNC K3                  ;要是R2 小于4 則閃爍綠燈
           CPL P1.7
           MOV A, R2
           CJNE A, #0, K3               ;判斷R2 是不是等于0,
              INC R5                    ;等于0 則讓標(biāo)志位+1
             CLR P3.2                  ;清黃燈,開(kāi)車(chē)道的左行綠燈,置人行道紅燈
           SETB P3.0
            MOV R2, #20
          SETB P2.6
           CLR P2.7
           SJMP K3
   K1:        JNC K2                     ;CJNE 這個(gè)指令比較好R5 和1 的值,要是R5 大于1,則C=0,反之C=1,這里判斷C 是否等于0,既判斷是否小于1,小于1 執(zhí)行下行, 大于1 則跳轉(zhuǎn)K2
           MOV A, R2
           CJNE A, #60, K7               ;初值狀態(tài)R2 是60,判斷R2 是不是60,60 的話開(kāi)車(chē)道的紅燈,開(kāi)人行道的綠燈
           SETB P3.1
            SETB P2.7
           CLR P2.6
            SJMP K3                      ;退出
  K7:     CJNE A, #0, K3                 ;要是R2 不等于60,判斷R2 是不是等于0,等于0 則把標(biāo)志位R5 加1,讓車(chē)道綠燈亮,紅燈滅,人行道紅燈亮
          INC R5
          CLR P3.1
           SETB P3.3
          MOV R2, #40                      ;再給數(shù)碼管賦初值
           CLR P2.7
          SETB P2.6
          SJMP K3                          ;退出
  K2:     MOV A, R2                        ;標(biāo)志位R5 大于1 則跳到這里
          CJNE A, #4, K6                      ;判斷R2 和4 的值, 等于4 則開(kāi)啟黃燈, 關(guān)閉車(chē)道的綠燈,要是不等于是,則跳到K6
           CLR P3.0
            SETB P3.2           SJMP K3
K6:     JNC K3                          ;判斷R2 是不是小于4,小于4 則閃爍黃燈,大于4 則直接退出
          CPL P3.2                       ;取反
         MOV A, R3
          CJNE A, #0, K3                     ;判斷R2 是不是等于0
            MOV R5, #0                         ;等于0 則清標(biāo)志位,因?yàn)槲覀冎辉O(shè)置了0.1.2 這三個(gè)狀態(tài),到2了以后要清0,讓他重新開(kāi)始循環(huán)
           MOV R2, #60                         ;給R2 賦初值,開(kāi)車(chē)道紅燈,關(guān)車(chē)道左行綠燈,開(kāi)人行道綠燈,關(guān)人行道紅燈
            SETB P3.1
           CLR P3.2
          SETB P2.7
          CLR P2.6
  K3:     RET








CHOOSE2:                       ;南、北判斷函數(shù),程序和東、西判斷一致
              MOV A, R6
               CJNE A, #1, H2
                MOV A, R3
                CJNE A, #4, H6
               SETB P3.6
                CLR P3.4
                SJMP H3
  H6:             JNC H3
                 CPL P3.6
                CJNE A, #0, H3
                 INC R6
                 CLR P3.6
                  SETB P3.5
                MOV R3, #60
                 SETB P2.4
                 CLR P2.5
                 SJMP H3
  H2:           JNC H4
             MOV A, R3
            CJNE A, #40,H7
            SETB P3.7
            SETB P2.5
            CLR P2.4
            SJMP H3
H7:            MOV A, R3
          CJNE A, #4, H5
            SETB P3.6
            CLR P3.7
             SJMP H3
H5:           JNC H3
             CPL P3.6
                CJNE A, #0, H3
                SETB P3.4
           CLR P3.6
           INC R6
              MOV R3, #20
              SETB P2.5
              CLR P2.4
              SJMP H3
H4:
              MOV A, R3
              CJNE A, #0, H3
            SETB P3.7
                  CLR P3.5
               MOV R6, #0
             MOV R3, #40
                SETB P2.5
            CLR P2.4
H3:     RET





DISPLAY1:                            ;顯示東西數(shù)碼管(動(dòng)態(tài)顯示)
              MOV A, R2 ;將R2 放到A 中
              MOV B, #10
              DIV AB ;將2 位的10 進(jìn)制數(shù)的十位和個(gè)位分開(kāi)
              MOV DPTR, #TABLE ; 取TABLE 表的首地址給DPTR
              MOVC A, @A+DPTR ;把表的第N 個(gè)數(shù)據(jù)給A
              MOV P1, A ;把數(shù)據(jù)送到數(shù)碼管中
              SETB P2.0 ;顯示數(shù)碼管
              LCALL DELAY ;延時(shí)
              CLR P2.0 ;把數(shù)碼管暗掉
              MOV A ,B ;把個(gè)位給A
              MOVC A, @A+DPTR ;把表的個(gè)位個(gè)數(shù)給A
              MOV P1, A ;把數(shù)據(jù)送到數(shù)碼管中
              SETB P2.1 ;顯示數(shù)據(jù)
              LCALL DELAY ;延時(shí)
              CLR P2.1 ;讓數(shù)碼管暗掉
              RET




DISPLAY2:                             ;顯示南北數(shù)碼管(顯示函數(shù)和上面一樣,這里注釋就不寫(xiě)了)
              MOV A, R3
              MOV B, #10
             DIV AB
             MOV DPTR, #TABLE
             MOVC A, @A+DPTR
             MOV P0, A
             SETB P2.2
             LCALL DELAY
             CLR P2.2
             MOV A, B
             MOVC A, @A+DPTR
             MOV P0, A
             SETB P2.3
             LCALL DELAY
             CLR P2.3
             RET



DELAY:              ;延時(shí)函數(shù)
             MOV R0, #20
L1:              MOV R1, #25
             DJNZ R1, $
             DJNZ R0, L1
             RET
END

圖片1.png (71 KB, 下載次數(shù): 102)

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

使用道具 舉報(bào)

沙發(fā)
ID:439075 發(fā)表于 2018-12-30 18:05 | 只看該作者
在標(biāo)號(hào)L2之后,加一段檢測(cè)緊急按鈕,未按下則執(zhí)行原有的語(yǔ)句,檢測(cè)到按下后全部亮紅燈的代碼,緊急代碼結(jié)束后轉(zhuǎn)到L2。
回復(fù)

使用道具 舉報(bào)

板凳
ID:447275 發(fā)表于 2018-12-30 19:38 | 只看該作者
bucker 發(fā)表于 2018-12-30 18:05
在標(biāo)號(hào)L2之后,加一段檢測(cè)緊急按鈕,未按下則執(zhí)行原有的語(yǔ)句,檢測(cè)到按下后全部亮紅燈的代碼,緊急代碼結(jié)束 ...

那按鈕接到哪個(gè)I/O口 ��?
回復(fù)

使用道具 舉報(bào)

地板
ID:447275 發(fā)表于 2018-12-30 19:53 | 只看該作者
bucker 發(fā)表于 2018-12-30 18:05
在標(biāo)號(hào)L2之后,加一段檢測(cè)緊急按鈕,未按下則執(zhí)行原有的語(yǔ)句,檢測(cè)到按下后全部亮紅燈的代碼,緊急代碼結(jié)束 ...

檢測(cè)程序你可以幫我寫(xiě)一下,讓我看一下不?   我不太懂那個(gè)緊急狀態(tài)按鍵接到哪個(gè)引腳上去,  仿真上所有引腳都用了,好像沒(méi)有地方接按鍵了啊
回復(fù)

使用道具 舉報(bào)

5#
ID:678072 發(fā)表于 2019-12-31 18:31 | 只看該作者
你好老哥,問(wèn)題解決了嗎
回復(fù)

使用道具 舉報(bào)

6#
ID:195446 發(fā)表于 2020-1-1 17:12 | 只看該作者
緊急按鈕采用的中斷方式,所以按鈕接在P3.2,程序里要寫(xiě)中斷服務(wù)程序:
ORG 0003H ;外部中斷0 地址
LJMP INTERPUT0
。

INTERPUT0:MOV ........;全部紅燈亮
                   LCALL DELAY
                   LCALL DISPLAY
                  RETI

你的連接把P3.2口占用了,需要調(diào)整空出來(lái)。
回復(fù)

使用道具 舉報(bào)

7#
ID:558309 發(fā)表于 2020-1-1 18:04 | 只看該作者
加一個(gè)輸入中斷,當(dāng)你按鍵按下跳入中斷,中斷執(zhí)行程序讓所有紅燈都亮,同時(shí)關(guān)閉綠燈
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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