功能描述
使用STC8H单片机的串口2进行收发通讯。
注意:要和外部设备通信,stc单片机最好用外部晶振,内部IRC时钟波特率不准,无法正常通信。
接线说明:
STC8A单片机-->USB转TTL&电源模块
P10-->UTXD
P11-->URXD
注意事项: USB连接线给开发板通电下载程序,STC下载软件中内部IRC时钟选择11.0592MHZ
程序源码
/**************************************************************************************
接线说明: 1:STC8A单片机-->USB转TTL&电源模块
P10-->UTXD
P11-->URXD
注意事项: USB连接线给开发板通电下载程序,STC下载软件中内部IRC时钟选择11.0592MHZ
***************************************************************************************/
#include "STC8.H"
#include "intrins.h"
#define MAIN_Fosc 11059200L //定义主时钟
#define uint32 unsigned long
#define uint16 unsigned int
#define uint8 unsigned char
#define uchar unsigned char
/************* 本地变量声明 **************/
#define TRUE 1
#define FALSE 0
#define Buf_Max 50
#define S2_S 0x01
#define S2RI 0x01
#define S2TI 0x02
volatile uint8 Flag=FALSE;
uint8 xdata Rec_Buf[Buf_Max];
uint8 i = 0;
bit busy;
uchar table2[3]={0x04,0x04,0x04}; //串口2循环发送指令
uchar rec2[14]; //接收数组
uchar rec1[14];
/**************************************
功能描述:延时函数
入口参数:uint16 x ,该值为1时,延时1ms
返回值:无
***************************************/
void delay_ms(uint16 x)
{
uint16 j,i;
for(j=0;j<x;j++)
{
for(i=0;i<1100;i++);
}
}
/***************************************************************************
* 描 述 : 串口2初始化函数
* 入 参 : 无
* 返回值 : 无
备注:波特率9600bps 晶振11.0592MHz
**************************************************************************/
void Uart2_Init(void)
{
S2CON = 0x50; //8位数据,可变波特率,启动串行接收器
AUXR |= 0x04; //定时器2时钟为Fosc,即1T
T2L = 0xE0; //设定定时初值
T2H = 0xFE; //设定定时初值
AUXR |= 0x10; //启动定时器2
IE2 |= 0x01; // 串口2中断打开
EA = 1; // 总中断打开
}
/***************************************************************************
* 描 述 : 串口1初始化函数
* 入 参 : 无
* 返回值 : 无
备注:波特率9600bps 晶振11.0592MHz
**************************************************************************/
void Uart1_Init(void)
{
PCON &= 0x3f; //波特率不倍速,串行口工作方式由SM0、SM1决定
SCON = 0x50; //8位数据,可变波特率,启动串行接收器
AUXR |= 0x40; //定时器1时钟为Fosc,即1T
AUXR &= 0xfe; //串口1选择定时器1为波特率发生器
TMOD &= 0x0f; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xDC; //设定定时初值
TH1 = 0xDC; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
ES = 1; // 串口1中断打开
EA = 1; // 总中断打开
}
/***************************************************************************
* 描 述 : 串口2发送数据函数
* 入 参 : uint8 数据
* 返回值 : 无
**************************************************************************/
void SendDataByUart2()
{
S2BUF =table2[3] ; //写数据到UART数据寄存器
while(!(S2CON&S2TI)); //在停止位没有发送时,S2TI为0即一直等待
S2CON&=~S2TI; //清除S2CON寄存器对应S2TI位(该位必须软件清零)
}
/**************************************************************************************
* 描 述 : USART2接收到数据后串口发送出去
* 入 参 : 无
* 返回值 : 无
**************************************************************************************/
void USART2_Tx_Puts(void)
{
if(Flag) //有新数据通过串口被接收到
{
IE2 &= 0xFE; // 串口2中断关闭
rec1[14]=rec2[14];
IE2 |= 0x01; // 串口2中断打开
Flag=FALSE; //清除接收标识符
}
}
/***************************************************************************
* 描 述 : 串口1发送数据函数
* 入 参 : uint8 数据
* 返回值 : 无
**************************************************************************/
void SendDataByUart1(void)
{
rec1[14]=S2BUF ; //写数据到UART数据寄存器
while(TI == 0); //在停止位没有发送时,TI为0即一直等待
TI = 0; //清除TI位(该位必须软件清零)
}
/**************************************************************************************
* 描 述 : USART1接收到数据后串口发送出去
* 入 参 : 无
* 返回值 : 无
**************************************************************************************/
void USART1_Tx_Puts(void)
{
if(Flag) //有新数据通过串口被接收到
{
ES = 0; //串口1中断关闭
SendDataByUart1(); //发送字符
ES = 1; //串口1中断打开
Flag=FALSE; //清除接收标识符
}
}
/***************************************************************************
* 描 述 : 串口2中断服务函数
* 入 参 : 无
* 返回值 : 无
**************************************************************************/
void Uart2() interrupt 8 using 1
{
IE2 &= 0xFE; // 串口2中断关闭
Flag=TRUE; //接收到数据,接收标识符有效
if (S2CON & S2RI) //串行接收到停止位的中间时刻时,该位置1
{
S2CON &= ~S2RI; //清除S2CON寄存器对应S2RI位(该位必须软件清零)
rec2[14] = S2BUF;
}
if (S2CON & S2TI) //在停止位开始发送时,该位置1
{
S2CON &= ~S2TI; //清除S2CON寄存器对应S2TI位(该位必须软件清零)
}
IE2 |= 0x01; // 串口2中断打开
}
/***********************
功能描述:主函数
入口参数:无
返回值:无
************************/
int main()
{
P1M1 &= 0xFE; P1M0 &= 0xFE; //设置P1.0为准双向口
P1M1 &= 0xFD; P1M0 |= 0x02; //设置P1.1为推挽输出
P3M1 &= 0xFE; P3M0 &= 0xFE; //设置P3.0为准双向口
P3M1 &= 0xFD; P3M0 |= 0x02; //设置P3.1为推挽输出
Uart2_Init();
Uart1_Init();
while(1);
}
///***************************************************************************
// * 描 述 : 串口1中断服务函数
// * 入 参 : 无
// * 返回值 : 无
// **************************************************************************/
//void Uart1() interrupt 4 using 1
//{
// ES = 0; // 串口1中断关闭
// Flag=TRUE; //接收到数据,接收标识符有效
// if (RI) //串行接收到停止位的中间时刻时,该位置1
// {
// RI = 0; //清除RI位 (该位必须软件清零)
// SBUF=S2BUF;
// }
// if (TI) //在停止位开始发送时,该位置1
// {
// TI = 0; //清除TI位(该位必须软件清零)
// }
// ES = 1; // 串口1中断打开
//}