線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:6260
推到 Plurk!
推到 Facebook!

ADC->8051->RSC232->LCD 程式疑問

缺席
morgan2001
一般會員


發表:1
回覆:0
積分:0
註冊:2007-06-26

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-06-26 23:07:30 IP:220.132.xxx.xxx 訂閱
小弟算是剛修微算機的學生,這學期換了一個老師,上課只講觀念完全都沒有上機實做過。結果他竟然叫我們期末作出一個專題!因為想要過只能硬著頭皮上,於是從網路上找別人做過的專題來參考,我是選擇做心電圖。由ADC接收電壓傳送到8051再經由RS232到LCD。因為我完全沒寫過組合語言,電路圖也是照接一部分,程式是我硬擠出來的,因此有點東拼西湊,所以想在這裡問一下我的程式有問題嗎?

ORG 00H ; 程式由位址0 開始執行
JMP START
ORG 23H
JMP SERIAL
-------------------------------------------
START: ; 主程式
MOV SP,#60H ; 設定堆疊指標至RAM 位址60H
CALL INIT_RS232 ; 設定串列埠的通訊協定
LOOP:
SETB P0.4
SETB P0.5
CLR P0.5
JNB P0.3,READ
READ:
CLR P0.4
CLR TR0 ; TR0表示發射資料情形
MOV A,P2
MOV P2,A
XRL A,R0 ; 判斷PORT2是否改變,有則發射,沒有則繼續偵測
JZ LOOP
UART:
MOV A,P2 ; 將正確PORT2的值丟入A裡
SETB EA ; 設定中斷致能
SETB ES ; 設定SERIAL PORT中斷致能
MOV SBUF,A ; 將累加器移入SBUF發射
JNB TR0,$ ; 等待發射完畢
JMP LOOP
SERIAL:
CLR TI ; 清除TI以便下筆發射資料不致於發生連續中斷
SETB TR0 ; 表示發射完一筆完整資料
MOV R0,A ; 將新的資料存入R0
RETI
END
-------------------------------------------
INIT_RS232: ; RS232通訊協定
MOV SCON,#50H ; 設定串列介面工作於模式1 接收資料致能。
MOV TMOD,#20H ; 設定計時器1 工作於模式2 。
MOV TH1,#0FDH ; 設定鮑率為9600 BPS。
MOV TL1,#0FDH
SETB TR1 ; 啟動計時器1 開始計數(使能正確地產生鮑率時脈)。
RET ; 離開副程式
--------------------------------------------

還有附上我接的電路圖,因為我是做最簡單模式,所以我只有連接ADC、8051、MAX232和DB9而已
不好意思,我知道在這裡問有點厚顏無恥,但是還是希望有善心人士可以幫幫小弟
感激不盡
編輯記錄
morgan2001 重新編輯於 2007-06-26 23:10:34, 註解 無‧
sharkneil
一般會員


發表:27
回覆:33
積分:12
註冊:2005-01-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-07-02 08:56:35 IP:210.66.xxx.xxx 訂閱
為何要透過RS232到LCD?
LCD的資料很多書裡面都有.不懂你要做如何顯示.
還有你說的新電圖是如何表示?秀出圖案來?如果是的話.變成你ADC要建個資料庫去對應該顯示的圖案!
至於程式對不對.你自己最清楚.如有不懂的程式在提出討論吧!
hsk6138
初階會員


發表:12
回覆:59
積分:49
註冊:2003-12-11

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-07-11 13:52:15 IP:218.160.xxx.xxx 訂閱
唉 看到你這段程式我對我們以後競爭力感到憂慮
不是你不好 是教育失敗 現在教育目的不是作育英才而是斂財
依你現在程度可能做好後已經被當了
是否考慮變更報告題目,找簡單一點的
先從簡單去了解
**給你一點建議我以前大專的報告是接收GPS時間顯示在7段顯示器上**
很簡單噱頭又夠,試試看
penguin5
資深會員


