⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uart_ir_slave.c

📁 利用LPC900系列单片机的UART和CCU模块实现红外通信. * 此程序为从机程序,当接收到16字节数据后,再把接收的数据 * 返回给主机.
💻 C
字号:
/****************************************************************
* 文件:     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_();
			}
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -