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

📄 uartcom2.c

📁 此代码实现功能为:在philips P89LPC935单片机上实现红外遥(对应红外发送芯片为:HT6222)控解码接收
💻 C
字号:

/*********************************************************************/
/* 模 块 名:单片机(C51)             文件名:uart_com2.c		     */
/* 提交日期:2006年1月29日           作  者:金雨和(jinyuhe@163.com) */
/* 版    本:V1.0 --Copyright(c) 2006-2008						     */
/* 描    述:单片机(C51)串口2处理程序						 		 */
/* 修改记录:													     */
/*     	  日  期        版本      修改人     修改内容				 */
/* 	   1. 															 */
/*********************************************************************/
#include <Reg935.h>
#include "uart.h"
#include "string.h"

#define TxD2	INT1		//COM2数据发送脚
#define RxD2	RST			//COM2数据接收脚

uchar xdata g_sndBuf[MAX_I2CDATALEN];	//数据发送缓冲
uchar g_sndBufLen=20;		//数据发送缓冲长度
uchar g_sndBufOffset=0;		//数据发送偏移

uchar g_bitSndCnt=0;		//数据位发送计数器
//uchar g_bitRcvCnt=0;		//数据位接收计数器
uchar g_rcvByte=0;			//所接收到的字节
bit g_rcvStartFlag=0;		//收到起始位后,数据开始接收标志
uchar g_hasRcvOneByte=9;	//是否已经完整接收到字符

extern unsigned char xdata g_ucI2CSendBuf[MAX_I2CDATALEN];     //IIC数据缓存
extern unsigned char xdata g_ucI2CSendBuf_Len;     //IIC数据缓存内容长度
extern unsigned char xdata g_ucI2CSendBuf_offset;  //IIC缓存数据读取当前位移

/*******************************************************************
** 函 数 名: UART2_Init()
** 输    入: 无
** 输    出: 无
** 描    述: UART初始化,波特率9600bit/s
** 全局变量: 无
** 调用模块: 无
** 被调模块: 
**			 main		-- 主循环处理函数
** 作    者: 金雨和
** 创建日期: 2006年1月30日
** 修    改:
**     	  日  期        版本      修改人     修改内容				 
** 	   1.
********************************************************************/
#define IR_TEST		KB0		//红外输入

void UART2_Init()
{   
	//P1.4脚为TxD,P1.5脚为RxD,将其设置为准双向口模式
	P1M1 = P1M1 & 0xCF;
	P1M2 = P1M2 & 0xCF;	

	//红外接收  仅为输入
	P0M1 = P0M1 & 0xFE;	//Input status,set P0.0 input mode
	P0M2 = P0M2 & 0xFE;

	memset(g_sndBuf, 0, sizeof(g_sndBuf));
	memcpy(g_sndBuf, "this is jinyh test\r\n", 20);
}


/*******************************************************************
** 函 数 名: timer1_Init()
** 输    入: 无
** 输    出: 无
** 描    述: 初始化定时器0。
** 全局变量: 无
** 调用模块: 无
** 被调模块: 无
** 作    者: 
** 创建日期: 2006年1月30日
** 修    改:
**     	  日  期        版本      修改人     修改内容				 
** 	   1. 
********************************************************************/
void timer1_Init()
{
	/*  使能定时器0中断   1  */
    TMOD = TMOD | 0x10;
	TR1 = 1;
	ET1 = 1;

	//加上红外接收定时器
    //TL1  = 0x01;        //100uS
    //TH1  = 0xFF;        //定时器0 happen per 0.1MS
	
	//去掉红外接收定时器
//    TL1  = 0xC7;        //100uS
//    TH1  = 0xFE;        //定时器0 happen per 0.1MS

    TL1  = 0xDD;        //100uS
    TH1  = 0xFD;        //定时器0 happen per 0.1MS
}


