各位高手,我想实现这样一个功能:stc12c5a60s2具有两个串口,叫做串口1和串口2。通过串口1接收任意字节的数据,并通过串口2发送到电脑的串口调试工具。程序思路是这样:通过串口一接收数据,通过定时器中断来判断是否接收数据完毕,这里设置的时间大约为10ms。当数据发送完毕超过10ms后会触发定时器中断,定时器中断函数会触发发送标志位。主程序会把串口1接收到的数据从串口2发送出去。请各位指正一下代码的错误,并提示如何编写这段代码
程序代码如下:
这是主函数程序文件,即main.c
#include "STC12C5A60S2.H"
#include "Serial.h"
unsigned int data p_send=0;
void main()
{
Uart_Two_Init();
Uart_One_Init();
//判断串口1发送标志位是否为1
while(1)
{
if(rec1_flag==1) //如果是1
{
rec1_flag=0;
while(p_send<=rec1_count)//判断发送指针的值是否小于全局计数器
{ //如果是
Uart_One_Send(rec1_data[p_send]);//开始发送数据
p_send=p_send+1;
}
ES=1;
//如果不是
//停止发送数据
//开串口1中断
}
}
串口文件,serial.h
#define uchar unsigned char
#define uint unsigned int
unsigned char data rec1_count=0;//串口1接收计数器
unsigned int data rec1_flag=0; //串口1接收标志位
unsigned char xdata rec1_data[100]={0};//串口1接收缓冲区
//定时器0初始化
void Timer0_Init()
{
TMOD=TMOD||0x02;
TH0= 0xff;
TL0= 0xff;
}
//=======baud 9600=======================
void Uart_One_Init() //串口1初始化函数,波特率9600
{
TMOD=0x22;//设置定时器1为工作方式2
TH1=0xfd; //设置波特率为9600
TL1=0xfd;
TR1=1;
REN=1;
SM0=0;
SM1=1;
EA=1;
ES=1;
// AUXR|=0X40; //T1*12;
}
//========================================
void Uart_One_Send(char k) //串口1发送一个字符
{
ES = 0 ;
SBUF=k;
while(TI!=1);
TI = 0 ;
ES = 1 ;
}
//=========baud 9600=======================
void Uart_Two_Init() //串口2初始化函数,波特率9600
{
S2CON= 0x50 ; //方式2,允许接收
// BRT = RELOAD_TWO ;
BRT = 0xfd; //设置波特率9600
AUXR = AUXR |0X10 ; //允许独立波特率发生器运行
// BRTx12_enable();
AUXR1 = AUXR1&0xef ; //S2_P4=0,将uart2切换到P1口
IE2 = IE2|0X01; //允许串口2中断
}
//=========================================
void Uart_Two_Send(uchar k) //串口2发送一个字符
{
ES = 0 ;
S2BUF = k ;
while((S2CON&0x02)!=0x02);
S2CON &= ~0x02;
ES = 1 ;
}
//=============================================
void Uart_One_Receive() interrupt 4
{
if(RI==1)
{
RI = 0;
//定时器从0开始计数
TF0=0;
//开定时器,定时器开始计数
TR0=1;
if(SBUF!=0xff)//接收数据
{
rec1_data[rec1_count++]=SBUF;
}
//全局计数器加1
TR0=0;
TF0=0;
//关定时器
}
}
//========================================
void Uart_Two_Receive() interrupt 8
{
S2CON = S2CON & 0xfe;//清0 S2RI
//S2CON = S2CON | 0x01;
}
//=====================================
void Timer0() interrupt 3
{
//发送标志位置1
rec1_flag=1;
//关闭串口中断
}
此帖出自
小平头技术问答
不是有收发中断吗?为什么还用定时器判断?
串口1收到就从串口2发就行了,10ms的目的是什么呢
一周热门 更多>