找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

请教STC8G1K08A单片机串口程序发送正常,接收不正常

查看数: 7945 | 评论数: 16 | 收藏 1
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2022-1-11 16:16

正文摘要:

请大侠指点下: 串口为什么发送正常,接收却不正常呢? 单片机源程序如下: #include "STC8G.h" #include "intrins.h"   void UartInit(void)          ...

回复

ID:725306 发表于 2022-1-15 10:02

用的查询法,不需要EA=1;
ID:725306 发表于 2022-1-15 10:01
TEC 发表于 2022-1-14 11:00
你这个程序单片机没法工作的,单片机不能接收,也不能发送,单片机和上位机无法通信。发送成功和单片机没关 ...

原来上传的程序串口初始化中,P31 = 0; //PWM关 这一句不能写的。写了串口就收发不了数据了。
ID:725306 发表于 2022-1-15 09:38
188610329 发表于 2022-1-11 21:06
你知道不知道  P31 是用来干什么的么?
你一边要用  P31 发送串口, 一边还要反转  P31, 心不是一般的大阿 ...

大哥,就是这个问题 。。。。。 后来我调整了波特率为9600,可以正常收到数据了。因为用的事8脚的单片机,资源比较少,所以调试的时候想看看正常不。谢谢,贴吧是个好环境,大家都会帮助小白菜。
ID:625730 发表于 2022-1-14 11:00
你这个程序单片机没法工作的,单片机不能接收,也不能发送,单片机和上位机无法通信。发送成功和单片机没关系,是上位机给单片机发送了数据,但是单片机没法接收到。
ID:213173 发表于 2022-1-13 08:39

串口助手发送用HEX模式,接收用文本模式
  1. #include "STC8G.h"
  2. #include "intrins.h"
  3. /*
  4. void UartInit(void)                //115200bps@35MHz
  5. {
  6.         SCON = 0x50;                //8位数据,可变波特率
  7.         AUXR |= 0x40;                //定时器时钟1T模式
  8.         AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
  9.         TMOD &= 0x0F;                //设置定时器模式
  10.         TL1 = 0xB4;                //设置定时初始值
  11.         TH1 = 0xFF;                //设置定时初始值
  12.         ET1 = 0;                //禁止定时器%d中断
  13.         TR1 = 1;                //定时器1开始计时
  14. }*/
  15. void UartInit(void)                //115200bps@33.1776MHz
  16. {
  17.         SCON = 0x50;                //8位数据,可变波特率
  18.         AUXR |= 0x40;                //定时器时钟1T模式
  19.         AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
  20.         TMOD &= 0x0F;                //设置定时器模式
  21.         TL1 = 0xB8;                //设置定时初始值
  22.         TH1 = 0xFF;                //设置定时初始值
  23.         ET1 = 0;                //禁止定时器%d中断
  24.         TR1 = 1;                //定时器1开始计时
  25. }

  26. void GPI_Init(void)
  27. {
  28.         P0M0 = 0x00;
  29.         P0M1 = 0x00;
  30.         P1M0 = 0x00;
  31.         P1M1 = 0x00;
  32.         P2M0 = 0x00;
  33.         P2M1 = 0x00;
  34.         P3M0 = 0x00;
  35.         P3M1 = 0x00;
  36.         P4M0 = 0x00;
  37.         P4M1 = 0x00;
  38.         P5M0 = 0x00;
  39.         P5M1 = 0x00;
  40. //        P31 = 0; //PWM关
  41. }

  42. /* 串口发送字节数据函数 参数是你要发送的字节 */
  43. void UartSend_Data(unsigned char dat)
  44. {
  45.         SBUF = dat;  // 把要发送的数据给了SBUF寄存器
  46.         while(!TI);  // 等待数据发送完成
  47.         TI = 0;      // 清除发送完成标志位
  48. }
  49. void main()
  50. {
  51.         /* 定义一个8位变量 用于接收串口接收的字节 */
  52.         unsigned char x =0;       
  53.         /* IO设置*/
  54.         GPI_Init();       
  55.         UartInit(); // 串口初始化       
  56.         while (1)
  57.         {
  58. /*                SBUF = 0x01;  // 把要发送的数据给了SBUF寄存器
  59.                 while(!TI);  // 等待数据发送完成
  60.                 TI = 0;         
  61.                 if (TI)
  62.                 {
  63.                 TI = 0;     //清中断标志
  64.                 P31 = !P31; //测试PWM端口
  65.                 }*/
  66.                 if(RI)// 如果串口接收到数据
  67.                 {
  68.                         RI = 0;      //清中断标志
  69.                         x =SBUF;
  70.                         if (x == 0x01)
  71.                         {
  72.                                 P32 = !P32;  //翻转MOS管状态
  73.                                 UartSend_Data('l');
  74.                         }               
  75.                         if (x == 0x02)
  76.                         {
  77.                                 P33 = !P33;  //翻转led状态
  78.                                 UartSend_Data('m');
  79. //                                SBUF = 'm';  // 把要发送的数据给了SBUF寄存器
  80. //                                while(!TI);  // 等待数据发送完成
  81. //                                TI = 0;      // 清除发送完成标志位
  82.                         }               
  83.                 }
  84.         }
  85. }