發表:116
回覆:317
積分:431
註冊:2004-05-09

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-07-29 12:05:44 IP:59.121.xxx.xxx 訂閱
;====================================================================================
;
; LCDM  驅動範例程式       為 4BIT 傳送方式   
;    
; 接線方式:  R/W 接地 DB0~DB3 不接線  只接 DB4→X.0  DB5→X.1  DB6→X.2  DB7→X.3
;
;====================================================================================    LCD_BUS        REG        P1                    
LCD_RS        REG        P1.4                        ; LCD 模組暫存器選擇腳
LCD_E        REG        P1.5                        ; LCD 模組致能腳 ENABLE
LED        REG        P0.0                        ; LED 
         ORG     0H          
        JMP        START
;===============================================================
START:
        CALL        LCD_INIT                    ; LCD 模組初始化        
;---------------------------------------------------------------
        CALL        LINE_1                      ; LCDM 第一行位置
           CALL    LCD_PRINT                   ; 開始顯示
                ;0123456789ABCDEF
        DB      '  == LEGEND ==  ',0        ; 顯示字串 == LEGEND ==
 
        CALL        LINE_2                      ; LCDM 第二行位置  
           CALL    LCD_PRINT                   ; 開始顯示 
                ;0123456789ABCDEF
        DB      '  LCDM  SYSTEM  ',0        ; 顯示字串 LCDM  SYSTEM
 
        MOV        R5,#200                            ; 200 X 10 = 2000 MS                
        CALL        DELAY_2                     ; 延時 2秒                   
;---------------------------------------------------------------
        MOV        DPTR,#LIST_1                ; 欲顯示的字串的資料放在 LIST_1 
        MOV        A,#1                            ; LCDM 第一行 
        CALL        LCD_PRINT_1                 ; 開始顯示 == LEGEND ==            MOV        DPTR,#LIST_2                ; 欲顯示的字串的資料放在 LIST_2 
        MOV        A,#2                            ; LCDM 第二行 
        CALL        LCD_PRINT_1                 ; 開始顯示 LCDM TEST OK            MOV        R5,#200                            ; 200 X 10 = 2000 MS                
        CALL        DELAY_2                     ; 延時 2秒
;----------------------------------------------------------------
        MOV         A,#'A'                     ; 欲 LCDM 顯示      A
        MOV         B,#15                            ; LCDM 第15個字顯示 A                    
        CALL         LCD_L1                     ; LCDM 第一行             MOV         A,#'B'                     ; 欲 LCDM 顯示      B
        MOV         B,#15                            ; LCDM 第15個字顯示 B                    
        CALL         LCD_L2                     ; LCDM 第二行     LOOP:        
        CPL        LED                            ; LED 反向 
        MOV        R5,#100                            ; 100 X 10 = 1000 MS        
        CALL        DELAY_2                     ; 延時 1秒
           JMP        LOOP                        ; 迥旋
;================================================
;     LCD 模組初始化副程式    
;================================================
LCD_INIT:
        CLR        LCD_E 
        MOV        LCD_BUS, #03H               ; 起動 LCDM
        CALL        LCD_EN
        MOV        LCD_BUS, #03H               ; 起動 LCDM
        CALL        LCD_EN
        MOV        LCD_BUS, #03H               ; 起動 LCDM
        CALL        LCD_EN 
        MOV        LCD_BUS, #02H               ; 起動 LCDM
        CALL        LCD_EN                              
        MOV        A,#28H                      ; 設定 LCD 模組為 2 行顯示, 4 位元介面及 5X7 點字形
        CALL        WCOM
        MOV        A,#0CH                      ; 令顯示器開 (ON) ,但游標不顯示
        CALL        WCOM
        MOV        A,#06H                      ; 令 LCD 模組每接收一筆資料後, AC 值自動加 1    
        CALL        WCOM
        CALL        CLR_LCD                     ; 清除全部顯示
        RET
