SOGO論壇
  登入   註冊   找回密碼
查看: 4690|回覆: 21
列印 上一主題 下一主題

[問題求助] 8051 紅綠燈模擬 [複製連結]

Rank: 3Rank: 3

狀態︰ 離線
跳轉到指定樓層
1
發表於 2011-12-8 16:22:39 |只看該作者 |倒序瀏覽
各位大大可以幫小弟看一下這個程式哪裡有問題,長時間執行就會出現誤差
電路使用P1來控制6個LED,P10~P12控制一組分別是G.Y.R三色,p13~p15控制另一組

Start:
        mov        a,#100001b
        outl        p1,a
        mov        r4,#500
        call        Timer
;
        mov        r5,#5
;
Loop:        anl        p1,#111110b
        mov        r4,#10
        call        Timer
        orl        p1,#000001b
        mov        r4,#10
        call        Timer
        djnz        r5,Loop
;
        mov        a,#100010b
        outl        p1,a
        mov        r4,#100
        call        Timer
;
        mov        a,#001100b
        outl        p1,a
        mov        r4,#500
        call        Timer
;
        mov        r5,#5
;
Loop1:        anl        p1,#110111b
        mov        r4,#10
        call        Timer
        orl        p1,#001000b
        mov        r4,#10
        call        Timer
        djnz        r5,Loop1
;
        mov        a,#010100b
        outl        p1,a
        mov        r4,#100
        call        Timer
        jmp        Start
;******************************
; Delay Time=(R4)*0.02 SEC.
;******************************
Timer:
        mov        a,#256-250
        mov        t,a
        strt        t
L:        jtf        X1
        jmp        L
X1:        djnz        r4,Timer
        ret
        end
喜歡嗎?分享這篇文章給親朋好友︰
               感謝作者     

Rank: 5Rank: 5

數位軟體勳章

狀態︰ 離線
2
發表於 2011-12-8 21:45:48 |只看該作者
本帖最後由 alphi 於 2011-12-8 23:56 編輯

你希望的動作原理與實際動作為何? 另外Delay部分由於使用的是迴圈式Delay必須計算每一個指令所耗費的指令週期與外部石英帳盪器之後才能得到精確度較高的延遲副程式

例如你雖然在Delay副程式中延時R4*0.02(實際可能是0.03).經過一百秒就會開始誤差1秒以上.時間越久越誤差越大.

另外紅綠燈這個屬於有規則性的可以使用查表法去建立.這樣可保證其執行比較穩定
已有 1 人評分威望 收起 理由
又靜 + 1 感謝您熱心幫助會員解決問題,論壇需要您的.

總評分: 威望 + 1   查看全部評分

失敗只有一種:那就是半途而廢

Rank: 5Rank: 5

狀態︰ 離線
3
發表於 2011-12-9 05:51:49 |只看該作者
本帖最後由 begti20 於 2011-12-9 06:03 編輯

簡易的紅綠燈控制,不外乎輸出燈號及延遲時間
P1來控制6個LED,P10~P12控制一組分別是G.Y.R三色,p13~p15控制另一組

以你的程式來看,錯誤相當多,至少我沒有用過可以組譯你的程式的組譯程式

Start:
        mov        a,#100001b
        outl        p1,a


        mov        a,#100001b ; 縱向通行
        outl        p1,a              ; 輸出
1. 8051 沒有outl的指令
2. 兩列可以改為 mov p1,#100001b



       mov        r4,#500
        call        Timer


       mov        r4,#500  ; 延遲500*0.02 SEC
        call        Timer
1. R4是8bit的Register,只能儲存的是0~255的值
2. 修改timer成延遲0.2sec的副程式,R4=50即可



;******************************
; Delay Time=(R4)*0.02 SEC.
;******************************
Timer:
        mov        a,#256-250
        mov        t,a
        strt        t
L:        jtf        X1
        jmp        L

1. 如果您想用timer/counter計算延遲時間,您沒有宣告計時計數器的操作模式
2. 您可以改用指令loop的方式,製作延遲副程式
3. 8051沒有t暫存器,不能使用它
4. 請參考http://elearning.stut.edu.tw/mechelec/ch6.htm


建議:您在寫程式時,應附加註解,方便閱讀及除錯

利用8051做簡易的紅綠燈控制,並不困難,加油

