用STC12C5A60S2与PC机串口通信的问题 点击:1036 | 回复:0



jacobfree

    
发表于:2012-06-10 23:26:56
楼主

我用STC12C5A60S2与PC机通过R232进行串口通信。环境:KEIL u Vision2,串口调试小助手1.3。不知为什么单片机在每次收到小助手发来的数据后,会向小助手发送若干个字节的数据(字节数不等)。从程序上看,不应该有发送中断产生。请诸位使用过该STC12C5A60S2单片机的朋友帮忙指出故障所在。

#include "STC\STC_NEW_8051.h"
#include <intrins.h>           // 为了使用 _nop_ 函数

#define S_MAX 5                // 发送字节数
 
void UART_initial();         // 串口初始化函数

unsignedcharxdata S_BUF【5】;
unsignedcharxdata R_BUF【20】;

sbit LED0 = P1 ^ 0;                       // 灯
sbit LED5 = P1 ^ 5;                       // 上电工作指示灯
sbit LABA = P0 ^ 7;                       // 蜂鸣器

bit bdata Received = 0;                  // 接收到新数据帧标志:0=未接收,1=已接收

unsignedcharR_counter = 0;             // 接收计数器:记录接收字节的个数。最大值为R_MAX
unsignedcharS_counter = 0;             // 发送计数器:记录发送字节的个数。最大值为S_MAX

void main()
{
 LED5 = 0; //==========================================

 // 单片机初始化
 P0 = 0xFF;                              // 灭灯
 UART_initial();                         // 串口初始化。启动定时器1、允许串口接收
 IP = 0x10;                              // 串口中断优先级:高级
 IE = 0x90;                              // 开中断,串口中断允许
 
 while (! Received);                     // 未接收到数据帧,则等待
 LABA = 1;
}

/****************** 串口初始化函数 *****************************
**** 功能:设置串口——                                     ****
****       工作方式1,8位数据位,1位起始位,1位停止位       ****
****       定时器1作为波特率发生器,波特率为9600bps         ****
**** 入口参数:无                                           ****
**** 出口参数:无                                           ****
****************************************************************/
void UART_initial()
{
 AUXR = 0x00;
 SCON = 0x40;                              // 方式1,8位数据,1位停止位,1位起始位
 PCON = PCON & 0x7F;                       // 波特率不加倍
 TMOD = (TMOD & 0x0F) | 0x20;              // 定时器1:方式2
 TH1 = 0xFD;                               // 波特率:9600bps
 TL1 = 0xFD;
 TR1 = 1;                                  // 启动定时器1
 REN = 1;                                  // 允许接收
}

/******************** 串口中断函数 ****************************
****     作用:实现与上位机的通信                          ****
****                                                       ****
***************************************************************/
void UART_int() interrupt 4       // 串口中断函数
{
 if (RI)                             // 接收中断处理
 {
  R_BUF【R_counter】 = SBUF;
  RI = 0;
  R_counter ++;
  if ((R_BUF【0】 == 0x24) && (R_counter > 1))
  {
   if (R_BUF【1】 == R_counter)
   {
    R_counter = 0;
    Received = 1;
   }
  }
 }
 
 if (TI);                // 发送中断
 {
  TI = 0;
  S_counter ++;
  if (S_counter < S_MAX)
  {          // 数据帧未发送完
   SBUF = R_BUF【S_counter】;
  }
  else
  {          // 数据帧发送完毕
   S_counter = 0;
   R_counter = 0;
   REN = 1;                    // 单片机允许接收
  }
 }
}



楼主最近还看过

SSI ļʱ