;================================================
;      SET LCD模組致能腳 為 1 再轉為 0  
;================================================
LCD_EN
        SETB        LCD_E                        ; SET LCD_E = 1
        MOV        R7, #10                      ; 延時
        DJNZ        R7,$
        CLR        LCD_E                        ; SET LCD_E = 0
        MOV        R7, #10                      ; 延時
        DJNZ        R7,$
        RET
;================================================
;      清除全部顯示   
;================================================
CLR_LCD:
        MOV        A,#01H                        ; 從LCDM 第一行第一個位置開始消除       
        CALL        WCOM
        RET        
;================================================
;      清除一行顯示
;================================================
CLR_LINE:
        MOV        R0,#16                        ; 重複16次
CL1:        MOV        A,#' '                        ; 輸入空白字元
        CALL        WDATA                         ; 寫入空白字元至 LCDM
        DJNZ        R0,CL1                              ; 是否重複 16次, R0 = 0                                                
        RET
;================================================
;     寫資料到 IR 暫存器副程式 
;================================================
WCOM:
        PUSH        A                             ; 將資料暫存於堆疊中
        SWAP        A                             ; 將累積器 ACC 內之 8 位元分成兩半(即位元0~3,位元4~7)然後互換 
        MOV        LCD_BUS,A                     ; 將指令碼或位址(高四位元)送至LCDM     
        CLR        LCD_RS                        ; SET LCD_RS = 0
         CALL        LCD_EN                        ; SET LCDM 致能腳 為 1 再轉為 0
        POP     A                             ; 將暫存於堆疊中的資料取出
        MOV        LCD_BUS,A                     ; 將指令碼或位址(低四位元)送至LCDM   
        CLR        LCD_RS                        ; SET LCD_RS = 0
         CALL        LCD_EN                        ; SET LCDM 致能腳 為 1 再轉為 0
        CALL        DELAY_1                       ; 延時
        RET
;==============================================
;     寫資料到 DR 暫存器副程式 
;==============================================
WDATA:
        PUSH        A                             ; 將資料暫存於堆疊中
        SWAP        A                             ; 將累積器 ACC 內之 8 位元分成兩半(即位元0~3,位元4~7)然後互換  
        MOV        LCD_BUS,A                     ; 將資料(高四位元)送至LCDM  
        SETB        LCD_RS                        ; SET LCD_RS = 1
         CALL        LCD_EN                        ; SET LCDM 致能腳 為 1 再轉為 0
        POP        A                             ; 將暫存於堆疊中的資料取出
        MOV        LCD_BUS,A                     ; 將資料(低四位元)送至LCDM
        SETB        LCD_RS                        ; SET LCD_RS = 1              
         CALL        LCD_EN                        ; SET LCDM 致能腳 為 1 再轉為 0
        CALL        DELAY_1                       ; 延時
        RET
;======================================================
;       在第一行的第幾個位置顯示字元
;       A = ASC DATA
;       B = LINE X POS.
;
;範例:
;        MOV         A,#'A'                       ; 欲 LCDM 顯示      A
;        MOV         B,#15                              ; LCDM 第15個字顯示 A                    
;        CALL         LCD_L1                       ; LCDM 第一行 
;======================================================
LCD_L1:
        PUSH        ACC                           ; 將取得的資料暫存於堆疊中
        MOV        A,B
        ADD        A,#80H                        ; LCDM 第一行   B 值
        CALL        WCOM                          ; 寫資料到 IR 暫存器
        POP        ACC                           ; 將暫存於堆疊中的資料取出
        CALL        WDATA                         ; 寫資料到 DR 暫存器
        RET
;======================================================
;       在第二行的第幾個位置顯示字元
;       A = ASC DATA
;       B = LINE X POS.
;
;範例:
;        MOV         A,#'B'                       ; 欲 LCDM 顯示      B
;        MOV         B,#15                              ; LCDM 第15個字顯示 B                    
;        CALL         LCD_L2                       ; LCDM 第二行 
;=======================================================
LCD_L2:
        PUSH        ACC                           ; 將取得的資料暫存於堆疊中      
        MOV        A,B
        ADD        A,#C0H                        ; LCDM 第二行   B 值
        CALL        WCOM                          ; 寫資料到 IR 暫存器
        POP        ACC                           ; 將暫存於堆疊中的資料取出
        CALL        WDATA                         ; 寫資料到 DR 暫存器
        RET
