|
/**************************************************************** * 文件: UART_IR_Slave.C * 功能: 利用LPC900系列單片機的UART和CCU模塊實現(xiàn)紅外通信. * 此程序為從機程序,當(dāng)接收到16字節(jié)數(shù)據(jù)后,再把接收的數(shù)據(jù) * 返回給主機. *****************************************************************/ #include "reg932.h" #include "intrins.h" #define uchar unsigned char //變量定義 const uchar data BRGR1_DATA=9; //波特率設(shè)為2400bit/s const uchar data BRGR0_DATA=0xb4; //函數(shù)聲明 void CCU_Ini(); void UART_Ini(); void SendData(uchar *pbuf); void RcvData(uchar *pbuf); void Delay(uchar k); //主程序開始 void main() { uchar RcvBuf[16]; //接收數(shù)據(jù)用緩沖區(qū) P0M1=P0M2=0; P1M1=P1M2=0; //P0,P1口設(shè)置為準(zhǔn)雙向 P2M1=P2M2=0xc0; //P2.6,P2.7設(shè)置為開漏 CCU_Ini(); //CCU模塊初始化,用以產(chǎn)生38KHz調(diào)制信號 UART_Ini(); while(1) { Delay(1); RcvData(RcvBuf); //接收16字節(jié)數(shù)據(jù) Delay(2); SendData(RcvBuf); //把接收到的16字節(jié)數(shù)據(jù)發(fā)送出去 } } /********************************************* * 名稱: SendData() * 功能: 通過UART連續(xù)發(fā)送16字節(jié)數(shù)據(jù)(0~15) * 入口參數(shù): bpuf--發(fā)送緩沖區(qū)首地址 * 出口參數(shù): 無 * 注意: 此程序采用查詢方式發(fā)送 **********************************************/ void SendData(uchar *pbuf) { uchar i; TI=0; for(i=0;i<16;i++) { SBUF=pbuf[i]; while(!TI); TI=0; } } /********************************************************************* * 名稱: RcvData() * 功能: 通過UART連續(xù)接收16字節(jié)數(shù)據(jù) * 入口參數(shù): pbuf--用于接收數(shù)據(jù)的緩沖區(qū)首地址 * 出口參數(shù): 接收到的16字節(jié)數(shù)據(jù)位于接收緩沖區(qū) * 注意: 此程序采用查詢方式進行接收。由于采取半雙工通信,所以接收 * 數(shù)據(jù)之前要打開接收允許,接收完畢之后要關(guān)閉接收允許。 **********************************************************************/ 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預(yù)分頻為5+1 CCCRA=1; //非反相的PWM TCR20=0; PLEEN=1; while(!PLEEN); //等待鎖相環(huán)(PLL)穩(wěn)定 TCR20|=3; //啟動定時器,對稱PWM模式 } /************************************** * 名稱: UART_Ini() * 功能: UART初始化,波特率2400bps **************************************/ void UART_Ini() { PCON=0; SSTAT=0; //雙緩沖禁止,中斷禁止,采用查詢方式發(fā)送和接收 SCON=0x40; //串口模式1,接收禁止 PCON|=0x40; //SMOD0=1,SCON的位7作為FE BRGCON=0; BRGR1=BRGR1_DATA; BRGR0=BRGR0_DATA; BRGCON=3; //啟動UART的波特率發(fā)生器 } /***************************************************** * 名稱: Delay() * 功能: 延時0.1*k秒(振蕩器為6MHz) * 入口參數(shù):k--延時時間 * 出口參數(shù):無 * 注意: 如果入口參數(shù)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_(); } } } }
|