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