;=======================================================
;       寫一個字串至LCD顯示
;  
;範例:
;         CALL         LINE_1                       ; LCDM 第一行位置
;         CALL    LCD_PRINT                    ; 開始顯示
;                ;0123456789ABCDEF
;         DB      '  == LEGEND ==  ',0         ; 顯示字串 == LEGEND ==
;;=====================================================
LINE_1:                                       
        MOV     A,#80H                        ; LCDM 第一行
        CALL        WCOM                          ; 寫資料到 IR 暫存器
        RET
LINE_2:                                       
        MOV     A,#C0H                        ; LCDM 第二行
        CALL        WCOM                          ; 寫資料到 IR 暫存器
        RET
;------------------------------------------------------
LCD_PRINT:                                    ; 開始顯示
         POP     DPH    
        POP     DPL    
LCD_PRINT_L0:
        CLR     A
        MOVC    A,@A DPTR                     ; 將 DPTR 的字元逐一送至 LCDM 顯示
         INC     DPTR
        JNZ     LCD_PRINT_L1
        JMP     @A DPTR         
LCD_PRINT_L1:
        CALL    WDATA                         ; 寫資料到 DR 暫存器
         JMP     LCD_PRINT_L0
;==========================================================
;       A=LINE 1 OR 2                         ; 第一行 = 1    第二行 = 2           
;       DPTR = LIST POINTER                   ; 欲顯示字串之資料放置處 
; 
;範例:
;        MOV        DPTR,#LIST_2                  ; LCDM TEST OK 
;        MOV        A,#2                              ; LCDM 第二行 
;        CALL        LCD_PRINT_1
;=========================================================
LCD_PRINT_1:
        CJNE        A,#1,LINE2                    ; 假如 A 不是1, 則跳到 LINE2
LINE1:        MOV        A,#80H                        ; LCDM 第一行  
        CALL        WCOM
        CALL        CLR_LINE                      ; 清除一行顯示
        MOV        A,#80H                        ; LCDM 第一行
        CALL        WCOM
        JMP        DISP    LINE2:        MOV        A,#0C0H                       ; LCDM 第二行
        CALL        WCOM
        CALL        CLR_LINE                      ; 清除一行顯示
        MOV        A,#0C0H                       ; LCDM 第二行 
        CALL        WCOM
DISP:
        CLR        A
        MOVC        A,@A DPTR                     ; 將 DPTR 的字元逐一送至 LCDM 顯示 
        CJNE        A,#0,DISP_L                   ; 遇到結束碼  0 才結束
        RET
DISP_L:
        CALL        WDATA
        INC        DPTR
        JMP        DISP
        RET
;=========================================================
;       欲顯示字串之資料放置處     LIST POINTER    
;=========================================================
           ;0123456789ABCDEF
LIST_1: DB "== LEGEND ==    ",0               ; 欲顯示字串 ,0 為結束碼
LIST_2: DB "LCDM TEST OK    ",0               ; 欲顯示字串 ,0 為結束碼
;========================================================
;       延時副程式   (R5)*0.1MS   
;========================================================
DELAY_1:                      
        MOV        R5,#10
E0:
        MOV        R6,#2
E1:        MOV        R7,#18
E2:        DJNZ        R7,E2
        DJNZ        R6,E1
        DJNZ        R5,E0
        RET    ;========================================================
;       延時副程式   (R5)*10MS    1000MS = 1S  1S = 1秒
;========================================================
DELAY_2:
        MOV        R6,#50    E3:        MOV        R7,#100
        DJNZ        R7,$
        DJNZ        R6,E3
        DJNZ        R5,DELAY_2
        RET    ;*****************************************************
        END            
系統時間:2024-05-12 4:27:16
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!