找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7785|回复: 4
打印 上一主题 下一主题
收起左侧

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

[复制链接]
跳转到指定楼层
楼主
ID:142973 发表于 2016-11-8 10:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


各位高手,我想实现这样一个功能: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;
        //关闭串口中断
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:123289 发表于 2016-11-8 18:29 | 只看该作者
串口1接收的数据是随机而来的?
你如何知道串口1数据完结了?一个字节完结?还是一组数据完结?
当你延时10ms忙于串口2发送的时间候,串口1又来数据子,你如何等这个字节的10ms?
思路不是很清晰的。
对于延时10ms后再处理,其目的不是很明确。
回复

使用道具 举报

板凳
ID:123289 发表于 2016-11-8 18:30 | 只看该作者
热心人快来啊!
回复

使用道具 举报

地板
ID:142973 发表于 2016-11-8 23:02 | 只看该作者
通过串口一接收数据,通过定时器中断来判断是否接收数据完毕,,接收任意字节的数据。。。。怎么写这程序
回复

使用道具 举报

5#
ID:51321 发表于 2016-11-10 08:59 | 只看该作者

 热心人快来啊!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表