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

📄 uart_ir_master.c

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

⌨️ 快捷键说明

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