找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STC15W408AS单片机串口通信 不成功

  [复制链接]
跳转到指定楼层
楼主
谁帮我看看怎么回事,我想通过按钮IN1 的开关来控制串口发送一组数组命令
keil debug 的时候  看到TBUF 也是每个数组都发了

单片机源程序如下:
  1. //*********************************************************************/
  2. #include "STC15W408AS.h"
  3. #include <intrins.H>
  4. #define uchar unsigned char //宏定义字符型变量
  5. #define uint  unsigned int    //宏定义整型变量
  6. /********************************************************************
  7.                             波特率设定
  8. #define BAUD 0XFE80  //9600bps@ 11.0592MHZ


  9. uchar dat; //用于存储单片机接收发送缓冲寄存器SBUF里面的内容

  10.         sbit IN1 = P1^2;            /*单片机1.2引脚检测IN1是否动作*/
  11.        sbit IN2 = P1^3;            /*单片机1.3引脚检测IN2是否动作*/
  12.        sbit IN3 = P1^4;            /*单片机1.4引脚检测IN3是否动作*/
  13.        sbit IN4 = P1^5;            /*单片机1.5引脚检测IN4是否动作*/
  14.        sbit IN5 = P1^6;            /*单片机1.6引脚检测IN5是否动作*/
  15.        sbit IN6 = P1^7;            /*单片机1.7引脚检测IN5是否动作*/
  16.        sbit IN7 = P5^4;            /*单片机5.4引脚检测IN5是否动作*/
  17.        sbit IN8 = P5^5;            /*单片机5.5引脚检测IN5是否动作*/
  18.       
  19.   sbit COM1 = P3^7;          /*单片机3.7引脚控制继电器COM1*/
  20.   sbit COM2 = P3^6;          /*单片机3.6引脚控制继电器COM2*/
  21.   sbit COM3 = P3^5;          /*单片机3.5引脚控制继电器COM3*/
  22.   sbit COM4 = P3^4;          /*单片机3.4引脚控制继电器COM4*/
  23.     bit bz1=0;
  24.     bit bz2=0;
  25.     bit bz3=0;
  26.     bit bz4=0;
  27.     bit bz5=0;
  28.     bit bz6=0;
  29.     bit bz7=0;
  30.     bit bz8=0;
  31. /********************************************************************
  32.                             定义特殊寄存器
  33. *********************************************************************/
  34. sbit RXB=P3^0;
  35. sbit TXB=P3^1;
  36. /********************************************************************
  37.                            定义数据类型
  38. *********************************************************************/
  39. uchar TBUF,RBUF;
  40. uchar TDAT,RDAT;
  41. uchar TCNT,RCNT;
  42. uchar TBIT,RBIT;
  43. uint TING,RING;
  44. uint TEND,REND;

  45. void UART_INIT(); //声明函数

  46. uchar t,r;          //定义数据类型
  47. uchar but;      //数据存储数组

  48. uchar code DisPlayOn[21]=
  49. {0x01, 0x30 ,0x41 ,0x30 ,0x41 ,0x30 ,0x43 ,0x02 ,0x43 ,0x32 ,0x30 ,0x33 ,0x44 ,0x36 ,0x30 ,0x30 ,0x30 ,0x31 ,0x03 ,0x73 ,0x0d};
  50. // 0A0A0CC203D60001s       开机
  51. uchar code DisPlayOff[21]=
  52. {0x01, 0x30 ,0x41 ,0x30 ,0x41 ,0x30 ,0x43 ,0x02 ,0x43 ,0x32 ,0x30 ,0x33 ,0x44 ,0x36 ,0x30 ,0x30 ,0x30 ,0x34 ,0x03 ,0x76 ,0x0d};
  53. // 0A0A0CC203D60004v    关机



  54. /********************************************************************
  55.                             延时函数
  56. *********************************************************************/
  57. void delay(uchar t)
  58. {
  59.   uchar i,j;
  60.    for(i=0;i<t;i++)
  61.    {
  62.         for(j=130;j>0;j--);
  63.      { ;
  64.      }
  65.    }
  66. }
  67. /****************发送函数*********************/
  68. void senduart2(char* str)
  69. {   
  70.      uchar i;
  71.             if(TEND)      //允许发送
  72.             {
  73.               TEND=0;
  74.                for(i=0;i<21;i++)
  75.                 {
  76.                   TBUF=str[i];
  77.                 }
  78.                   TING=1;
  79.             }
  80.             while(!TEND);
  81. }
  82. /********************************************************************
  83.                             主函数
  84. *********************************************************************/
  85. void main()
  86. {  
  87. TMOD=0X00;       //定时器T0设定
  88. AUXR=0X80;       //辅助寄存器
  89. TL0=BAUD;       //十六位寄存器
  90. TH0=BAUD>>8;   //十六位寄存器
  91. TR0=1;           //开定时器
  92. ET0=1;
  93. PT0=1;
  94. EA=1;           //开总中断
  95. UART_INIT();   //串口初始化
  96. while(1)       //无线循环
  97. {
  98. if((IN1==0)&&(bz1==0))
  99. {
  100.   delay(10);
  101.   if(IN1==0)
  102.   {
  103.      bz1=1;
  104.      senduart2(DisPlayOn);
  105.   }
  106. }
  107. }
  108. }

  109. /********************************************************************
  110.                             定时器T0
  111. *********************************************************************/
  112. void tm0()interrupt 1 using 1
  113. {
  114. if(RING)
  115.   {
  116.    if(--RCNT==0)
  117.     {
  118.      RCNT=3;
  119.      if(--RBIT==0)
  120.         {
  121.          RBUF=RDAT;
  122.          RING=0;
  123.          REND=1;
  124.         }
  125.         else
  126.         {
  127.          RDAT>>=1;
  128.          if(RXB)RDAT|=0X80;
  129.         }

  130.     }
  131.   }
  132.     else if(!RXB)
  133.     {
  134.      RING=1;
  135.      RCNT=4;
  136.      RBIT=9;
  137.     }
  138.     if(--TCNT==0)
  139.     {
  140.     TCNT=3;
  141.     if(TING)
  142.     {
  143.       if(TBIT==0)
  144.       {
  145.       TXB=0;
  146.       TDAT=TBUF;
  147.       TBIT=9;
  148.       }
  149.       else
  150.       {
  151.       TDAT>>=1;
  152.       if(--TBIT==0)
  153.       {
  154.        TXB=1;
  155.        TING=0;
  156.        TEND=1;
  157.       }
  158.       else
  159.       {
  160.       TXB=CY;
  161.       }
  162.       }
  163.     }
  164.     }
  165. }
  166. /********************************************************************
  167.               功能:串口初始化,波特率9600,方式1
  168. *********************************************************************/
  169. void UART_INIT()
  170. {
  171. TING=0;
  172. RING=0;

  173. TEND=1;
  174. REND=0;

  175. TCNT=0;
  176. RCNT=0;
  177. }

  178. /********************************************************************
  179.                             结束
  180. *********************************************************************/
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:213173 发表于 2019-9-18 08:39 | 只看该作者
给你一个STC408AS基本的串口收发示例


  1. #include <STC15F2K60S2.H>

  2. unsigned char i;
  3. bit flag=0;
  4. /*----------------------------
  5.                          串口初始化
  6. -----------------------------*/
  7. void UartInit(void)                //9600bps@11.0592MHz
  8. {
  9.         SCON = 0x50;                //8位数据,可变波特率
  10.         AUXR |= 0x40;                //定时器1时钟为Fosc,即1T
  11.         AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
  12.         TMOD &= 0x0F;                //设定定时器1为16位自动重装方式
  13.         TL1 = 0xE0;                        //设定定时初值
  14.         TH1 = 0xFE;                        //设定定时初值
  15.         ET1 = 0;                                //禁止定时器1中断
  16.         TR1 = 1;                                //启动定时器1
  17.         EA = 1;                                //开总中断
  18.         ES = 1;                                //开串口接收中断
  19. }

  20. void main()
  21. {
  22.         UartInit();
  23.         while(1)
  24.         {
  25.                 if(flag)
  26.                 {
  27.                         flag=0;                //完成标志清0
  28.                         ES = 0;                //关串口接收中断
  29.                         SBUF=i;                //发送收到的数据
  30.                         while(!TI);        //等待发送结束
  31.                         TI=0;                        //发送中断请求标志位清0
  32.                         ES = 1;                //开串口接收中断
  33.                 }
  34.         }
  35. }
  36. /*----------------------------
  37. UART 中断服务程序
  38. -----------------------------*/
  39. void Uart() interrupt 4
  40. {
  41.         RI = 0;        //清除RI位
  42.         i = SBUF;//读取收到的数据
  43.         flag=1;        //完成标志置1
  44. }
