打印
[STC单片机]

串口通信只能发送,接收不到数据的些许疑惑

[复制链接]
12437|43
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
                  如果大家有空的话,麻烦帮我看下咯。。一个人琢磨两天啦。= =                   最小单片机系统,stc15w408as,程序已经通过isp下载进去了,通过串口调试助手模拟是只能发送给单片机,单片机没有回复数据。
                  这是结果图片                  根据程序编写,应该是我这边发送几个数字它就返回几个数字啊。 usb跟单片机相连用的是网上的成品,有ch340G芯片的。
                  #include<reg51.h>
                  #include<intrins.h>
                  void main(void)
                   {
                        SCON=0x50;
                        PCON=0X00;
                        TMOD=0x20;
                        TH1=0x00;
                        TL1=0x00;
                        TR1=1;
                        EA=1;
                        ES=1;
                        while(1)
                           {

                                 }
                  }
                 void UART_SER(void)interrupt 4
                  {
                         unsigned char temp;
                         if(RI)
                          {
                            temp=SBUF;
                            RI=0;
                            SBUF= temp;
                          }
                        if(TI)
                         {
                            TI=0;
                         }
                            while(1);
                   }         



360截图-5153296.jpg (113.93 KB )

360截图-5153296.jpg

相关帖子

沙发
qq543538634|  楼主 | 2016-8-16 10:48 | 只看该作者
波特率也全试完了。。

360截图-6858093.jpg (107.57 KB )

360截图-6858093.jpg

使用特权

评论回复
板凳
joyme| | 2016-8-16 11:52 | 只看该作者
在中断里搞个“while(1); ”干嘛?

使用特权

评论回复
地板
yzjgod| | 2016-8-16 11:55 | 只看该作者
while(1)死在中断里了,接收不断嵌套,能有些反应。

使用特权

评论回复
5
ningling_21| | 2016-8-16 12:13 | 只看该作者
qq543538634 发表于 2016-8-16 10:48
波特率也全试完了。。

TH1=0x00;                      
 TL1=0x00;

你用的波特率是多少?
中断里是死循环?

使用特权

评论回复
6
qq543538634|  楼主 | 2016-8-16 13:57 | 只看该作者
ningling_21 发表于 2016-8-16 12:13
TH1=0x00;                      
 TL1=0x00;

TMOD = 0x20;                       
TH1 = 0xFD;                       
TL1 = 0xFD;       
中断函数改成
void UART_SER(void)interrupt 4
{
  unsigned char temp;
  if(RI)
  {
   temp=SBUF;
   RI=0;
   SBUF= temp;
   }
  if(TI)
   {
   TI=0;
   }
}         
..情况一样。。

360截图-18210250.jpg (195.89 KB )

360截图-18210250.jpg

使用特权

评论回复
7
heishe1989| | 2016-8-16 14:02 | 只看该作者
STC15W408AS根本就没有定时器1,所TH1和TL1就没有好嘛

使用特权

评论回复
8
qq543538634|  楼主 | 2016-8-16 14:03 | 只看该作者
heishe1989 发表于 2016-8-16 14:02
STC15W408AS根本就没有定时器1,所TH1和TL1就没有好嘛

啊!!!!
我去看看芯片手册

使用特权

评论回复
9
qq543538634|  楼主 | 2016-8-16 14:23 | 只看该作者
heishe1989 发表于 2016-8-16 14:02
STC15W408AS根本就没有定时器1,所TH1和TL1就没有好嘛

谢啦~原来15w408只有定时器0跟定时器2;
可是改成 TMOD = 0x02;                        // 定时器0工作于8位自动重载模式, 用于产生波特率
    TH0 = 0xFD;                                // 波特率9600  11.0592
    TL0 = 0xFD;       
然后是一样的结果。。

使用特权

评论回复
10
hanshaomin| | 2016-8-16 14:26 | 只看该作者
学习中,带后续

使用特权

评论回复
11
qq543538634|  楼主 | 2016-8-16 14:33 | 只看该作者
现在的程序是这样
#include<reg51.h>
#include<intrins.h>
unsigned int i;
void main(void)
{
    PCON=0X00;
    EA=1;
    ES=1;
    TMOD = 0x02;                        // 定时器0工作于8位自动重载模式, 用于产生波特率
    TH0 = 0xFD;                                // 波特率9600  11.0592
    TL0 = 0xFD;        
    SCON = 0x50;                        // 设定串行口工作方式
        TR0 = 1;
        ET0=1;                                // 启动定时器0
    while(1)
   {
   
   }
}
void UART_SER(void)interrupt 4
{
  unsigned char temp;
  if(RI)
  {
   temp=SBUF;
   RI=0;
   SBUF= temp;
   }
  if(TI)
   {
   TI=0;
   }
}         

会不会不是软件问题?

使用特权

评论回复
12
heishe1989| | 2016-8-16 14:45 | 只看该作者
qq543538634 发表于 2016-8-16 14:33
现在的程序是这样
#include
#include

不是软件问题,STC15W408AS的串口中断优先级是3,而不是4,把终端函数后边那个interrupt4 改成interrupt3就OK了

使用特权

评论回复
13
qq543538634|  楼主 | 2016-8-16 15:01 | 只看该作者
heishe1989 发表于 2016-8-16 14:45
不是软件问题,STC15W408AS的串口中断优先级是3,而不是4,把终端函数后边那个interrupt4 改成interrupt3 ...

依然 。。很沮丧

使用特权

评论回复
14
heishe1989| | 2016-8-16 15:06 | 只看该作者

你在主函数里单写 发送程序,不要再中断里发送试试,另外进入中断后要记得关中断,退出中断时再开;
发送函数 如下:
SBUF=temp;
while(TI==0);
TI=0;
记得将temp声明为全局变量

使用特权

评论回复
15
qq543538634|  楼主 | 2016-8-16 15:40 | 只看该作者
heishe1989 发表于 2016-8-16 15:06
你在主函数里单写 发送程序,不要再中断里发送试试,另外进入中断后要记得关中断,退出中断时再开;
发送 ...

#include<reg51.h>
#include<intrins.h>
unsigned int i;
unsigned char temp;
void main(void)
{
    PCON=0X00;
    EA=1;
    ES=1;
    TMOD = 0x02;                        // 定时器0工作于8位自动重载模式, 用于产生波特率
    TH0 = 0xFD;                                // 波特率9600  11.0592
    TL0 = 0xFD;        
    SCON = 0x50;                        // 设定串行口工作方式
        TR0 = 1;
        ET0=1;                                // 启动定时器0
    while(1)
{
   temp=SBUF;
   SBUF=temp;
   while(TI==0);
   TI=0;
   }
}        

  void UART_SER(void)interrupt 3
{      
    if(RI == 1)  RI = 0;
}

















使用特权

评论回复
16
qq543538634|  楼主 | 2016-8-16 15:46 | 只看该作者
ningling_21 发表于 2016-8-16 12:13
TH1=0x00;                       
TL1=0x00;

版主。。
#include<reg51.h>
#include<intrins.h>
unsigned int i;
unsigned char temp;
void main(void)
{
    PCON=0X00;
    EA=1;
    ES=1;
    TMOD = 0x02;                        // 定时器0工作于8位自动重载模式, 用于产生波特率
    TH0 = 0xFD;                                // 波特率9600  11.0592
    TL0 = 0xFD;        
    SCON = 0x50;                        // 设定串行口工作方式
    TR0 = 1;
    ET0=1;                                // 启动定时器0
    while(1)
{
   temp=SBUF;
   SBUF=temp;
   while(TI==0);
   TI=0;
   }
}        

  void UART_SER(void)interrupt 3
{      
    if(RI == 1)  RI = 0;
}

我这样改了还是不行

使用特权

评论回复
17
ningling_21| | 2016-8-16 16:14 | 只看该作者
qq543538634 发表于 2016-8-16 15:46
版主。。
#include
#include

初始化不对

试试这个初始化

void init_serial()         //初始化串口
 {      //定时器T2使用工作方式1,波特率9600bit/s,允许接收晶振33.1776  
SCON=0X50;  
AUXR|=0X04;  
T2L=0xa0;           //设置初值  
T2H=0xfc;  
AUXR|=0X10;  
//TR1=1;            //开始计时  
//PCON=0x00;           //SMOD=0;  
//SCON=0x50;            
 TI=1;  
EA=1;  
}

使用特权

评论回复
18
ningling_21| | 2016-8-16 16:15 | 只看该作者
本帖最后由 ningling_21 于 2016-8-16 16:49 编辑
qq543538634 发表于 2016-8-16 15:46
版主。。
#include
#include

使用内部振荡器还是外部晶振?
另:试试发送接收都用查询方式

使用特权

评论回复
19
qq543538634|  楼主 | 2016-8-16 16:28 | 只看该作者
ningling_21 发表于 2016-8-16 16:15
使用内部振荡器还是外部晶振?
另:这个芯片没有串口中断,发送接收都要用查询方式
...

是外接了一个11.0592的晶振

使用特权

评论回复
20
ningling_21| | 2016-8-16 16:44 | 只看该作者
qq543538634 发表于 2016-8-16 16:28
是外接了一个11.0592的晶振

只能用T2做串口波特率发生器,且要查询方式使用

使用特权

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

本版积分规则

3

主题

37

帖子

1

粉丝