|
/********************************************************************** * 文件: UART_IR_Master.C * 開發: WWW.ZLGMCU.COM * 日期: 2004.03.04 * 功能: 利用LPC900系列單片機的UART和CCU模塊實現紅外通信。 * 此程序為主機程序,先發送16字節數據給從機,從機再把接收到的 * 數據返回給主機,如果返回正確,則蜂鳴器短響一聲,否則長響一聲。 ************************************************************************/ #include "reg932.h" #include "intrins.h" #define uchar unsigned char // 變量定義 sbit BEEP=P2^7; sbit KEY1=P0^0; const uchar data BRGR1_DATA=9; //波特率設為2400bit/s const uchar data BRGR0_DATA=0xb4; //函數聲明 void CCU_Ini(); void UART_Ini(); void SendData(); void RcvData(uchar *pbuf); bit Compare(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) { while(KEY1); SendData(); //發送16字節數據 Delay(1); RcvData(RcvBuf); //接收16字節數據 if(Compare(RcvBuf)==1) //比較接收到的數據和發送的數據 { BEEP=0; //如果正確則蜂鳴器短響一聲 Delay(1); BEEP=1; } else { BEEP=0; //如果錯誤則蜂鳴器長響一聲 Delay(5); BEEP=1; } } } /********************************************* * 名稱: SendData() * 功能: 通過UART連續發送16字節數據(0~15) * 入口參數:無 * 出口參數:無 * 注意: 此程序采用查詢方式發送。 **********************************************/ void SendData() { uchar i; TI=0; for(i=0;i<16;i++) { SBUF=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; } /****************************************** * 名稱: Compare() * 功能: 比較緩沖區中的內容是否為0~15 * 入口參數: pbuf--需要比較的緩沖區首地址 * 出口參數: 比較正確則返回1,否則返回0。 ******************************************/ bit Compare(uchar *pbuf) { uchar i; for(i=0;i<16;i++) { if(pbuf[i]!=i) { return(0); } } return(1); } /********************************************************************* * 名稱: 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); TCR20|=3; //啟動定時器,非對稱PWM模式 } /*************************************** * 名稱: UART_Ini() * 功能: UART初始化,波特率2400bit/s ****************************************/ 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_(); } } } }
|