📄 uart_ir_master.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 + -