打印

求助!STC8A8K64S4A12串口通信问题

[复制链接]
1542|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
锡城筱凯|  楼主 | 2020-8-27 19:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
stc8a和电脑串口通信,用的是串口1 定时器1(16位自动装载),波特率也没有问题,硬件(TXD,RXD)连线也没有问题,但是电脑上接收的依旧是□?
uart.c代码:
#include "uart.h"

/*******************************************************************************
* 函 数 名       : Init_UART
* 函数功能                   : 初始化串口
* 输    入       : 无
* 输    出             : 无
*******************************************************************************/
void Init_UART()
{
        P3M1 = 0X00;                                                                                        //
        P3M0 = 0x00;
        //UART_P_SW1 = 0X00;                                                         //S1_S[1:0] =>RXD=P3.0   TXD=P3.1
        SCON = 0X50;                                                                                         //SM0=0,SM1=1 串口选择模式1 可变波特率8位数据方式
        TMOD = 0X00;                                                                                         //定时器1为模式0(16位自动重载)
        AUXR = 0x40;                                                                                         //定时器1为1T模式
        TL1 = (65536 - (FOSC/4/BAUD));           //设置波特率重装值
        TH1 = (65536 - (FOSC/4/BAUD))>>8;
        TR1 = 1;                                            //定时器1开始启动
        ES  = 1;                                                                                                         //串口中断允许位
        EA  = 1;                                                                                            //总中断允许位
}


/*******************************************************************************
* 函 数 名       : UART_Send_Byte
* 函数功能                   : 发送一个字节的数据
* 输    入       : unsigned char dat
* 输    出             : 无
*******************************************************************************/
void UART_Send_Byte(unsigned char dat)
{
        ES=0;
        SBUF = dat;
        while(!TI);
        TI=0;
        ES=1;
}
/*******************************************************************************
* 函 数 名       : UART_Send_String
* 函数功能                   : 发送字符串
* 输    入       : char *s
* 输    出             : 无
*******************************************************************************/
void UART_Send_String(char *s)
{
        while (*s){                  //检测字符串结束标志
            UART_Send_Byte(*s++);
        }
}

/*******************************************************************************
* 函 数 名       : UART1_Routine
* 函数功能                   : 串口1中断
* 输    入       : 无
* 输    出             : 无
*******************************************************************************/
void UART1_Routine(void) interrupt  4
{
        unsigned char i = 0,temp;       
        if (RI){            
                RI=0;  
          temp = SBUF;
                UAR[i]=temp;                                                                //接收到的数据存入数组UAR中
                i++;
        }
        UART_Send_String(UAR);
}

uart.h代码
#ifndef _UART_H_
#define _UART_H_

#include <reg52.h>

sfr UART_P_SW2      =   0XBA;
sfr UART_P_SW1      =         0XA2;
sfr AUXR                              =         0X8E;
sfr P3M0                               =         0xB2;
sfr P3M1                               =         0xB1;


#define P3PU (*(unsigned char volatile xdata *)0xFE13)        

#define FOSC 11059200UL          //系统时钟
#define BAUD 115200             //波特率设定115200,也可设置9600
extern char UAR[20]; //全局量



void Init_UART();
void UART_Send_Byte(unsigned char dat);
void UART_Send_String(char *s);
#endif


主函数代码:
void main(void)
{
        //Init_PWM();
        Init_UART();
        //UART_Send_String("Welcome to Uart");
        //Set_PWM1_Value(0x100);
        //Start_PWM();
        while(1)
        {
                UART_Send_Byte('1');
                delay(50000);
        }               
}

使用特权

评论回复

相关帖子

沙发
ayb_ice| | 2020-8-28 08:27 | 只看该作者
示波器拿出来

使用特权

评论回复
板凳
xyz549040622| | 2020-8-28 11:00 | 只看该作者
1.16进制接收到的字符时多少
2.关掉串口中断使用发送函数试试
3.没有调试,感觉你串口中断中使用阻塞发送不合适吧,会导致问题的。改中断发送试试。

使用特权

评论回复
地板
资深技术| | 2020-8-28 20:12 | 只看该作者
这个官网有例程,我试过,肯定好用。

使用特权

评论回复
5
锡城筱凯|  楼主 | 2020-8-29 13:32 | 只看该作者
xyz549040622 发表于 2020-8-28 11:00
1.16进制接收到的字符时多少
2.关掉串口中断使用发送函数试试
3.没有调试,感觉你串口中断中使用阻塞发送不 ...

找到问题所在了,我用的是内部晶振,看手册上说是24Mhz的,波特率计算出来应是115200的,但是电脑上用28800接收才正常,没找到原因

使用特权

评论回复
6
锡城筱凯|  楼主 | 2020-8-29 13:39 | 只看该作者
资深技术 发表于 2020-8-28 20:12
这个官网有例程,我试过,肯定好用。

我用的是内部晶振,看手册上说是24Mhz的,波特率计算出来应是115200的,但是电脑上用28800接收才正常,没找到原因

使用特权

评论回复
7
cainiao518| | 2020-8-29 13:43 | 只看该作者
锡城筱凯 发表于 2020-8-29 13:39
我用的是内部晶振,看手册上说是24Mhz的,波特率计算出来应是115200的,但是电脑上用28800接收才正常,没 ...

或许算错了

使用特权

评论回复
8
锡城筱凯|  楼主 | 2020-8-29 13:48 | 只看该作者

我用的是内部晶振,看手册上说是24Mhz的,波特率计算出来应是115200的,但是电脑上用28800接收才正常,没找到原因

使用特权

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

本版积分规则

3

主题

15

帖子

0

粉丝