问题解决,谢谢 南宫云明。公司装了加密软件,所以就贴出来了。
time_serial2.h
///////////////////////////////////////////////////////////
/******************************
1) zigbee和单片机通信使用串口2,引脚P1.2-->Rx,P1.3-->Tx,
接收字符串采用定时器1判断是否完成
2) pc和单片机通信使用串口1,引脚P3.0-->Rx,P3.1-->Tx,
接收字符串采用定时器0判断是否完成
3) zigbee和pc串口通信时,引脚对应,
zigbee和单片机串口通信是,引脚交叉
*******************************/
#ifndef TIME_UART2_H
#define _TIME_UART2_H
#include <stc12c5a60s2.h>
#include <string.h>
#define S2RI 0x01 //串口2接收中断请求标志位
#define S2TI 0x02 //串口2发送中断请求标志位
#define NUMBERS 100
BYTE idata UARTSeflag = 0; //主程序中判断接收完成标志
BYTE idata UARTReflag = 0;
BYTE idata UARTCount = 0;
BYTE idata UART2Seflag = 0; //串口2接收完成
BYTE idata UART2Reflag = 0; //串口2接收完成
BYTE idata UART2Count = 0;
BYTE idata recvs[NUMBERS] = {0}; //串口1缓存数组
BYTE idata recvs2[NUMBERS] = {0}; //串口2缓存数组
void UartInit()
{
//尝试两个串口共用独立波特率发生器 可行
SCON = 0x50; //串口1工作在方式1 10位异步收发 REN=1允许接收
S2CON = 0x50; //串口2工作在方式1 10位异步收发 S2REN=1允许接收
BRT = 0xF1; //独立波特率发生器初值 18.432MHz 38400
AUXR = 0x15; //BRTR=1 独立波特率发生器开始计数
}
/*************作为超时判断的两定时器初始化********************/
void TimerInit()
{
TMOD = 0x00;//定时器0、1工作于方式1,16位
TH0 = 0x00;
TL0 = 0x00;
TH1 = 0x00;
TL1 = 0x00;
}
/*************定时器和串口初始化********************/
void CpuInit()
{
UartInit();
TimerInit();
//优先级控制 T0 > S1 > T1 > S2
IPH = 0x12; //PSH = 1, PT0H = 1,PT1H = 0
IPH2 = 0x00; //PS2H = 0
//IPH = 0x08;
PT0 = 1;
PS = 0;
PT1 = 1;
IP2 = 0x00; //PS2 = 0
//启动
ET0 = 1; //开定时0中断
ET1 = 1; //开定时1中断
ES = 1; //开串口中断
IE2 = 0x01; //开串口2中断 ES2=1
EA = 1; //开启总中断
}
/****************串行口1发送单字符****************/
void UART_1SendOneByte(BYTE c)
{
SBUF = c;
while(!TI); //若TI=0,在此等待
TI = 0;
}
/****************串行口1发送字符串****************/ //pc和单片机通信
void UART_1SendString(BYTE * p)
{
BYTE i = 0,n = 0;
ES = 0;
n = strlen(p);
while(i<n)
{
UART_1SendOneByte(*p++);
i++;
}
ES = 1;
}
/****************串行口2发送单字符****************/
void UART_2SendOneByte(BYTE c)
{
S2BUF = c;
while(!(S2CON&S2TI)); //若S2TI=0,在此等待
S2CON&=~S2TI; //S2TI=0
}
/****************串行口2发送字符串****************/ //模块和单片机通信
void UART_2SendString(BYTE * p)
{
BYTE i = 0,n = 0;
n = strlen(p);
IE2 =0x00; //关串口2中断
while(i<n)
{
UART_2SendOneByte(*p++);
i++;
}
//UART_2SendOneByte('#'); //模拟串口助手发送字符串以'#'结束
IE2 =0x01; //开串口2中断
}
/************串行口1中断处理函数*************/
void Uart_ISR() interrupt 4 //仅接收字符会产生中断
{
ES = 0; //关闭串口中断
TR0 = 1; //启动定时器0,判断接受是否超时
while(1)
{
if(RI) //用查询法接收字符
{
RI=0; //清除中断标志
recvs[UARTCount] = SBUF;
UARTCount++;
TH0 = TL0 = 0x00;
}
if(UARTReflag)//定时器已经在计时
{
UARTSeflag = 1; //置位串口发送标志,用于主程序中判断接收完成,可以进行发送了
UARTReflag = 0; //清除串口接受完成中断标志
break;
}
}
ES = 1; //开启串口中断
}
/***********定时器0中断*****************/
void Timer0_ISR() interrupt 1
{
TR0 = 0; //关闭定时器0
TH0 = 0x00;
TL0 = 0x00;
UARTReflag = 1; //置位串口接受完成标志
}
/************串行口2中断处理函数*************/
void UART_2Interrupt(void) interrupt 8
{
IE2 = 0x00;
TR1 = 1;
while(1)
{
if(S2CON&S2RI) //产生接收中断
{
S2CON&=~S2RI; //清除串口2接收中断标志
recvs2[UART2Count] = S2BUF;
UART2Count++;
TH1 = TL1 = 0x00;
}
if(UART2Reflag)//定时器已经在计时
{
UART2Seflag = 1; //置位串口发送标志,用于主程序中判断接收完成,可以进行发送了
UART2Reflag = 0; //清除串口接受完成中断标志
break;
}
}
IE2 = 0x01;
}
/***********定时器1中断*****************/
void Timer1_ISR() interrupt 3
{
TR1 = 0; //关闭定时器0
TH1 = 0x00;
TL1 = 0x00;
UART2Reflag = 1; //置位串口接受完成标志
}
void myclean1()
{
UARTSeflag = 0;
UARTCount = 0;
memset(recvs,0,strlen(recvs));
}
void myclean2()
{
UART2Seflag = 0;
UART2Count = 0;
memset(recvs2,0,strlen(recvs));
}
#endif
main.c
//////////////////////////////////////////////////////////
#include "time_serial2.h"
void main(void)
{
CpuInit();
while(1)
{
if(UARTSeflag && strcmp(recvs,"from com4") == 0)
{
UART_2SendString("com4 to MCU to com1\n");
myclean1();
}
if(UART2Seflag && strcmp(recvs2,"from com1") == 0)
{
UART_1SendString("com1 to MCU to com4\n");
myclean2();
}
}
}
|