已有 1 人評分威望 收起 理由
又靜 + 2 感謝您熱心幫助會員解決問題,論壇需要您的.

總評分: 威望 + 2   查看全部評分

Rank: 5Rank: 5

數位軟體勳章

狀態︰ 離線
4
發表於 2011-12-9 18:56:02 |只看該作者
本帖最後由 alphi 於 2011-12-10 16:36 編輯

感謝"begti20" 大師提供編譯錯誤,原先我以為語法上沒問題只是邏輯上的問題,沒有編譯過測試.看到"begti20"的回覆.所以自己寫一個很簡單的8051組合語言測試.我對8051不是很熟悉.對ARM的Cortex-M3/M4組語比較熟悉(為了Porting RTOS).所以此8051程式也是修修改改.(有問題.請指教)
  1. ;           MCU:Atmel AT89S52
  2. ;           Compiler:Keil A51 V9.05
  3. ;        第一組紅綠燈        P0.0=紅燈,P0.1=黃燈,P0.2=紅燈
  4. ;        第二組紅綠燈        P0.3=紅燈,P0.4=黃燈,P0.5=紅燈
  5. ;        P0的I/O規劃
  6. ;        G1        Y1        R1        G2        Y2        R2        N/A        N/A       
  7. ;        1        0        0        0        0        1        0        0
  8. ;        1        0        0        0        0        1        0        0
  9. ;        0        1        0        0        0        1        0        0
  10. ;        0        0        1        1        0        0        0        0
  11. ;        0        0        1        1        0        0        0        0
  12. ;        0        0        1        0        1        0        0        0
  13.         ORG 00H
  14.         JMP START
  15. START:
  16.         MOV DPTR,#TABLE        ;載入TABLE的位址
  17.         MOV R0,#00H               ;初始化R0暫存器為0
  18. LOOP:
  19.         MOV A,R0           
  20.         MOVC A,@A+DPTR        ;將DPTR所儲存的位址(TABLE)加上通用暫存器A值所得到的位址
  21.         MOV P0,A                    ;將TABLE內的資料輸出到P0 Port
  22.         INC R0
  23.         CALL DELAY
  24.         CJNE R0,#6,LOOP        ;TABLE總共有六筆資料.當不等於6時繼續執行此迴圈內容
  25.         JMP START
  26. DELAY:
  27.         MOV R5,#5
  28. DL2:
  29.         MOV R4,#200
  30. DL1:
  31.         MOV R3,#249
  32.         DJNZ R3,$
  33.         DJNZ R4,DL1
  34.         DJNZ R5,DL2
  35.         RET
  36. TABLE:
  37.         DB        10000100B
  38.         DB        10000100B
  39.         DB        01000100B
  40.         DB        00110000B
  41.         DB        00110000B
  42.         DB        00101000B
  43.         END
複製代碼
已有 1 人評分威望 收起 理由
又靜 + 2 感謝您熱心幫助會員解決問題,論壇需要您的.

總評分: 威望 + 2   查看全部評分

失敗只有一種:那就是半途而廢

Rank: 13Rank: 13Rank: 13Rank: 13

原創及親傳圖影片高手勳章 熱心參予論壇活動及用心回覆主題勳章 榮譽會員勳章 數位硬體勳章 小說之星勳章 原創寫手勳章

狀態︰ 離線
5
發表於 2011-12-10 11:14:26 |只看該作者
您好,
前天看了您的程式總覺得沒多大問題,但經 begti20 大大與alphi 大大的回文
只能說,您的程式是不是在 for 8049 或 8048
就像begti20 說的有些指令跟暫存器 8051己經不適用了

好久沒碰單晶片及ARM的組語,問過姐姐的意見
姐姐說,您的程式寫法是以8048來編寫的
所以要先問一下您的模擬器或晶片是用那一個

還有,您問到時間會有誤差除了begti20 大大所說的之外
最主要的原因在您的副程式寫法,在Timer 副程式中
Strt T 指令之前執行了三道指令,這三個指令共花了10μS的時間
因此R4的迴圈(最大值只有255)來算的話 255 x 10μS = 2.55 ms的誤差

另外,有這麼多會員一起討論您的問題,是否請您也回覆一下
這樣才能知道您的問題所在,不然大家只是猜測,跟本不能解決
而且,透過互相的交流討論,相信您能學習到更多。


