amoBBS 阿莫电子论坛

 找回密码
 注册
搜索
bottom↓
查看: 536|回复: 21

STC15W4K32S4用官方的串口程序都无法正常工作,怎么回事?

[复制链接]
发表于 2019-4-16 16:01:19 | 显示全部楼层 |阅读模式
如题,用官方的程序,一个字节未动,居然串口收不到测试发送的代码。怎么回事?
/*---------------------------------------------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- STC15F4K60S4 系列 定时器4用作串口4的波特率发生器举例------------*/
/* --- Mobile: (86)13922805190 ----------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966-------------------------*/
/* --- Web: www.STCMCU.com --------------------------------------------*/
/* --- Web: www.GXWMCU.com --------------------------------------------*/
/* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序        */
/* 如果要在文章中应用此代码,请在文章中注明使用了STC的资料及程序        */
/*---------------------------------------------------------------------*/

//本示例在Keil开发环境下请选择Intel的8058芯片型号进行编译
//若无特别说明,工作频率一般为11.0592MHz


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

typedef unsigned char BYTE;
typedef unsigned int WORD;

#define FOSC 11059200L          //系统频率
#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 P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr P1M1 = 0x91;
sfr P1M0 = 0x92;
sfr P2M1 = 0x95;
sfr P2M0 = 0x96;
sfr P3M1 = 0xb1;
sfr P3M0 = 0xb2;
sfr P4M1 = 0xb3;
sfr P4M0 = 0xb4;
sfr P5M1 = 0xC9;
sfr P5M0 = 0xCA;
sfr P6M1 = 0xCB;
sfr P6M0 = 0xCC;
sfr P7M1 = 0xE1;
sfr P7M0 = 0xE2;

sfr S4CON = 0x84;               //UART4 控制寄存器
sfr S4BUF = 0x85;               //UART4 数据寄存器

sfr IE2     = 0xAF;             //中断使能寄存器2
sfr T4T3M   = 0xD1;             //定时器3和定时器4控制寄存器
sfr T4H     = 0xD2;             //定时器4高8位
sfr T4L     = 0xD3;             //定时器4低8位
sfr T3H     = 0xD4;             //定时器3高8位
sfr T3L     = 0xD5;             //定时器3低8位

#define S4RI  0x01              //S4CON.0
#define S4TI  0x02              //S4CON.1
#define S4RB8 0x04              //S4CON.2
#define S4TB8 0x08              //S4CON.3

sfr P_SW2   = 0xBA;             //外设功能切换寄存器2
#define S4_S0 0x04              //P_SW2.2

bit busy;

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

void main()
{
    P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P4M0 = 0x00;
    P4M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;
    P6M0 = 0x00;
    P6M1 = 0x00;
    P7M0 = 0x00;
    P7M1 = 0x00;

    P_SW2 &= ~S4_S0;            //S4_S0=0 (P0.2/RxD4, P0.3/TxD4)
//  P_SW2 |= S4_S0;             //S4_S0=1 (P5.2/RxD4_2, P5.3/TxD4_2)

#if (PARITYBIT == NONE_PARITY)
    S4CON = 0x50;               //8位可变波特率
#elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY)
    S4CON = 0xda;               //9位可变波特率,校验位初始为1
#elif (PARITYBIT == SPACE_PARITY)
    S4CON = 0xd2;               //9位可变波特率,校验位初始为0
#endif

    T4L = (65536 - (FOSC/4/BAUD));   //设置波特率重装值
    T4H = (65536 - (FOSC/4/BAUD))>>8;
    T4T3M |= 0x20;              //定时器4为1T模式
    T4T3M |= 0x80;              //定时器4开始计时
    IE2 = 0x10;                 //使能串口4中断
    EA = 1;

    SendString("STC15F4K60S4\r\nUart4 Test !\r\n");
    while(1);
}

/*----------------------------
UART4 中断服务程序
-----------------------------*/
void Uart4() interrupt 18 using 1
{
    if (S4CON & S4RI)
    {
        S4CON &= ~S4RI;         //清除S4RI位
        P0 = S4BUF;             //P0显示串口数据
        P2 = (S4CON & S4RB8);   //P2.2显示校验位
    }
    if (S4CON & S4TI)
    {
        S4CON &= ~S4TI;         //清除S4TI位
        busy = 0;               //清忙标志
    }
}

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

/*----------------------------
发送字符串
----------------------------*/
void SendString(char *s)
{
    while (*s)                  //检测字符串结束标志
    {
        SendData(*s++);         //发送当前字符
    }
}

发表于 2019-4-16 16:15:17 | 显示全部楼层
本帖最后由 SUPER_CRJ 于 2019-4-16 16:16 编辑

换个硬件试试,看楼主上个贴,好像问过了,帮顶下
发表于 2019-5-30 07:45:01 | 显示全部楼层
是不是感觉接收的时候有问题,发送的时候还行?但是实验的时候单字节收发正常,多字节收发老是丢字节?
发表于 2019-7-20 22:29:32 | 显示全部楼层
兄弟大胆用。这款最稳定,比STC8A好太多,哥们四串口同一工程全开妥妥滴。。
 楼主| 发表于 2019-7-20 22:44:18 | 显示全部楼层
myemcu 发表于 2019-7-20 22:29
兄弟大胆用。这款最稳定,比STC8A好太多,哥们四串口同一工程全开妥妥滴。。 ...


同样发现这个芯片比STC8A的芯片稳定很多,唯一的缺点就是端口太少了,最多的才48个脚,全部都用了,还不是太够。
发表于 2019-7-20 23:17:25 | 显示全部楼层
wxdn 发表于 2019-7-20 22:44
同样发现这个芯片比STC8A的芯片稳定很多,唯一的缺点就是端口太少了,最多的才48个脚,全部都用了,还不 ...

