zmh169 发表于 2015-5-12 13:14:26

STC15W202S串口可用吗?为什么不能收发?

很是怀疑STC15W202S串口1是否存在!用STC数据手册上的例程测试了一下,根本就不能收发。下面是例程:

/*
    定时器2用作串口1波特率发生器,MCU时钟18.432M
*/

#include "reg51.h"
#include "intrins.h"

typedef unsigned char BYTE;
typedef unsigned int WORD;

#define FOSC    18432000
#define BAUD    115200

#define NONE_PARITY   0   // 无校验
#define ODD_PARITY      1   // 奇校验
#define EVEN_PARITY   2   // 偶校验
#define MARK_PARITY   3   // 标记校验
#define SPACE_PARITY    4   // 空白校验

//#define PARITYBIT       NONE_PARITY
#define PARITYBIT       EVEN_PARITY

sfr AUXR = 0x8e;
sfr AUXR1 = 0xa2;
sfr T2H = 0xd6;
sfr T2L = 0xd7;

sbit P33 = P3^3;
bitbusy;

void sendData(BYTE dat);
void sendString(char *s);

void main()
{
    AUXR1 &= ~0x40;         // 串口1配置为P3.0/RX,P3.1/TX
   
#if (PARITYBIT == NONE_PARITY)
    SCON = 0x50;                // 8位可变波特率
#elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY)
    SCON = 0xda;                // 9位可变波特率,校验位初始为1
#elif (PARITYBIT == SPACE_PARITY)
    SCON = 0xd2;                // 9位可变波特率,校验位初始为0
#endif
   
    T2L = (655536 - (FOSC/4/BAUD));   // 设置波特率重装值
    T2H = (655536 - (FOSC/4/BAUD)) >> 8;
   
    AUXR = 0x14;    // T2为1T模式,并启动定时器2
    AUXR |= 0x01;   // 选择定时器2为串口1波特率发生器
   
    ES = 1;         // 使能串口1中断
    EA = 1;
   
    sendString("STC15W202S2\r\nUart Test !\r\n");
   
    while(1);
}

/*----------------------------
UART 中断服务程序
-----------------------------*/
void Uart() interrupt 4 using 1
{
    if (RI)
    {
      RI = 0;                     //清除RI位
      sendData(SBUF);            //串口回传收到的数据
    }
    if (TI)
    {
      TI = 0;               //清除TI位
      busy = 0;               //清忙标志
    }
}

/*----------------------------
发送串口数据
----------------------------*/
void sendData(BYTE dat)
{
    while (busy);               //等待前面的数据发送完成
    ACC = dat;                  //获取校验位P (PSW.0)
    if (P)                      //根据P来设置校验位
    {
#if (PARITYBIT == ODD_PARITY)
      TB8 = 0;                //设置校验位为0
#elif (PARITYBIT == EVEN_PARITY)
      TB8 = 1;                //设置校验位为1
#endif
    }
    else
    {
#if (PARITYBIT == ODD_PARITY)
      TB8 = 1;                //设置校验位为1
#elif (PARITYBIT == EVEN_PARITY)
      TB8 = 0;                //设置校验位为0
#endif
    }
    busy = 1;
    SBUF = ACC;               //写数据到UART数据寄存器
}

/*----------------------------
发送字符串
----------------------------*/
void sendString(char *s)
{
    while (*s)                  //检测字符串结束标志
    {
      sendData(*(s++) );         //发送当前字符
    }
}
再附上原始的C文件。

steaven2000 发表于 2015-5-12 15:55:44

经常怀疑处理器最基本功能的人,我觉得都应该去看看医生。

小李非刀 发表于 2015-5-12 19:35:15

STC官网库函数例程 06-串口1中断收发。

STC15系列库函数与例程测试版V1.0.rar

http://www.stcmcu.com/STC-LIB/STC15%E7%B3%BB%E5%88%97%E5%BA%93%E5%87%BD%E6%95%B0%E4%B8%8E%E4%BE%8B%E7%A8%8B%E6%B5%8B%E8%AF%95%E7%89%88V1.0.rar

衰不堪言 发表于 2015-5-12 20:13:50

应该不会有问题,你先用示波器测测波形

zmh169 发表于 2015-5-13 22:11:30

steaven2000 发表于 2015-5-12 15:55
经常怀疑处理器最基本功能的人,我觉得都应该去看看医生。

确实眼花了,把65536打成了655536!改过来就好了。

小李非刀 发表于 2015-5-13 23:54:45

LZ注意,用keil的话,超过65535的常数,后面要加L或UL,否则,你懂的。
#define FOSC    18432000L
#define BAUD    115200L

zmh169 发表于 2015-5-14 11:35:54

小李非刀 发表于 2015-5-13 23:54
LZ注意,用keil的话,超过65535的常数,后面要加L或UL,否则,你懂的。
#define FOSC    18432000L
#define ...

多谢提醒,我用的keil 5,没加L也正常。问题出在TIM2重载值计算上,把65535打成655535了。
页: [1]
查看完整版本: STC15W202S串口可用吗?为什么不能收发?