找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1443|回复: 3
打印 上一主题 下一主题
收起左侧

stc15w404as单片机串口发送程序问题

[复制链接]
跳转到指定楼层
楼主
ID:849913 发表于 2021-11-18 15:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这个程序运行后 串口调试助手应该能收到10个“m”才对 可是实际只能收到一个  弄了好长时间也搞不懂 希望各位大神能指导一下 十分感谢!
单片机源程序如下:
  1. #include "stc15.h"
  2. # include <intrins.h>
  3. #define S1_S0 0x40              //P_SW1.6
  4. #define S1_S1 0x80              //P_SW1.7
  5. #define FOSC 11059200L          //系统频率
  6. #define BAUD 4800             //串口波特率
  7. sbit k=P1^2;
  8. unsigned char i;

  9. void delay(unsigned int i)
  10. {
  11.         while(i--);
  12. }

  13. void qie_huan()           //串口引脚选择函数
  14. {
  15.       
  16. /*   ACC = P_SW1;
  17.     ACC &= ~(S1_S0 | S1_S1);    //S1_S0=0 S1_S1=0
  18.     P_SW1 = ACC;                //(P3.0/RxD, P3.1/TxD)
  19. */

  20.   ACC = P_SW1;
  21.   ACC &= ~(S1_S0 | S1_S1);    //S1_S0=1 S1_S1=0
  22.   ACC |= S1_S0;               //(P3.6/RxD_2, P3.7/TxD_2)
  23.   P_SW1 = ACC;  
  24. /*  
  25.   ACC = P_SW1;
  26.   ACC &= ~(S1_S0 | S1_S1);    //S1_S0=0 S1_S1=1
  27.   ACC |= S1_S1;               //(P1.6/RxD_3, P1.7/TxD_3)
  28.   P_SW1 = ACC;  
  29. */
  30. }

  31. void main()
  32. {
  33.     P0M0 = 0x00;
  34.     P0M1 = 0x00;
  35.     P1M0 = 0x00;
  36.     P1M1 = 0x00;
  37.     P2M0 = 0x00;
  38.     P2M1 = 0x00;
  39.     P3M0 = 0x00;
  40.     P3M1 = 0x00;
  41.     P4M0 = 0x00;
  42.     P4M1 = 0x00;
  43.     P5M0 = 0x00;
  44.     P5M1 = 0x00;
  45.     P6M0 = 0x00;
  46.     P6M1 = 0x00;
  47.     P7M0 = 0x00;
  48.     P7M1 = 0x00;
  49.     qie_huan();

  50.         SCON = 0x50;
  51.     T2L = (65536 - (FOSC/4/BAUD));   //设置波特率重装值
  52.     T2H = (65536 - (FOSC/4/BAUD))>>8;
  53.     AUXR = 0x14;                //T2为1T模式, 并启动定时器2
  54.     AUXR |= 0x01;               //选择定时器2为串口1的波特率发生器
  55.     ES = 1;                     //使能串口1中断
  56.     EA = 1;

  57.   while(1)
  58.   {
  59.     if(k==0)
  60.         {
  61.                 delay(1000);
  62.                 if(k==0)
  63.                 {
  64.                                         for(i=0;i<10;i++)
  65.                        {
  66.                                       SBUF='m';
  67.                             }
  68.                                 while(!k);      
  69.                 }
  70.         }


  71.   }
  72.       

  73. }

  74. /*----------------------------
  75. UART 中断服务程序
  76. -----------------------------*/
  77. void Uart() interrupt 4
  78. {
  79.     if (RI)
  80.     {
  81.         RI = 0;                 //清除RI位
  82.         P0 = SBUF;              //P0显示串口数据

  83.     }
  84.     if (TI)
  85.     {
  86.         TI = 0;                 //清除TI位

  87.     }
  88. }
复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:401564 发表于 2021-11-18 16:42 | 只看该作者
串口发送之后是要等待发送完成的
大概是这样的
void Uart1_Isr() interrupt 4        //串口1中断函数,这里要参考数据手册来编写代码
{
             
        if(TI)                                          //如果是发送中断触发,就处理发送中断
                   {                          
                         TI=0;                           //发送中断
                        busy=0;
                }  
        if(RI)
                {
                        RI=0;               
                }       
}

void Send_Out_COM(unsigned char COM)        //发送一个字节数据
{
        while(busy);                                                //等待上次发送完成,Busy在串口2完成发送后清除       
        busy=1;
        SBUF=COM;       
}
回复

使用道具 举报

板凳
ID:213173 发表于 2021-11-18 21:12 | 只看该作者
  1. #include "stc15.h"
  2. #include <intrins.h>
  3. #define S1_S0 0x40              //P_SW1.6
  4. #define S1_S1 0x80              //P_SW1.7
  5. #define FOSC 11059200L          //系统频率
  6. #define BAUD 4800             //串口波特率
  7. sbit k=P1^2;
  8. unsigned char i;

  9. void delay(unsigned int i)
  10. {
  11.         while(i--);
  12. }

  13. void qie_huan()           //串口引脚选择函数
  14. {
  15.   ACC = P_SW1;
  16.   ACC &= ~(S1_S0 | S1_S1);    //S1_S0=1 S1_S1=0
  17.   ACC |= S1_S0;               //(P3.6/RxD_2, P3.7/TxD_2)
  18.   P_SW1 = ACC;  
  19. }

  20. void main()
  21. {
  22.         P0M0 = 0x00;
  23.         P0M1 = 0x00;
  24.         P1M0 = 0x00;
  25.         P1M1 = 0x00;
  26.         P2M0 = 0x00;
  27.         P2M1 = 0x00;
  28.         P3M0 = 0x00;
  29.         P3M1 = 0x00;
  30.         P4M0 = 0x00;
  31.         P4M1 = 0x00;
  32.         P5M0 = 0x00;
  33.         P5M1 = 0x00;
  34.         P6M0 = 0x00;
  35.         P6M1 = 0x00;
  36.         P7M0 = 0x00;
  37.         P7M1 = 0x00;
  38.         qie_huan();

  39.         S2CON = 0x50;                //8位数据,可变波特率
  40.         AUXR |= 0x04;                //定时器时钟1T模式
  41.         T2L = 0xE0;                //设置定时初始值
  42.         T2H = 0xFE;                //设置定时初始值
  43.         AUXR |= 0x10;                //定时器2开始计时

  44.         while(1)
  45.         {
  46.                 if(k==0)
  47.                 {
  48.                         delay(1000);
  49.                         if(k==0)
  50.                         {
  51.                                 for(i=0;i<10;i++)
  52.                                 {
  53.                                         SBUF='m';
  54.                                         while(!TI);
  55.                                         TI=0;
  56.                                 }
  57.                         }
  58.                 }
  59.         }
  60. }
复制代码
回复

使用道具 举报

地板
ID:849913 发表于 2021-11-19 14:59 | 只看该作者
谢谢 已经解决了 按照2楼大师的办法  3楼大师的做法是查询方法也好用 多谢了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

Powered by 单片机教程网

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