ADC->8051->RSC232->LCD 程式疑問 |
缺席
|
morgan2001
一般會員 發表:1 回覆:0 積分:0 註冊:2007-06-26 發送簡訊給我 |
小弟算是剛修微算機的學生,這學期換了一個老師,上課只講觀念完全都沒有上機實做過。結果他竟然叫我們期末作出一個專題!因為想要過只能硬著頭皮上,於是從網路上找別人做過的專題來參考,我是選擇做心電圖。由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 發送簡訊給我 |
|
hsk6138
初階會員 發表:12 回覆:59 積分:49 註冊:2003-12-11 發送簡訊給我 |
|
penguin5
資深會員 發表:116 回覆:317 積分:431 註冊:2004-05-09 發送簡訊給我 |
;==================================================================================== ; ; 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 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |