stc12c5a60s2型号单片机串口通信和定时器中断问题

2019-03-24 18:23发布

各位高手,我想实现这样一个功能: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条回答
Li_Lei
1楼-- · 2019-03-25 04:05

不是有收发中断吗?为什么还用定时器判断?
串口1收到就从串口2发就行了,10ms的目的是什么呢

一周热门 更多>