/*---------------------------------------------------------------------*/
/* --- 项目名称:双串口全双工收发程序 ------------------------------------------------*/
/* --- 设计者:王永会 -------------------------------*/
/* ---调用了STC官方程序 ----------------------------------------*/
/* --- 采用单片机型号为:STC8F2KXXS2-----------------------*/
/* --- 设计时间:2019年4月2日-----------------------*/
/*---------------------------------------------------------------------*/
#include "reg51.h"
#include "intrins.h"
#define MAIN_Fosc 11059200L //定义主时钟
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;
/***************************************寄存器定义***********************************/
sfr AUXR = 0x8E;
sfr S2CON = 0x9A; //
sfr S2BUF = 0x9B; //
sfr TH2 = 0xD6;
sfr TL2 = 0xD7;
sfr IE2 = 0xAF; //STC12C5A60S2系列
sfr INT_CLKO = 0x8F;
sfr P_SW1 = 0xA2;
sfr P_SW2 = 0xBA;
sfr P4 = 0xC0;
sfr P5 = 0xC8;
sfr P6 = 0xE8;
sfr P7 = 0xF8;
sfr P1M1 = 0x91; //PxM1.n,PxM0.n =00--->Standard, 01--->push-pull
sfr P1M0 = 0x92; // =10--->pure input, 11--->open drain
sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr P2M1 = 0x95;
sfr P2M0 = 0x96;
sfr P3M1 = 0xB1;
sfr P3M0 = 0xB2;
sfr P4M1 = 0xB3;
sfr P4M0 = 0xB4;
sfr P5M1 = 0xC9;
sfr P5M0 = 0xCA;
sfr P6M1 = 0xCB;
sfr P6M0 = 0xCC;
sfr P7M1 = 0xE1;
sfr P7M0 = 0xE2;
sbit P00 = P0^0;
sbit P01 = P0^1;
sbit P02 = P0^2;
sbit P03 = P0^3;
sbit P04 = P0^4;
sbit P05 = P0^5;
sbit P06 = P0^6;
sbit P07 = P0^7;
sbit P10 = P1^0;
sbit P11 = P1^1;
sbit P12 = P1^2;
sbit P13 = P1^3;
sbit P14 = P1^4;
sbit P15 = P1^5;
sbit P16 = P1^6;
sbit P17 = P1^7;
sbit P20 = P2^0;
sbit P21 = P2^1;
sbit P22 = P2^2;
sbit P23 = P2^3;
sbit P24 = P2^4;
sbit P25 = P2^5;
sbit P26 = P2^6;
sbit P27 = P2^7;
sbit P30 = P3^0;
sbit P31 = P3^1;
sbit P32 = P3^2;
sbit P33 = P3^3;
sbit P34 = P3^4;
sbit P35 = P3^5;
sbit P36 = P3^6;
sbit P37 = P3^7;
sbit P40 = P4^0;
sbit P41 = P4^1;
sbit P42 = P4^2;
sbit P43 = P4^3;
sbit P44 = P4^4;
sbit P45 = P4^5;
sbit P46 = P4^6;
sbit P47 = P4^7;
sbit P50 = P5^0;
sbit P51 = P5^1;
sbit P52 = P5^2;
sbit P53 = P5^3;
sbit P54 = P5^4;
sbit P55 = P5^5;
sbit P56 = P5^6;
sbit P57 = P5^7;
/******************************************设置串口1和串口2的波特率*********************************/
#define Baudrate1 9600UL
#define Baudrate2 9600UL
/************* 功能说明 **************
双串口全双工中断方式收发通讯程序。
通过PC向MCU发送数据, MCU收到后通过串口把收到的数据原样返回.
******************************************/
#define UART1_BUF_LENGTH 32
#define UART2_BUF_LENGTH 32
u16 a = 0;
u8 TX1_Cnt; //发送计数
u8 RX1_Cnt; //接收计数
u8 TX2_Cnt; //发送计数
u8 RX2_Cnt; //接收计数
bit B_TX1_Busy; //发送忙标志
bit B_TX2_Busy; //发送忙标志
u8 idata RX1_Buffer[UART1_BUF_LENGTH]; //接收缓冲
u8 idata RX2_Buffer[UART2_BUF_LENGTH]; //接收缓冲
/***************************函数声明******************************************/
void UART1_config(u8 brt); // 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
void UART2_config(u8 brt); // 选择波特率, 2: 使用Timer2做波特率, 其它值: 无效.
void PrintString1(u8 *puts);
void PrintString2(u8 *puts);
void UartSend(u8 dat);
void delay_ms(u16 xms);
void set();
//========================================================================
// 函数: void main(void)
// 描述: 主函数。
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2014-11-28
// 备注:
//========================================================================
/**************************************主函数************************************/
void main(void)
{
P0M1 = 0; P0M0 = 0; //设置为准双向口
P1M1 = 0; P1M0 = 0; //设置为准双向口
P2M1 = 0; P2M0 = 0; //设置为准双向口
P3M1 = 0; P3M0 = 0; //设置为准双向口
P4M1 = 0; P4M0 = 0; //设置为准双向口
P5M1 = 0; P5M0 = 0; //设置为准双向口
P6M1 = 0; P6M0 = 0; //设置为准双向口
P7M1 = 0; P7M0 = 0; //设置为准双向口
UART1_config(1); // 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
UART2_config(2); // 选择波特率, 2: 使用Timer2做波特率, 其它值: 无效.
EA = 1; //允许全局中断
set();//开机配置函数
/********************************测试程序****************************/
while (1)
{
if(SBUF == 0x01)
{
UartSend(0x7E);
UartSend(0x04);
UartSend(0x03);
UartSend(0x00);
UartSend(0x01);
UartSend(0xEF);
while(!RI);
RI = 0;
}
if(SBUF == 0x02)
{
UartSend(0x7E);
UartSend(0x04);
UartSend(0x03);
UartSend(0x00);
UartSend(0x02);
UartSend(0xEF);
while(!RI);
RI = 0;
}
if(SBUF == 0x03)
{
UartSend(0x7E);
UartSend(0x04);
UartSend(0x03);
UartSend(0x00);
UartSend(0x03);
UartSend(0xEF);
while(!RI);
RI = 0;
}
if(SBUF == 0x04)
{
UartSend(0x7E);
UartSend(0x04);
UartSend(0x03);
UartSend(0x00);
UartSend(0x04);
UartSend(0xEF);
while(!RI);
RI = 0;
}
if(SBUF == 0x05)
{
UartSend(0x7E);
UartSend(0x04);
UartSend(0x03);
UartSend(0x00);
UartSend(0x05);
UartSend(0xEF);
while(!RI);
RI = 0;
}
if(SBUF == 0x06)
{
UartSend(0x7E);
UartSend(0x04);
UartSend(0x03);
UartSend(0x00);
UartSend(0x06);
UartSend(0xEF);
while(!RI);
RI = 0;
}
if(SBUF == 0x07)
{
UartSend(0x7E);
UartSend(0x04);
UartSend(0x03);
UartSend(0x00);
UartSend(0x07);
UartSend(0xEF);
while(!RI);
RI = 0;
}
if(SBUF == 0x08)
{
UartSend(0x7E);
UartSend(0x04);
UartSend(0x03);
UartSend(0x00);
UartSend(0x08);
UartSend(0xEF);
while(!RI);
RI = 0;
}
if(SBUF == 0x09)
{
UartSend(0x7E);
UartSend(0x04);
UartSend(0x03);
UartSend(0x00);
UartSend(0x09);
UartSend(0xEF);
while(!RI);
RI = 0;
}
if(SBUF == 0x0a)
{
UartSend(0x7E);
UartSend(0x04);
UartSend(0x03);
UartSend(0x00);
UartSend(0x0a);
UartSend(0xEF);
while(!RI);
RI = 0;
}
if(SBUF == 0x08)
{
UartSend(0x7E);
UartSend(0x04);
UartSend(0x03);
UartSend(0x00);
UartSend(0x03);
UartSend(0xEF);
while(!RI);
RI = 0;
}
if(SBUF == 0x08)
{
UartSend(0x7E);
UartSend(0x04);
UartSend(0x03);
UartSend(0x00);
UartSend(0x03);
UartSend(0xEF);
while(!RI);
RI = 0;
}
}
}
//========================================================================
// 函数: void PrintString2(u8 *puts)
// 描述: 串口2发送字符串函数。
// 参数: puts: 字符串指针.
// 返回: none.
// 版本: VER1.0
// 日期: 2014-11-28
// 备注:
//========================================================================
void UartSend(u8 dat)
{
while (B_TX2_Busy);
B_TX2_Busy = 1;