點評

begti20  sorry!! 很久很久沒有碰MCS-48系列,而很直接的以現行的MCS-51系列,果斷的說指令錯誤, 也誤導了alphi,真不好意思,又靜版主真厲害,佩服之至.  發表於 2011-12-10 21:28:43
alphi  8048我只有在書中聽過.而且市面上應該很少有賣8048了.我從就學到工作只摸過8051,ARM7,Cortex-M3/M4.果然你姐姐非常厲害.可以看出這是8048組語  發表於 2011-12-10 12:07:00

Rank: 13Rank: 13Rank: 13Rank: 13

原創及親傳圖影片高手勳章 熱心參予論壇活動及用心回覆主題勳章 榮譽會員勳章 數位硬體勳章 小說之星勳章 原創寫手勳章

狀態︰ 離線
6
發表於 2011-12-10 12:11:56 |只看該作者
alphi  8048我只有在書中聽過.而且市面上應該很少有賣8048了.我從就學到工作只摸過8051,ARM7,Cortex-M3/M4.果然你姐姐非常厲害.可以看出這是8048組語  

那時跟著姐姐學的是8049,因為本身課業加重
所以8051就沒學到多少,因此現在要跟各位前輩們多多學習

Rank: 3Rank: 3

狀態︰ 離線
7
發表於 2011-12-10 15:36:35 |只看該作者
alphi 發表於 2011-12-8 21:45  
你希望的動作原理與實際動作為何? 另外Delay部分由於使用的是迴圈式Delay必須計算每一個指令所耗費的指令週 ...

大大你好,我們的專題是模擬街道車子,行人與紅綠燈之間的關係
而在下是分配到紅綠燈部份的制作,整個電路是共用同一石英帳盪器
整個電路經組員查證下是在下的程式有誤差,一直查不出是哪裡出錯
所以在這提出問題,謝謝大大的解說,感恩

Rank: 3Rank: 3

狀態︰ 離線
8
發表於 2011-12-10 15:44:01 |只看該作者
begti20 發表於 2011-12-9 05:51  
簡易的紅綠燈控制,不外乎輸出燈號及延遲時間

以你的程式來看,錯誤相當多,至少我沒有用過可以組譯你的程式 ...

大大你好,學校的課程是8051但是8051的設備幾乎都是壞的
小弟不才,關於程式部份也是參加前前前學長(可能好幾代前的)
看了幾位的分析解說讓小弟學習到新的知識,感恩

Rank: 3Rank: 3

狀態︰ 離線
9
發表於 2011-12-10 15:53:06 |只看該作者
又靜 發表於 2011-12-10 11:14  
您好,
前天看了您的程式總覺得沒多大問題,但經 begti20 大大與alphi 大大的回文
只能說,您的程式是不是 ...

版主大大(水水)你好,謝謝你的解說,沒辦法,學校的教具太老舊了
還得出動你解說,不過看你應該很年輕能知道8048這種十幾二十年前的產品
真是不容昜,總之一句謝啦

Rank: 13Rank: 13Rank: 13Rank: 13

原創及親傳圖影片高手勳章 熱心參予論壇活動及用心回覆主題勳章 榮譽會員勳章 數位硬體勳章 小說之星勳章 原創寫手勳章

狀態︰ 離線
10
發表於 2011-12-10 16:45:09 |只看該作者
本帖最後由 又靜 於 2011-12-10 22:28 編輯

您好,
我用您的副程式修改了一下,可以試看看
應該可以減少誤差
Timer:
          strt      t
Loop    mov     a,#256-250
          mov     t,a
L:        jtf       X1
          jmp      L
X1:     djnz      r4,Loop
          ret
請注意︰利用多帳號發表自問自答的業配文置入性行銷廣告者,將直接禁訪或刪除帳號及全部文章!
您需要登錄後才可以回覆 登入 | 註冊


本論壇為非營利自由討論平台,所有個人言論不代表本站立場。文章內容如有涉及侵權,請通知管理人員,將立即刪除相關文章資料。侵權申訴或移除要求:abuse@oursogo.com

GMT+8, 2024-11-26 07:56

© 2004-2024 SOGO論壇 OURSOGO.COM
回頂部