|
/**************************************************************** * 文件: UART_IR_Slave.C * 功能: 利用LPC900系列單片機的UART和CCU模塊實現紅外通信. * 此程序為從機程序,當接收到16字節數據后,再把接收的數據 * 返回給主機. *****************************************************************/ #include "reg932.h" #include "intrins.h" #define uchar unsigned char //變量定義 const uchar data BRGR1_DATA=9; //波特率設為2400bit/s const uchar data BRGR0_DATA=0xb4; //函數聲明 void CCU_Ini(); void UART_Ini(); void SendData(uchar *pbuf); void RcvData(uchar *pbuf); void Delay(uchar k); //主程序開始 void main() { uchar RcvBuf[16]; //接收數據用緩沖區 P0M1=P0M2=0; P1M1=P1M2=0; //P0,P1口設置為準雙向 P2M1=P2M2=0xc0; //P2.6,P2.7設置為開漏 CCU_Ini(); //CCU模塊初始化,用以產生38KHz調制信號 UART_Ini(); while(1) { Delay(1); RcvData(RcvBuf); //接收16字節數據 Delay(2); SendData(RcvBuf); //把接收到的16字節數據發送出去 } } /********************************************* * 名稱: SendData() * 功能: 通過UART連續發送16字節數據(0~15) * 入口參數: bpuf--發送緩沖區首地址 * 出口參數: 無 * 注意: 此程序采用查詢方式發送 **********************************************/ void SendData(uchar *pbuf) { uchar i; TI=0; for(i=0;i<16;i++) { SBUF=pbuf[i]; while(!TI); TI=0; } } /********************************************************************* * 名稱: RcvData() * 功能: 通過UART連續接收16字節數據 * 入口參數: pbuf--用于接收數據的緩沖區首地址 * 出口參數: 接收到的16字節數據位于接收緩沖區 * 注意: 此程序采用查詢方式進行接收。由于采取半雙工通信,所以接收 * 數據之前要打開接收允許,接收完畢之后要關閉接收允許。 **********************************************************************/ void RcvData(uchar *pbuf) { uchar i; REN=1; FE=0; RI=0; for(i=0;i<16;i++) { while(!RI); RI=0; pbuf[i]=SBUF; } REN=0; } /********************************************************************* * 名稱: CCU_Ini() * 功能: CCU模塊初始化,使OCA(P2.7)輸出38KHz,50%占空比的PWM波, * 作為紅外線的載波 * 使用6MHz晶振時,CCU頻率=((6000000/2)/6)*32=16MHz * 定時器重裝值=CCU頻率/紅外線載頻=16000000/38000=421=0x1a5 **********************************************************************/ void CCU_Ini() { TOR2H=0x01; //定時器重裝值 TOR2L=0xa5; OCRAH=0x00; //(OCRAH:OCRAL)=(TOR2H:TOR2L)/2,PWM的占空比為50% OCRAL=0xd2; TCR21=0x85; //PLL預分頻為5+1 CCCRA=1; //非反相的PWM TCR20=0; PLEEN=1; while(!PLEEN); //等待鎖相環(PLL)穩定 TCR20|=3; //啟動定時器,對稱PWM模式 } /************************************** * 名稱: UART_Ini() * 功能: UART初始化,波特率2400bps **************************************/ void UART_Ini() { PCON=0; SSTAT=0; //雙緩沖禁止,中斷禁止,采用查詢方式發送和接收 SCON=0x40; //串口模式1,接收禁止 PCON|=0x40; //SMOD0=1,SCON的位7作為FE BRGCON=0; BRGR1=BRGR1_DATA; BRGR0=BRGR0_DATA; BRGCON=3; //啟動UART的波特率發生器 } /***************************************************** * 名稱: Delay() * 功能: 延時0.1*k秒(振蕩器為6MHz) * 入口參數:k--延時時間 * 出口參數:無 * 注意: 如果入口參數k等于0,則不延時而直接返回。 ******************************************************/ void Delay(uchar k) { uchar i,j; if(k==0) { return; } for(;k;k--) { for(j=200;j;j--) //延時0.1S { for(i=250;i;i--) { _nop_(); _nop_(); _nop_(); _nop_(); } } } }
|