复制代码



回复

使用道具 举报

板凳
ID:516511 发表于 2019-9-18 21:50 | 只看该作者
wulin 发表于 2019-9-18 08:39
给你一个STC408AS基本的串口收发示例

按你给的列子,没收到
回复

使用道具 举报

地板
ID:516511 发表于 2019-9-18 22:07 | 只看该作者
wulin 发表于 2019-9-18 08:39
给你一个STC408AS基本的串口收发示例

按你程序,调试没成功!
回复

使用道具 举报

5#
ID:213173 发表于 2019-9-19 07:40 | 只看该作者
rockcmc2000 发表于 2019-9-18 22:07
按你程序,调试没成功!

这个程序是经过实物验证的,可能是你对串口助手不熟悉,操作不当。
回复

使用道具 举报

6#
ID:272119 发表于 2019-9-22 23:39 | 只看该作者
STC的串口一定没有问题,楼主看下一步步排查吧,有示波器最好用示波器查TX/RX信号
回复

使用道具 举报

7#
ID:256929 发表于 2019-9-25 23:45 | 只看该作者
#include <STC15F2K60S2.H>

typedef unsigned char BYTE;
typedef unsigned int WORD;

        WORD temp;
        bit flag=0;

//串口初始化函数

void UartInit(){          //时钟频率18.432MHZ         串口波特率115200
    SCON=0x50;                //8为数据,可变波特率
           T2L=0Xd8 ;                   //定时器初始值
        T2H=0xff;
        AUXR=0x15;                //串口1定时器2为波特率发生器,并启动定时器2.
        ES=1;                         //开启串口中断
        EA=1;                         //开启总中断
}


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

