求助!STC8A8K64S4A12串口通信问题

[复制链接]
2180|7
 楼主| 锡城筱凯 发表于 2020-8-27 19:32 | 显示全部楼层 |阅读模式
stc8a和电脑串口通信,用的是串口1 定时器1(16位自动装载),波特率也没有问题,硬件(TXD,RXD)连线也没有问题,但是电脑上接收的依旧是□?
uart.c代码:
  1. #include "uart.h"

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


  22. /*******************************************************************************
  23. * 函 数 名       : UART_Send_Byte
  24. * 函数功能                   : 发送一个字节的数据
  25. * 输    入       : unsigned char dat
  26. * 输    出             : 无
  27. *******************************************************************************/
  28. void UART_Send_Byte(unsigned char dat)
  29. {
  30.         ES=0;
  31.         SBUF = dat;
  32.         while(!TI);
  33.         TI=0;
  34.         ES=1;
  35. }
  36. /*******************************************************************************
  37. * 函 数 名       : UART_Send_String
  38. * 函数功能                   : 发送字符串
  39. * 输    入       : char *s
  40. * 输    出             : 无
  41. *******************************************************************************/
  42. void UART_Send_String(char *s)
  43. {
  44.         while (*s){                  //检测字符串结束标志
  45.             UART_Send_Byte(*s++);
  46.         }
  47. }

  48. /*******************************************************************************
  49. * 函 数 名       : UART1_Routine
  50. * 函数功能                   : 串口1中断
  51. * 输    入       : 无
  52. * 输    出             : 无
  53. *******************************************************************************/
  54. void UART1_Routine(void) interrupt  4
  55. {
  56.         unsigned char i = 0,temp;       
  57.         if (RI){            
  58.                 RI=0;  
  59.           temp = SBUF;
  60.                 UAR[i]=temp;                                                                //接收到的数据存入数组UAR中
  61.                 i++;
  62.         }
  63.         UART_Send_String(UAR);
  64. }

uart.h代码
  1. #ifndef _UART_H_
  2. #define _UART_H_

  3. #include <reg52.h>

  4. sfr UART_P_SW2      =   0XBA;
  5. sfr UART_P_SW1      =         0XA2;
  6. sfr AUXR                              =         0X8E;
  7. sfr P3M0                               =         0xB2;
  8. sfr P3M1                               =         0xB1;


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

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



  13. void Init_UART();
  14. void UART_Send_Byte(unsigned char dat);
  15. void UART_Send_String(char *s);
  16. #endif


主函数代码:
  1. void main(void)
  2. {
  3.         //Init_PWM();
  4.         Init_UART();
  5.         //UART_Send_String("Welcome to Uart");
  6.         //Set_PWM1_Value(0x100);
  7.         //Start_PWM();
  8.         while(1)
  9.         {
  10.                 UART_Send_Byte('1');
  11.                 delay(50000);
  12.         }               
  13. }
ayb_ice 发表于 2020-8-28 08:27 | 显示全部楼层
示波器拿出来
xyz549040622 发表于 2020-8-28 11:00 | 显示全部楼层
1.16进制接收到的字符时多少
2.关掉串口中断使用发送函数试试
3.没有调试,感觉你串口中断中使用阻塞发送不合适吧,会导致问题的。改中断发送试试。
资深技术 发表于 2020-8-28 20:12 | 显示全部楼层
这个官网有例程,我试过,肯定好用。
 楼主| 锡城筱凯 发表于 2020-8-29 13:32 | 显示全部楼层
xyz549040622 发表于 2020-8-28 11:00
1.16进制接收到的字符时多少
2.关掉串口中断使用发送函数试试
3.没有调试,感觉你串口中断中使用阻塞发送不 ...

找到问题所在了,我用的是内部晶振,看手册上说是24Mhz的,波特率计算出来应是115200的,但是电脑上用28800接收才正常,没找到原因
 楼主| 锡城筱凯 发表于 2020-8-29 13:39 | 显示全部楼层
资深技术 发表于 2020-8-28 20:12
这个官网有例程,我试过,肯定好用。

我用的是内部晶振,看手册上说是24Mhz的,波特率计算出来应是115200的,但是电脑上用28800接收才正常,没找到原因
cainiao518 发表于 2020-8-29 13:43 | 显示全部楼层
锡城筱凯 发表于 2020-8-29 13:39
我用的是内部晶振,看手册上说是24Mhz的,波特率计算出来应是115200的,但是电脑上用28800接收才正常,没 ...

或许算错了
 楼主| 锡城筱凯 发表于 2020-8-29 13:48 | 显示全部楼层

我用的是内部晶振,看手册上说是24Mhz的,波特率计算出来应是115200的,但是电脑上用28800接收才正常,没找到原因
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

15

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部