|
;********************************************************************** ; 文件: UART_IR_Master.asm ; 開發: WWW.ZLGMCU.COM ; 日期: 2004.03.04 ; 功能: 利用LPC900系列單片機的UART和CCU模塊實現紅外通信。 ; 此程序為主機程序,先發送16字節數據給從機,從機再把接收到的 ; 數據返回給主機,如果返回正確,則蜂鳴器短響一聲,否則長響一聲。 ;*********************************************************************** $INCLUDE (REG932.INC) ;變量定義 BEEP BIT P2.7 KEY1 BIT P0.0 FE BIT SCON.7 PLEEN BIT TCR20.7 RCV_BUF DATA 30H ;接收緩沖區首地址(30H~3FH) BRGR1_DATA DATA 09H ;波特率設為2400bit/s BRGR0_DATA DATA 0B4H ORG 0000H AJMP MAIN ;主程序開始 ORG 0100H MAIN: MOV SP,#60H MOV P0M1,#00H ;P0,P1口設置為準雙向 MOV P0M2,#00H MOV P1M1,#00H MOV P1M2,#00H MOV P2M1,#0C0H ;P2.6,P2.7設置為開漏 MOV P2M2,#0C0H ACALL CCU_INIT ;CCU模塊初始化,用以產生38KHz調制信號 ACALL UART_INIT MAIN_L1: JB KEY1,$ ACALL SEND_DATA ;發送16字節數據 MOV R7,#01H ACALL DELAY ACALL RCV_DATA ;接收16字節數據 ACALL COMPARE ;比較接收到的數據和發送的數據 JZ MAIN_L2 CLR BEEP ;如果正確則蜂鳴器短響一聲 MOV R7,#01H ACALL DELAY SETB BEEP AJMP MAIN_L1 MAIN_L2: CLR BEEP ;如果錯誤則蜂鳴器長響一聲 MOV R7,#05H ACALL DELAY SETB BEEP AJMP MAIN_L1 ;******************************************** ; 名稱: SEND_DATA ; 功能: 通過UART連續發送16字節數據(0~15) ; 入口參數:無 ; 出口參數:無 ; 注意: 此程序采用查詢方式發送。 ;******************************************** SEND_DATA: MOV R7,#10H CLR TI CLR A SEND_DL1: MOV SBUF,A JNB TI,$ ;等待一字節發送完畢 CLR TI INC A DJNZ R7,SEND_DL1 RET ;******************************************************************** ; 名稱: RCV_DATA ; 功能: 通過UART連續接收16字節數據 ; 入口參數: RCV_BUF--用于接收數據的緩沖區首地址 ; 出口參數: 接收到的16字節數據位于接收緩沖區 ; 注意: 此程序采用查詢方式進行接收。由于采取半雙工通信,所以接收 ; 數據之前要打開接收允許,接收完畢之后要關閉接收允許。 ;******************************************************************** RCV_DATA: MOV R7,#10H MOV R0,#RCV_BUF SETB REN ;串行接收允許 CLR FE CLR RI RCV_DL1: JNB RI,$ ;等待接收一字節 CLR RI MOV A,SBUF MOV @R0,A INC R0 DJNZ R7,RCV_DL1 CLR REN ;串行接收禁止 RET ;********************************************* ; 名稱: COMPARE ; 功能: 比較緩沖區中的內容是否為0~15 ; 入口參數: RCV_BUF--需要比較的緩沖區首地址 ; 出口參數: ACC--比較正確則返回1,否則返回0。 ;********************************************* COMPARE: MOV R7,#10H MOV R0,#RCV_BUF MOV R1,#00H CLR A COMP_L1: MOV A,@R0 CJNE A,01H,COMP_RTN ;ACC與R1(01H)比較 INC R0 INC R1 DJNZ R7,COMP_L1 MOV A,#01H ;比較結果正確,返回01H RET COMP_RTN: CLR A ;比較結果錯誤,返回00H RET ;********************************************************************** ; 名稱: CCU_INIT ; 功能: CCU模塊初始化,使OCA(P2.7)輸出38KHz,50%占空比的PWM波, ; 作為紅外線的載波 ; 使用6MHz晶振時,CCU頻率=((6000000/2)/6)*32=16MHz ; 定時器重裝值=CCU頻率/紅外線載頻=16000000/38000=421=01A5H ;********************************************************************** CCU_INIT: MOV TOR2H,#01H ;定時器重裝值 MOV TOR2L,#0A5H MOV OCRAH,#00H ;(OCRAH:OCRAL)=(TOR2H:TOR2L)/2,PWM的占空比為50% MOV OCRAL,#0D2H MOV TCR21,#85H ;PLL預分頻為5+1 MOV CCCRA,#01H ;非反相的PWM MOV TCR20,#00H SETB PLEEN NOP JNB PLEEN,$ ;等待鎖相環(PLL)穩定 ORL TCR20,#03H ;啟動定時器,對稱PWM模式 RET ;*************************************** ; 名稱: UART_INIT ; 功能: UART初始化,波特率2400bit/s ;*************************************** UART_INIT: MOV PCON,#00H MOV SSTAT,#00H ;雙緩沖禁止,中斷禁止,采用查詢方式發送和接收 MOV SCON,#40H ;串口模式1,接收禁止 ORL PCON,#40H ;SMOD0=1,SCON的位7作為FE MOV BRGCON,#00H MOV BRGR1,#BRGR1_DATA MOV BRGR0,#BRGR0_DATA MOV BRGCON,#03H ;啟動UART的波特率發生器 RET ;***************************************************** ; 名稱: DELAY ; 功能: 延時(R7*0.1)秒(振蕩器為6MHz) ; 入口參數:R7--延時時間 ; 出口參數:無 ; 注意: 如果入口參數R7等于0,則不延時而直接返回。 ;***************************************************** DELAY: MOV A,R7 JZ DELAY_RTN DELAY_L1: MOV R6,#0C8H ;延時0.1S DELAY_L2: MOV R5,#0FAH DELAY_L3: NOP NOP NOP NOP DJNZ R5,DELAY_L3 DJNZ R6,DELAY_L2 DJNZ R7,DELAY_L1 DELAY_RTN: RET END
|