复制代码
ID:25310 发表于 2022-1-12 15:46
EA=1 有吗?
ID:624769 发表于 2022-1-11 21:06
你知道不知道  P31 是用来干什么的么?
你一边要用  P31 发送串口, 一边还要反转  P31, 心不是一般的大阿……
ID:725306 发表于 2022-1-11 18:53
npn 发表于 2022-1-11 18:51
35Mhz/115200 不能被整除,你要用33.1776Mhz的晶振。

下面显示已自动调节为35.004MHz了呀
ID:725306 发表于 2022-1-11 18:52
  1. #include "STC8G.h"
  2. #include "intrins.h"

  3. void UartInit(void)                //115200bps@35MHz
  4. {
  5.         SCON = 0x50;                //8位数据,可变波特率
  6.         AUXR |= 0x40;                //定时器时钟1T模式
  7.         AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
  8.         TMOD &= 0x0F;                //设置定时器模式
  9.         TL1 = 0xB4;                //设置定时初始值
  10.         TH1 = 0xFF;                //设置定时初始值
  11.         ET1 = 0;                //禁止定时器%d中断
  12.         TR1 = 1;                //定时器1开始计时
  13. }
  14. void GPI_Init(void)
  15. {
  16.         P3M0 = 0x00;
  17.         P3M1 = 0x00
  18.         P31 = 0; //PWM关
  19. }

  20. /* 串口发送字节数据函数 参数是你要发送的字节 */
  21. void UartSend_Data(unsigned char dat)
  22. {
  23.         SBUF = dat;  // 把要发送的数据给了SBUF寄存器
  24.         while(!TI);  // 等待数据发送完成
  25.         TI = 0;      // 清除发送完成标志位
  26. }
  27. void main()
  28. {
  29.         /* 定义一个8位变量 用于接收串口接收的字节 */
  30.         unsigned char x =0;
  31.        
  32.         /* IO设置*/
  33.         GPI_Init();
  34.                
  35.         UartInit(); // 串口初始化

  36.         while (1)
  37.         {
  38.                 SBUF = 0x01;  // 把要发送的数据给了SBUF寄存器
复制代码


ID:57657 发表于 2022-1-11 18:51
35Mhz/115200 不能被整除,你要用33.1776Mhz的晶振。
ID:725306 发表于 2022-1-11 18:47
第一次用,不太熟悉帖子版面
ID:725306 发表于 2022-1-11 18:47
代码格式显示是乱的,  我重新补下
ID:725306 发表于 2022-1-11 18:46
  1. #include "STC8G.h"
  2. #include "intrins.h"

  3. void UartInit(void)                //115200bps@35MHz
  4. {
  5.         SCON = 0x50;                //8位数据,可变波特率
  6.         AUXR |= 0x40;                //定时器时钟1T模式
  7.         AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
  8.         TMOD &= 0x0F;                //设置定时器模式
  9.         TL1 = 0xB4;                //设置定时初始值
  10.         TH1 = 0xFF;                //设置定时初始值
  11.         ET1 = 0;                //禁止定时器%d中断
  12.         TR1 = 1;                //定时器1开始计时
  13. }

  14. void GPI_Init(void)
  15. {
  16.           P0M0 = 0x00;
  17.     P0M1 = 0x00;
  18.     P1M0 = 0x00;
  19.     P1M1 = 0x00;
  20.     P2M0 = 0x00;
  21.     P2M1 = 0x00;
  22.     P3M0 = 0x00;
  23.     P3M1 = 0x00;
  24.     P4M0 = 0x00;
  25.     P4M1 = 0x00;
  26.     P5M0 = 0x00;
  27.     P5M1 = 0x00;
  28.     P31 = 0; //PWM关
  29. }

  30. /* 串口发送字节数据函数 参数是你要发送的字节 */
  31. void UartSend_Data(unsigned char dat)
  32. {
  33.         SBUF = dat;  // 把要发送的数据给了SBUF寄存器
  34.         while(!TI);  // 等待数据发送完成
  35.         TI = 0;      // 清除发送完成标志位
  36. }
  37. void main()
  38. {
  39.                 /* 定义一个8位变量 用于接收串口接收的字节 */
  40.                 unsigned char x =0;
  41.        
  42.                 /* IO设置*/
  43.                 GPI_Init();
  44.                
  45.                 UartInit(); // 串口初始化

  46.     while (1)
  47.                 {
  48.                         SBUF = 0x01;  // 把要发送的数据给了SBUF寄存器
  49.                                                                 while(!TI);  // 等待数据发送完成
  50.                                                                 TI = 0;  
  51.                        
  52.                                 if (TI)
  53.                                 {
  54.                                                 TI = 0;     //清中断标志
  55.                                                 P31 = !P31; //测试PWM端口
  56.                                 }
  57.                                 if (RI)// 如果串口接收到数据
  58.                                 {
  59.                                                 RI = 0;      //清中断标志
  60.                                                 x =SBUF;
  61.                                                 if (x == 0x01)
  62.                                                 {
  63.                                                                 P31 = !P31;  //翻转MOS管状态
  64.                                                                 UartSend_Data('l');
  65.                                                 }               
  66.                                                 if (x == 0x02)
  67.                                                 {
  68.                                                                 P32 = !P32;  //翻转led状态
  69.                                                                 SBUF = 'm';  // 把要发送的数据给了SBUF寄存器
  70.                                                                 while(!TI);  // 等待数据发送完成
  71.                                                                 TI = 0;      // 清除发送完成标志位
  72.                                                 }               
  73.                                 }
  74.                 }
  75. }
复制代码

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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