登录
首页 工控软件 工控软件
回帖 发帖
正文

主题:STC12C5A60S2与PC机通过R232进行串口通信

点击:1307 回复:1

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

void UART_initial();         // 串口初始化函数
unsigned char xdata S_BUF[5];
unsigned char xdata R_BUF[20];
sbit LED0 = P1 ^ 0;                       // 灯
sbit LED5 = P1 ^ 5;                       // 上电工作指示灯
sbit LABA = P0 ^ 7;                       // 蜂鸣器
bit bdata Received = 0;                  // 接收到新数据帧标志:0=未接收,1=已接收
unsigned char R_counter = 0;             // 接收计数器:记录接收字节的个数。最大值为R_MAX
unsigned char S_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;                    // 单片机允许接收
 }
}
}
12-06-10 23:37
用的是STC12C5A60S2的单片机啊,不错啊,这个单片机是双串口的哦,相互独立,互不影响!和串口调试助手调试,很简单啊!QQ878817080
12-06-11 11:52

工控新闻

更多新闻资讯