baynkrnr 发表于 2014-3-14 13:05:31

stc15w204s串口无法收发数据


程序如下搞了几天了,串口死活都收发不了数据。官网上又没数据手册。
#include "reg51.h"
#include "intrins.h"

typedef unsigned char BYTE;
typedef unsigned int WORD;

#define FOSC 18432000L          //系统频率
#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 EVEN_PARITY   //定义校验位

sfr AUXR= 0x8e;               //辅助寄存器

sfr P_SW1   = 0xA2;             //外设功能切换寄存器1

#define S1_S0 0x40            //P_SW1.6
#define S1_S1 0x80            //P_SW1.7

sbit P22 = P2^2;
sbit P37 = P3^7;//led
      
bit busy;

void SendData(BYTE dat);
void SendString(char *s);


void main()
{
    P37=1;
      
      ACC = P_SW1;
    ACC &= ~(S1_S0 | S1_S1);    //S1_S0=0 S1_S1=0
    P_SW1 = ACC;                //(P3.0/RxD, P3.1/TxD)
   
//ACC = P_SW1;
//ACC &= ~(S1_S0 | S1_S1);    //S1_S0=1 S1_S1=0
//ACC |= S1_S0;               //(P3.6/RxD_2, P3.7/TxD_2)
//P_SW1 = ACC;
//
//ACC = P_SW1;
//ACC &= ~(S1_S0 | S1_S1);    //S1_S0=0 S1_S1=1
//ACC |= S1_S1;               //(P1.6/RxD_3, P1.7/TxD_3)
//P_SW1 = ACC;

#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

    AUXR = 0x40;                //定时器1为1T模式
    TMOD = 0x00;                //定时器1为模式0(16位自动重载)
    TL1 = (65536 - (FOSC/4/BAUD));   //设置波特率重装值
    TH1 = (65536 - (FOSC/4/BAUD))>>8;
    TR1 = 1;                  //定时器1开始启动
    ES = 1;                     //使能串口中断
    EA = 1;
      
   P37=1;
   _nop_();
   _nop_();
   _nop_();
   P37=0;
    _nop_();
   _nop_();
   _nop_();
   P37=0;   
    SendString("STC15F2K60S2\r\nUart Test !\r\n");//卡在这里了   
   P37 = 1;
      
    while(1)
            {

   SendString("STC15F2K60S2\r\nUart Test !\r\n");

    P37=0;
   _nop_();
   _nop_();
   _nop_();

    _nop_();
   _nop_();
   _nop_();               
            }
}

/*----------------------------
UART 中断服务程序
-----------------------------*/
void Uart() interrupt 4 using 1
{
    if (RI)
    {
      RI = 0;               //清除RI位
      P0 = SBUF;            //P0显示串口数据
      P22 = RB8;            //P2.2显示校验位
    }
    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++) );         //发送当前字符
    }
}

dexidz 发表于 2015-3-22 10:44:57

有贴子说,换INTEL编译就OK了。

小李非刀 发表于 2015-3-22 12:14:48

没看手册中MCU资源的后果。。。。

STC15W204S没有Timer1,要用Timer2做波特率发生器。

小李非刀 发表于 2015-3-22 12:15:42

STC官网由用库函数写的例程可以参考

34071417 发表于 2015-3-26 12:07:35

用他的固件库中的例程,不要用软件生产的。应该是有bug存在。我也遇到过这个问题。是在不行。楼上有说用其他种类的单片机,试试

老魏 发表于 2015-4-3 08:31:04

我试过可以的,没问题的。换成TIME2就好!
页: [1]
查看完整版本: stc15w204s串口无法收发数据