打印
[STC单片机]

STC15W408AS串口通讯PC乱码

[复制链接]
4821|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mujian12|  楼主 | 2016-6-1 11:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STC15W408AS串口通讯PC乱码 发送和接收的不一样 大神们给提示下要改哪里啊
使用的是内部晶振  感觉是不是内部晶振的问题
以下代码(丝毫未动):

#include <15w408as.h>                                        //包含头文件

unsigned char date;
unsigned char recFlag;                                        //接收数据标识,0 未接收数据 1 接收数据

void init_serial();                                                //声明初始化函数
void send();                                                        //声明发送函数(MCU->PC)
void receive();                                                        //声明接收函数(PC->MCU)

main()
{

        init_serial();                                                //串口初始化
        IE=0;                                                                 //屏蔽中断
    while(1)
        {
            receive();                                                //调用两个函数实现收发扫描
            send();
        }
}
void init_serial()                                            //初始化串口
{                                  //定时器T2使用工作方式1,波特率9600bit/s
SCON=0X50;
AUXR|=0X04;
        T2L=0xa0;                                                     //设置初值
        T2H=0xfc;
        AUXR|=0X10;
        //TR1=1;                                                      //开始计时
        //PCON=0x00;                                                     //SMOD=0;
        //SCON=0x50;                                                    
        TI=1;
        EA=1;
        }
void send()                                                                //把接收到的内容原封不动发送出去
{
        if(TI==1)                                                     //检测输出是否READY
        {
                if(recFlag==1)                                     //是否接收过数据
                {
                        SBUF=date;                          //发送数据
                        recFlag=0;
                        TI=0;
                }
        }
}

void receive()
{
        if(RI==1)                                                    //检测是否有数据接收
        {
                date=SBUF;                                              //接收数据
                recFlag=1;                                     //设置接收标识符
                RI=0;                                                        //清除标志位
        }
}

相关帖子

沙发
mujian12|  楼主 | 2016-6-1 12:10 | 只看该作者
大神们 都在哪里

使用特权

评论回复
板凳
bkn1860| | 2016-6-1 12:59 | 只看该作者
检查一下波特率设置

使用特权

评论回复
地板
mujian12|  楼主 | 2016-6-1 14:09 | 只看该作者
波特率9600没错啊

使用特权

评论回复
5
mujian12|  楼主 | 2016-6-1 14:10 | 只看该作者
bkn1860 发表于 2016-6-1 12:59
检查一下波特率设置

波特率都是9600

使用特权

评论回复
6
mujian12|  楼主 | 2016-6-1 16:46 | 只看该作者
那个问题没解决换了下面这个就可以了  可是下面这个没有接收的部分 有大神帮忙写一个吗


#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 NONE_PARITY   //定义校验位

sfr AUXR  = 0x8e;               //辅助寄存器
sfr T2H   = 0xd6;               //定时器2高8位
sfr T2L   = 0xd7;               //定时器2低8位

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

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

sbit P22 = P2^2;

bit busy;

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

/*----------------------------
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++);         //发送当前字符
    }
}

void main()
{
    ACC = P_SW1;
    ACC &= ~(S1_S0 | S1_S1);    //S1_S0=0 S1_S1=0
    P_SW1 = ACC;                //(P3.0/RxD, P3.1/TxD)
#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 = (65536 - (FOSC/4/BAUD));   //设置波特率重装值
    T2H = (65536 - (FOSC/4/BAUD))>>8;
    AUXR = 0x14;                //T2为1T模式, 并启动定时器2
    AUXR |= 0x01;               //选择定时器2为串口1的波特率发生器
    ES = 1;                     //使能串口1中断
    EA = 1;

    SendString("STC15W408AS\r\nUart Test !\r\n");
    while(1) ;

}

使用特权

评论回复
7
nbldelnan| | 2016-6-1 16:58 | 只看该作者
中断不就是接收吗

使用特权

评论回复
8
chuanjiejoy| | 2016-6-3 15:23 | 只看该作者
本帖最后由 chuanjiejoy 于 2016-6-3 15:24 编辑

编辑了

使用特权

评论回复
9
chuanjiejoy| | 2016-6-3 15:46 | 只看该作者
#include "STC15.h"
#define uchar unsigned char
#define uint unsigned int
#define FOSC 11059200
#define BAUD 9600

uchar flag,date;
void INIT()
{
                SCON = 0x50;
                AUXR |= 0x10;
                T2L  = 65536-FOCS/BAUD/4;
                T2H  = (65536-FOSC/BAUD/4)>>8;
                ES   = 1;
                EA   = 1;
}


void Rcive() interrupt 4
{
                if(RI)
                                RI = 0;
                date   = SBUF;
                flag   = 1;
}

void main()
{
                        INIT();
                        while(1)
                        {
                                                if(flag==1)
                                                {
                                                                        flag = 0;
                                                                        ES   = 0;
                                                                        SBUF = date;
                                                                        while(!TI);
                                                                        TI   = 0;
                                                                        ES   = 1;
                                                }
                        }
}

不知道行不行,没试,可以看看,接收就是中断里啊

使用特权

评论回复
10
懒人| | 2016-6-3 16:47 | 只看该作者
带通讯使用内部震荡不好吧?那个稳定度是多少?还有温度漂移?
再:你确定内部是“晶振”?

使用特权

评论回复
11
menfiss| | 2016-6-3 18:22 | 只看该作者
发一些特定的字符,0x00,0xff, 0x0f,0x55,之类的,看哪一位出错了。再不行就用示波器捕捉。怀疑时钟不稳,可以设置一个定时翻转的脉冲。

使用特权

评论回复
12
FIOM| | 2016-6-23 12:00 | 只看该作者
怎么联系你了?

使用特权

评论回复
13
coody| | 2016-6-23 14:48 | 只看该作者
STC官方有各种例程啊

使用特权

评论回复
14
liuyimao485812| | 2016-6-26 09:10 | 只看该作者
定时器2的初始值设置不对吧。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

19

帖子

0

粉丝