打印

单片机串口问题

[复制链接]
909|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
卷卷虫|  楼主 | 2019-11-13 17:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
dirtwillfly| | 2019-11-13 22:04 | 只看该作者
没学过这个教程,不清楚。建议问下作者。
或者提供下更详细的信息。

使用特权

评论回复
板凳
icecut| | 2019-11-15 09:04 | 只看该作者
哈哈, 视频剪辑了? 发送出错了?反正你的怀疑是应该的

使用特权

评论回复
地板
卷卷虫|  楼主 | 2019-11-16 15:56 | 只看该作者
/*
在上位机上用串口调试助手发送一个字符X,
单片机收到字符后返回给上位机“I get X”,
串口波特率设为9600bps。
*/

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar flag,a,i;
uchar code table[]="I get";
void init()
{
   TMOD=0x20; //设定T1定时器工作方式2
   TH1=0xfd;  //T1定时器装初值
   TL1=0x20;  //T1定时器装初值
   TR1=1;           //启动T1定时器
  
   SM0=0;         //设定串口工作方式1
   SM1=1;
   REN=1;          //允许串口接收
    //SCON=0x50;  

   EA=1;         //        开总中断
   ES=1;           //开串口中断
}
void main()
{
   init();
   while(1)
   {
      if(flag==1)
          {
             ES=0;
                 for(i=0;i<6;i++)
                 {
                    SBUF=table[i];
                        while(!TI);
                        TI=0;
                 }         
                         //TI=0;
         //         EA=1;
                 //         
                 SBUF=a;
                  
                 while(!TI);
                 TI=0;
                 ES=1;
                 flag=0;
          }
   }
}

void ser()interrupt 4
{
   RI=0;
   a=SBUF;
   flag=1;
}
就是这个程序,运行结果是单片机只返回给上位机一个“I get ”,“X”变成了空格,不知道为什么,请大神解释一下,谢谢

使用特权

