发表于: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; // 单片机允许接收
}
}
}
我用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; // 单片机允许接收
}
}
}