微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > STC12C5204AD接收不到串口的数据,如何解决?

STC12C5204AD接收不到串口的数据,如何解决?

时间:10-02 整理:3721RD 点击:
#include<reg52.h>
unsigned char digtal1[10]={0xc0,0xf9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //0123456789
#define uchar unsigned char
uchar ch;
void delay1ms(x) //0.5ms          
{
  int y,z;
   for(y=x;y>0;y--)       
    for(z=60;z>0;z--);
}
void init_uart()
{
        TMOD=0X20;         //定时器/计算器工作模式寄存器
        TH1=0XFD;         //timer high 1
        TL1=0XFD;         //timer low  1
        TR1=1;             //定时器T1的运行控制位
        SCON=0X50;         //串行控制寄存器
        EA=1;        //CPU的总中断允许控制位
        ES=1;        //串行口中断允许位       
}
void main()
{
init_uart();
  while(1)
  {
            P3=ch;
         P2=digtal1[8];
         delay1ms(1000);
         }
}
void UART_interrupt() interrupt 4
{
if(RI)
    {
         RI=0;                 //接收中断请求标志位                 
         ch=SBUF;
       
  }       
}

用串口助手可以正确收发数据,LED显示也正常,可能是你的显示程序有问题。
#include<reg52.h>
#define uchar unsigned char
unsigned char digtal1[10]={0xc0,0xf9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //0123456789
uchar ch;
uchar flag;                //接收完成标志,
/*
void delay1ms(x) //0.5ms           
{
  int y,z;
   for(y=x;y>0;y--)        
    for(z=60;z>0;z--);
}
*/
void init_uart()
{
        TMOD=0X20;         //定时器/计算器工作模式寄存器
        TH1=0XFD;         //timer high 1
        TL1=0XFD;         //timer low  1
        TR1=1;             //定时器T1的运行控制位
        SCON=0X50;         //串行控制寄存器
        EA=1;                //CPU的总中断允许控制位
        ES=1;                //串行口中断允许位        
}
void main()
{
        init_uart();
        while(1)
        {
                if(flag==1)                //接收完成标志为1
                {
                        ES=0;                //关串口中断
                        flag=0;                //接收完成标志清0
                        SBUF=ch;                //发送数据
                        while(!TI);        //等待发送中断请求标志位为1
                        TI=0;                //发送中断请求标志位清0
                        ES=1;                //开串口中断
                }
                P1=~ch;                //LED显示收到的数据
//                P2=digtal1[8];
//                delay1ms(1000);
        }
}
void UART_interrupt() interrupt 4
{
        RI=0;     //接收中断请求标志位                 
        ch=SBUF;        //获取SBUF接收到的数据
        flag=1;        //接收完成标志置1      
}

虽然不懂,也要来帮顶顶。哈哈

期待大神们来解决

大神呀,我搞了一天,被你一下就搞定了,谢谢,真心谢谢!

大神呀,我搞了一天,被你一下就搞定了,谢谢,真心谢谢!

大神,请问为什么这里P3=~ch;要取反呢

大神,请问为什么这里P3=~ch;要取反呢

大神,请问为什么这里P3=~ch;要取反呢

大神,请问为什么这里P3=~ch;要取反呢

大神,请问为什么这里P3=~ch;要取反呢

因为我的实验板P1接LED,低电平LED亮,取反后就能正确显示2进制数。

原来如此,另外我还想问一下为什么非要那个接收完成标志呢?

你好,我有个问题不懂,如果串口发a8    单片机接受到的也是a8吗?

这是演示程序,因为是把接收到的数据返还给上位机(PC),以判断串口收发是否正确,所以必须等接收完成后才能转发。

那我的为什么发送的和接受的不一样的

串口收发分文本模式和HEX模式,文本模式发送a8返回的还是a8。HEX模式发送a8返回的是A8,发送a返回的是0A,发送8返回的是08,就是16进制表示的8位2进制数据。

能不能再帮我看一下,最后五行红色部分,串口送过来的数据放在p3就可以,放到p2就不可以了,这怎么解决。
void delay1ms(x) //0.5ms           
{
  int y,z;
   for(y=x;y>0;y--)        
    for(z=60;z>0;z--);
}void init_uart()
{
        TMOD=0x20;         //定时器/计算器工作模式寄存器
        TH1=0xFD;         //timer high 1
        TL1=0xFD;         //timer low  1
        TR1=1;             //定时器T1的运行控制位
        SCON=0x50;         //串行控制寄存器
        EA=1;        //CPU的总中断允许控制位
        ES=1;        //串行口中断允许位        
}
void UART_R() interrupt 4
{
          RI=0;
         Serial_digtal[ch++]=SBUF;
         if(ch==N)        //获取SBUF接收到的数据
         flag=1;        
        }
void main()
{
        init_uart();
        while(1)
        {
                if(flag==1)                //接收完成标志为1
                {
                        ES=0;                //关串口中断              
                                                for(ch=0;ch<N;ch++)
                                         {                           
                        SBUF=Serial_digtal[ch];                //发送数据
                        while(!TI);        //等待发送中断请求标志位为1
                        TI=0;  
                                                }              //发送中断请求标志位清0
                        ES=1;                         //开串口中断
                                                ch=0;  
                                            flag=0;                                   //接收完成标志清0            
                }
              //  P2=~Serial_digtal[0];
             //   P3=digtalW[2];
                   P3=~Serial_digtal[0];
                   P2=digtal1[6];                     
                delay1ms(10);
        }
}

虽然不懂,也要来帮顶顶

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
//unsigned char digtal1[10]={0xc0,0xf9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //0123456789
sbit dula=P2^6;                        //段锁存
sbit wela=P2^7;                        //位锁存
uchar code table[]={                //共阴数码管
        0x3f,0x06,0x5b,0x4f,
        0x66,0x6d,0x7d,0x07,
        0x7f,0x6f,0x77,0x7c,
        0x39,0x5e,0x79,0x71};
uchar swan,wan,qian,bai,shi,ge;
uchar ch;
uchar flag;                //接收完成标志,
uchar count=0;        //计数变量
void display1();//显示程序声明
void init_uart()
{
        TMOD=0X20;         //定时器/计算器工作模式寄存器
        TH1=0XFD;         //timer high 1
        TL1=0XFD;         //timer low  1
        TR1=1;             //定时器T1的运行控制位
        SCON=0X50;         //串行控制寄存器
        EA=1;                //CPU的总中断允许控制位
        ES=1;                //串行口中断允许位        
}
void main()
{
        init_uart();
        while(1)
        {
                if(flag==1)                //接收完成标志为1
                {
                        ES=0;                //关串口中断
                        flag=0;                //接收完成标志清0
                        SBUF=ch;                //发送数据
                        while(!TI);        //等待发送中断请求标志位为1
                        TI=0;                //发送中断请求标志位清0
                        ES=1;                //开串口中断
                }
                P1=~ch;                //P1接8位LED显示收到的数据
/*************数据分解***************/
                swan = ch/100000;                                // 十万位
                wan = (ch%100000)/10000;        // 万位
                qian = (ch%10000)/1000;                // 千位
                bai = (ch%1000)/100;                        // 百位
                shi = (ch%100)/10;                        // 十位
                ge = ch%10;                                                // 个位
                display1();                                //6位数码管显示程序
        }
}
void UART_interrupt() interrupt 4
{
        RI=0;     //接收中断请求标志位                 
        ch=SBUF;        //获取SBUF接收到的数据
        flag=1;        //接收完成标志置1      
}
void display1()//显示程序
{
        count++;
        if(count>=6)
                count=0;
        switch(count)                       
        {
                case 0:
                   dula=0;
                   P0=table[swan];                //显示十万位
                   dula=1;
                   dula=0;
               
                   wela=0;
                   P0=0x7e;
                   wela=1;
                   wela=0;
                break;
                case 1:                               
                   dula=0;
                   P0=table[wan];                //显示万位
                   dula=1;
                   dula=0;
                   wela=0;
                   P0=0x7d;
                   wela=1;
                   wela=0;
                break;
                case 2:                               
                   P0=table[qian];                //显示千位
                   dula=1;
                   dula=0;
               
                   P0=0x7b;
                   wela=1;
                   wela=0;
                break;
                case 3:                                       
                   P0=table[bai];                //显示百位
                   dula=1;
                   dula=0;
               
                   P0=0x77;
                   wela=1;
                   wela=0;
                break;
                case 4:       
                   P0=table[shi];                //显示十位
                   dula=1;
                   dula=0;
               
                   P0=0xef;
                   wela=1;
                   wela=0;
                break;
                case 5:       
                   P0=table[ge];                //显示个位
                   dula=1;
                   dula=0;
               
                   P0=0xdf;
                   wela=1;
                   wela=0;
                break;
        }
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top