/*******************************************************************
** 函 数 名: timer1_Isr()
** 输    入: 无
** 输    出: 无
** 描    述: 定时器0中断函数,每0.1ms检测是否有脉冲。
** 全局变量: 
**			 g_pulseNum			-- 脉冲数
**			 g_keyPressed		-- 连续按键标志
** 调用模块: 
**			 checkPulse			-- 检测脉冲
** 被调模块: 
** 作    者: 金雨和
** 创建日期: 2006年1月25日
** 修    改:
**     	  日  期        版本      修改人     修改内容				 
**		1.
********************************************************************/
void timer1_Isr() interrupt 3
{
	if(IR_TEST)
		IR_TEST=0;
	else
		IR_TEST=1;

	//开始发送字符串
	if(g_sndBufLen > 0)
	{
		if(g_bitSndCnt == 0)
		{
			TxD2 = 0;
			g_bitSndCnt++;
		}
		else if(g_bitSndCnt == 9)
		{
			TxD2 = 1;
			g_sndBufOffset++;
			g_sndBufLen--;
			g_bitSndCnt = 0;
		}
		else
		{
			TxD2 = (g_sndBuf[g_sndBufOffset] >> (g_bitSndCnt-1)) & 0x01;
			g_bitSndCnt++;
		}
	}

	//接收字符串
	if(RxD2 == 0)
		g_rcvStartFlag = 1;

	//开始接受
	if(g_rcvStartFlag == 1)
	{
		if(g_hasRcvOneByte > 0)
		{
			if(g_hasRcvOneByte <= 8)
			{
				g_rcvByte >>= 1;
				if(RxD2)
				{
					g_sndBuf[g_hasRcvOneByte] = '1';
					g_rcvByte |= 0x80;
				}
				else
			   	{
					g_sndBuf[g_hasRcvOneByte] = '0';					
					g_rcvByte |= 0x00;
				}
			}

			g_hasRcvOneByte--;
		}
		else
		{
			if(RxD2 == 1)						//收到停止位,正确接收到字符
			{
				if(g_rcvByte == 0x0D)			//回车键
				{
					memcpy(g_sndBuf, "\r\n", 2);
					g_sndBufLen = 2;
				}
				else if(g_rcvByte == 0x0A)		//换行
				{
					memcpy(g_sndBuf, "\r\n", 2);
					g_sndBufLen = 2;
				}
				else if(g_rcvByte == 0x08)		//backspace键
				{
					g_sndBuf[0] = 0x08;
					g_sndBuf[1] = ' ';
					g_sndBuf[2] = 0x08;
					g_sndBufLen = 3;
				}
				else if(g_rcvByte >= 127)		//发送接收到的字符
				{
					g_sndBufLen = 0;
				}
   				else
				{
					g_sndBuf[0] = g_rcvByte;
					g_sndBufLen = 1;

					//将接收到的数据通过IIC发送给BSP15
					g_ucI2CSendBuf[0] = UART2;
					g_ucI2CSendBuf[1] = g_rcvByte;
					g_ucI2CSendBuf_Len = 2;
				   	g_ucI2CSendBuf_offset = 0;
				   	IICSendIntToCPU();

				}
				g_sndBufOffset = 0;
			}

			g_hasRcvOneByte = 9;
			g_rcvStartFlag = 0;

			g_rcvByte = 0;
		}
	}

	//加上红外接收定时器
    //TL1  = 0x01;        //100uS
    //TH1  = 0xFF;        //定时器0 happen per 0.1MS
	
	//去掉红外接收定时器
//    TL1  = 0xC7;        //100uS
//    TH1  = 0xFE;        //定时器0 happen per 0.1MS

    TL1  = 0xDD;        //100uS
    TH1  = 0xFD;        //定时器0 happen per 0.1MS

}


/*******************************************************************
** 函 数 名: UART1SendData()
** 输    入: 
**			 pbuf		-- 发送数据缓冲
**			 len		-- 发送数据长度
** 输    出: 无
** 描    述: 通过UART连续发送字节数据
**			 注意:此程序采用查询方式发送。
** 全局变量: 无
** 调用模块: 无
** 被调模块: 
**			 main		-- 主循环处理函数
** 作    者: 金雨和
** 创建日期: 2006年1月16日
** 修    改:
**     	  日  期        版本      修改人     修改内容				 
** 	   1.
********************************************************************/
void UART2SendData(uchar *pbuf, uchar len)
{   
    uchar i;
    TI=0;
    for(i=0; i<len; i++)
    {   
        SBUF=pbuf[i];
        while(!TI);
        TI=0;
    }    
}


⌨️ 快捷键说明

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