//串口中断服务程序

void Uart() interrupt 4 using 1
{

        RI=0;
        temp=SBUF;
        flag=1;
       
}
回复

使用道具 举报

8#
ID:585284 发表于 2019-9-26 09:34 | 只看该作者
wulin 发表于 2019-9-18 08:39
给你一个STC408AS基本的串口收发示例

这款单片机没有定时器1
回复

使用道具 举报

9#
ID:213173 发表于 2019-9-26 11:16 | 只看该作者
靳可 发表于 2019-9-26 09:34
这款单片机没有定时器1

你说的没错,STC15W408AS没有T1,我上面的示例是用的ISP15W4K58S4做的,这样不严谨。应该用T2做波特率发生器。向楼主及坛友们致歉。
用T2做波特率发生器串口初始化如下:
void UartInit(void)                //9600bps@11.0592MHz
{
        SCON = 0x50;                //8位数据,可变波特率
        AUXR |= 0x01;                //串口1选择定时器2为波特率发生器
        AUXR |= 0x04;                //定时器2时钟为Fosc,即1T
        T2L = 0xE0;                //设定定时初值
        T2H = 0xFE;                //设定定时初值
        AUXR |= 0x10;                //启动定时器2
        EA = 1;              //开总中断
        ES= 1;                   //开串口接收中断
}
回复

使用道具 举报

10#
ID:516511 发表于 2019-9-29 11:32 | 只看该作者
谢谢各位,,我已经解决了这个问题。
回复

使用道具 举报

11#
ID:230975 发表于 2019-9-30 10:40 | 只看该作者
你没有定义REN的值的啊。REN为1接收,为0不接收。在SCON里面。你按照WULIN师傅的指导,应该是可以的。
回复

使用道具 举报

12#
ID:560467 发表于 2019-10-2 12:30 | 只看该作者
有检查是不是频率不对么,这样子会产生乱码或者你引脚有没有接对????txd对rxd。。。rxd对txd
回复

使用道具 举报

13#
ID:560467 发表于 2019-10-2 12:30 | 只看该作者
有检查是不是频率不对么,这样子会产生乱码或者你引脚有没有接对????txd对rxd。。。rxd对txd
回复

使用道具 举报

14#
ID:639986 发表于 2019-11-12 13:18 | 只看该作者
rockcmc2000 发表于 2019-9-29 11:32
谢谢各位,,我已经解决了这个问题。

请问怎么解决的
回复

使用道具 举报

15#
ID:662183 发表于 2019-12-18 20:03 | 只看该作者
wulin 发表于 2019-9-18 08:39
给你一个STC408AS基本的串口收发示例

學習。目前正用得上
回复

使用道具 举报

16#
ID:667739 发表于 2019-12-18 20:28 | 只看该作者
看一下官方例程吧,最好
回复

使用道具 举报

17#
ID:637324 发表于 2020-2-18 13:20 | 只看该作者
我也遇到这个问题了,真的是STC15408AS没有定时器1,
感谢大家
回复

使用道具 举报

18#
ID:8977 发表于 2020-5-2 21:38 | 只看该作者
太坑了,我也遇到这个问题,我也怀疑是不是定时器1有什么问题,看了芯片手册,说有5个定时器
回复

使用道具 举报

19#
ID:619669 发表于 2020-6-16 13:40 | 只看该作者
孤独战士591 发表于 2019-9-25 23:45
#include

typedef unsigned char BYTE;

好蛋疼,搞了好久了用串口助手还是串口不通,收不到发不出,用了好几个STC15系列单片机都越来越不好用了
回复

使用道具 举报

20#
ID:619669 发表于 2020-6-16 13:44 | 只看该作者
孤独战士591 发表于 2019-9-25 23:45
#include

typedef unsigned char BYTE;

你这个我也试过了,这个408就是不行,我用的串口助手,相同程序改在52上可以
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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