STC15W4K48S4-30I-LQFP64L2
发表于 2019-7-21 09:18:05 来自手机 | 显示全部楼层
楼上的兄弟们,STC8A有哪些不稳定啊,说出来大家都了解下。
发表于 2019-7-21 09:38:35 | 显示全部楼层
myemcu 发表于 2019-7-20 22:29
兄弟大胆用。这款最稳定,比STC8A好太多,哥们四串口同一工程全开妥妥滴。。 ...

STC8都不稳定?还是只有STC8A不稳定?请教有哪些坑。
发表于 2019-7-21 11:45:05 | 显示全部楼层
已验证,程序没问题。
接收不到应该是基本的问题有差错:
1 确认串口是否是串口4,P02 P03?
2 波特率是否115200?
3 程序仅仅上电后1s内输出STC15F4K60S4 Uart4 Test !,超时不再输出。
4 串口线接触不良。
发表于 2019-7-21 13:21:10 | 显示全部楼层
vtte 发表于 2019-7-21 09:18
楼上的兄弟们,STC8A有哪些不稳定啊,说出来大家都了解下。

STC8A的ADC很棒,但多串口这点,我选15W4K。。
发表于 2019-7-21 17:10:08 | 显示全部楼层
void send(u8 temp)
{
  S4BUF=temp;
}
void send(u8 temp)
{
ACC=temp;
  S4BUF=ACC;  //这样好像会出问题
}
发表于 2019-7-23 15:40:08 | 显示全部楼层
wxdn 发表于 2019-7-20 22:44
同样发现这个芯片比STC8A的芯片稳定很多,唯一的缺点就是端口太少了,最多的才48个脚,全部都用了,还不 ...

有LQFP64的,比LQFP48的贵三四毛钱
发表于 2019-8-8 15:06:10 | 显示全部楼层
myemcu 发表于 2019-7-20 22:29
兄弟大胆用。这款最稳定,比STC8A好太多,哥们四串口同一工程全开妥妥滴。。 ...

兄弟,你这个STC15的4串口全开的代码方便参考一下不?
发表于 2019-8-8 17:59:12 | 显示全部楼层
newywx 发表于 2019-8-8 15:06
兄弟,你这个STC15的4串口全开的代码方便参考一下不?

开发板开发中,做好统一开圆 。。
发表于 2019-8-8 18:19:04 | 显示全部楼层
myemcu 发表于 2019-8-8 17:59
开发板开发中,做好统一开圆 。。

开发板上4个串口也都用上了?估计多久能好,着急试这4个串口啊
发表于 2019-8-9 13:17:11 来自手机 | 显示全部楼层
887799 发表于 2019-7-21 09:38
STC8都不稳定?还是只有STC8A不稳定?请教有哪些坑。

我们遇过一个坑,用3.3V供电,然后开外部总线,写的那个管脚信号出不来,用5V供电同样的程序没问题。
发表于 2019-8-9 13:18:47 来自手机 | 显示全部楼层
887799 发表于 2019-7-21 09:38
STC8都不稳定?还是只有STC8A不稳定?请教有哪些坑。

还有一个条件,晶振是22.1184MHz,信号出不来,换11.0592就也正常
发表于 2019-8-9 13:20:43 来自手机 | 显示全部楼层
myemcu 发表于 2019-7-21 13:21
STC8A的ADC很棒,但多串口这点,我选15W4K。。

8A串口什么问题?我们一直用着没发现问题呀,4个同时用的
发表于 2019-8-9 13:48:58 | 显示全部楼层
STC8系列4个串口全双工同时中断收发测试例程.rar (15.52 KB, 下载次数: 8)
发表于 2019-8-9 22:59:47 | 显示全部楼层
jssd 发表于 2019-8-9 13:20
8A串口什么问题?我们一直用着没发现问题呀,4个同时用的

我这边不知啥原因,8a的u2切了才能用。
发表于 2019-8-10 19:26:59 | 显示全部楼层
wxdn 发表于 2019-7-20 22:44
同样发现这个芯片比STC8A的芯片稳定很多,唯一的缺点就是端口太少了,最多的才48个脚,全部都用了,还不 ...

STC15W4K32S4有64脚的。
发表于 2019-8-10 19:34:31 | 显示全部楼层
楼主可以直接下载编译后的HEX文件测试。

STC8A8K系列的4串口也很好啊,豪赌产品我都转STC8A8K了,原因如下:
1、15路12位ADC新跟那个非常好,线性误差基本在2个字之内,噪声(抖动)非常小,0点误差也小(一般是0)。
2、4路独立双工串口。
3、8路15位增强型PWM比15W4K的还用得多。
4、PCA有4路,用于驱动4个步进电机(带驱动器的)很方便。或者,4路PCA可以用做PWM直接驱动一个带细分的2相混合驱动步进电机(一般1、2、4、8、16、32等等细分)。
5、SRAM有8K。
6、速度比15系列还快(特别是IO操作)。
友情提示:标题不合格、重复发帖,将会被封锁ID。详情请参考:论坛通告:封锁ID、获得注册邀请码、恢复被封ID、投诉必读
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|阿莫电子论坛(原ourAVR/ourDEV) ( 公安备案:44190002001997(交互式论坛) 工信部备案:粤ICP备09047143号 )

GMT+8, 2019-8-19 02:25

阿莫电子论坛, 原"中国电子开发网"

© 2004-2018 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表