您现在所在的是:

工控软件

回帖:1个,阅读:1307 [上一页] [1] [下一页]
926
jacobfree
文章数:4
年度积分:50
历史总积分:926
注册时间:2007/6/28
发站内信
发表于:2012/6/10 23:37:31
#0楼
STC12C5A60S2


我用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();         // 串口初始化函数

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;                    // 单片机允许接收
 }
}
}

27950
guanyumou 版主
文章数:10552
年度积分:1133
历史总积分:27950
注册时间:2008/7/13
发站内信
2018论坛优秀版主
2018春节活动(三)
2017论坛优秀版主
2017国庆活动(二)
2017春节活动(三)
发表于:2012/6/11 11:52:15
#1楼
用的是STC12C5A60S2的单片机啊,不错啊,这个单片机是双串口的哦,相互独立,互不影响!和串口调试助手调试,很简单啊!QQ878817080

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 非法和不良信息举报

工控网客服热线:0755-86369299
版权所有 工控网 Copyright©2024 Gkong.com, All Rights Reserved

46.8003