评论回复
5
tianxj01| | 2019-11-17 09:00 | 只看该作者
卷卷虫 发表于 2019-11-16 15:56
/*
在上位机上用串口调试助手发送一个字符X,
单片机收到字符后返回给上位机“I get X”,

TI RI 都能引起中断,你这里只处理a=SBUF;而没有判断RI TI那个中断,就导致结果混乱。
修改中断,判断只有RI时候,才执行a=SBUF。而Ti则直接跳过,结果就会非常确定了。

使用特权

评论回复
6
卷卷虫|  楼主 | 2019-11-17 19:14 | 只看该作者
请大佬明示,改了一下午也没改对

使用特权

评论回复
7
ningling_21| | 2019-11-17 21:40 | 只看该作者
tianxj01 发表于 2019-11-17 09:00
TI RI 都能引起中断,你这里只处理a=SBUF;而没有判断RI TI那个中断,就导致结果混乱。
修改中断,判断只 ...

数组有6个字符,第六个字符不可显示,可以这样改

for(i=0;i<5;i++)
                 {
                    SBUF=table;
                        while(!TI);
                        TI=0;
                 }         

其它都一样

使用特权

评论回复
8
卷卷虫|  楼主 | 2019-11-18 15:38 | 只看该作者
问题解决了!谢谢各位!

使用特权

评论回复
9
billy_2005| | 2019-11-18 16:35 | 只看该作者
一般调试串口,可以只发送16进制验证,比如0到FF。

使用特权

评论回复
10
卷卷虫|  楼主 | 2019-11-18 20:20 | 只看该作者
/*
按下矩阵键盘第一行时以1200bps发送1,2,3,4,
                        第二行时以2400bps发送5,6,7,8,
                        第三行以4800bps发送9,10,11,12 ,
                        第四行以9600bps发送13,14,15,16.
*/
#include<reg52.h>
#include<stdio.h>
#define uint unsigned int
#define uchar unsigned char
uchar flag,key;
void delay(uint xms)
{
        uint i,j;
        for(i=xms;i>0;i--)
                for(j=110;j>0;j--);
}
void key_scan()
{
        uchar temp;
        TR1=0;

        P3=0xfe;         //第一行
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {       
                delay(10);
                temp=P3;
                temp=temp&0xf0;
                if(temp!=0xf0)
                {
                        temp=P3;
                        TH1=0xe8;//波特率设置为1200bps
                        TL1=0xe8;       
                        switch(temp)
                        {
                                case 0xee:key=1;break;
                                case 0xde:key=2;break;
                                case 0xbe:key=3;break;
                                case 0x7e:key=4;break;
                        }
                        while(temp!=0xf0)
                        {
                                temp=P3;
                                temp=temp&0xf0;       
                        }
                        flag=1;
                }
        }

        P3=0xfd;        //第二行
        temp=0xfd;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
                delay(10);
                temp=P3;
                temp=temp&0xf0;
                if(temp!=0xf0)
                {
                        temp=P3;
                        TH1=0xf4;
                        TL1=0xf4;//波特率设置为2400bps
                        switch(temp)
                        {
                                case 0xed:key=5;break;
                                case 0xdd:key=6;break;
                                case 0xbd:key=7;break;
                                case 0x7d:key=8;break;       
                        }
                        while(temp!=0xf0)
                        {
                                temp=P3;
                                temp=temp&0xf0;       
                        }
                        flag=1;
                }
        }

        P3=0xfb;//第三行
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
                delay(10);
                temp=P3;
                temp=temp&0xf0;
                if(temp!=0xf0)
                {
                        temp=P3;
                        TH1=0xfa;
                        TL1=0xfa;//波特率设置为4800bps
                        switch(temp)
                        {       
                                case 0xeb:key=9;break;
                                case 0xdb:key=10;break;
                                case 0xbb:key=11;break;
                                case 0x7b:key=12;break;       
                        }
                        while(temp!=0xf0)
                        {
                                temp=P3;
                                temp=temp&0xf0;
                        }       
                        flag=1;
                }

        }

        P3=0xf7;//第四行
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
                delay(10);
                temp=P3;
                temp=temp&0xf0;
                if(temp!=0xf0)
                {
                        temp=P3;
                        TH1=0xfd;
                        TL1=0xfd;//波特率设置为9600bps
                        switch(temp)
                        {
                                case 0xe7:key=13;break;
                                case 0xd7:key=14;break;
                                case 0xb7:key=15;break;
                                case 0x77:key=16;break;
                        }
                        while(temp!=0xf0)
                        {
                                temp=P3;
                                temp=temp&0xf0;
                        }
                        flag=1;
                }
        }
        TR1=1;
}
void main()
{
        TMOD=0x20;//设置定时器1为工作方式2
        TH1=0xe8;//波特率设置为1200                          ???????????????????
        TH1=0xe8;                //????????????????????

       
        SM0=0;
        SM1=1;
        //REN=1;//????????????????????????允许串口接收

        EA=1;//????????????????????
        ES=1;//??????????????????
        while(1)
        {
                key_scan();
                P3=0xff;
                if(flag==1)
                {
                        flag=0;
                       
                        TI=1;                   //??????????????????
                        printf("%c",key); //????????????????

                //        SBUF=key;                //????????????????????
                        while(!TI);
                        TI=0;
                }
        }
}
按下第一行,第四行,也就是波特率为1200bps,9600bps时,还能显示出想要的结果,只是前面会出现一行“DF 9F 9F 9F 9F 9F”,第二行(2400bps)怎么按都没反应,按下第三行(4800bps)完全不受控制,是因为矩阵键盘与串口引脚冲突的问题吗,该怎么解决

使用特权

评论回复
11
卷卷虫|  楼主 | 2019-11-19 15:35 | 只看该作者
各位大佬,帮帮孩子吧

使用特权

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

本版积分规则

2

主题

7

帖子

0

粉丝