找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1608|回复: 2
收起左侧

我想咨询一个51串口通信为什么不能显示到数码管上

[复制链接]
ID:406900 发表于 2020-5-18 23:11 来自手机 | 显示全部楼层 |阅读模式
麻烦各位大佬帮我看看吧
#include<reg52.h>
#include<stdio.h>
#include<string.h>
#define uint unsigned int
#define uchar unsigned char
void    initSer();          //串口初始化  
uchar  sendFlag = 0;     //未发送数据时  
uchar  receFlag =0;     //未接受到数据时  
unsigned char dat;
char buf_string[4];  //定义数据包长度为15个字符
uint  xs;
uint  cc=0;
uint  us;
//uint  num=120;
uchar disbuffer[4];
sbit KEY = P3^2;
sbit KEY1 = P3^3;
sbit CLK=P3^7;        //ê±?óD?o?
sbit ST=P3^4;        //???ˉD?o?
sbit EOC=P3^5;        //×a???áê?D?o?
sbit OE=P3^6;        //ê?3?ê1?ü
sbit beep = P2^4;//zhuanhuan
sbit led = P2^5;
uchar dat,num,flag;//发送暂存变量
uchar LED_Buffer[3] = {0};      //从串口接收的数据
//uchar Buffer[2]={0};
uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar i=0,flag;
int bai,shi,ge;
int shuzi=0;
uchar rlen = 0;
uchar Buffer[10];
uchar ii;
uchar Receive_Buffer[10];
uchar Buf_Index = 0;
uint rnum=0;


#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar  bufr[]="------\r\n";//存放接收数据
uchar *prx=&bufr;//接收指针
bit str;  //接收完毕标志位
//段码
uchar code leddata[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

//延时函数
void delay( uint i)
{
        uint m,n;
        for(m=i;m>0;m--)
                for(n=90;n>0;n--);
}
//数码管显示函数
void led_display()
{
        uchar i;
        P2 = 0x01;
        for(i=0;i<4;i++)
        {       
                P0=0xff;
                P2 = _cror_(P2,1);
                P0 = leddata[bufr[i]-'0'];
                delay(2);
        }
}

//字符发送函数
void putchar(uchar data1)  
{
        SBUF = data1;             //将待发送的字符送入发送缓冲器
        while(!TI);                //等待发送完成
        TI = 0;                    //发送中断标志请0
}
//字符串发送函数
void putstring(uchar *dat)
{
  while(*dat != '\0')    //判断字符串是否发送完毕
{                         
   putchar(*dat);        //发送单个字符
   dat++;                //字符地址加1,指向先下一个字符
   delay(5);
}
}
//串口初始化函数
void serial_init()
{
        TMOD = 0x20;  //定时器工作方式2
        SCON = 0x50;  //串行口工作方式2
        PCON = 0x80; //SMOD = 1,波特率加倍
        TH1 = 0xfa;
        TL1 = 0xfa;        //波特率设置9600
        ES = 1;
        EA  = 1;//开总中断
}
void main()
{
        serial_init();
        TR1 = 1;
    putstring("Receiving from 8051...\r\n");         
        putstring("----------------------\r\n");
        delay(50);
        while(!str);//等待接收完毕
        while(1)
        {       
                P0=0xff;
                while(!str);
                led_display();
        }
}
void serial() interrupt 4
{
        if(RI!=1) return;//判断是否接收
        {       
                str = 0;
                ES = 0;
                *prx = SBUF; //接收存放数据
                putchar(*prx);
                RI = 0;
                prx++;        //指针自加
                if(*prx=='\0') //是否接收完成
                {
                        prx = &bufr;//指针初始化
                        str = 1; //标志位置1
                        putstring("\r\n");
                        putstring("translate over!\r\n");
                        ES = 1;
                        return;
                }
                ES = 1;
                return;         //退出中断
        }
}


void delay(uint i)                                                          //?óê±
{
        uint j;
        for(j=i;j>0;j--);
}
void delay_ms(unsigned int x)
{
        uchar i;
        while(x--)
        {
                 for(i=0;i<120;i++);
        }
}
          /*******************ADC?áè?******************/

void display(void)
{
        uchar codevalue[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
        0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x40};
        uchar chocode[]={0xf7,0xfb,0xfd,0xfe};
        uchar i=0,p,t;
        disbuffer[0]=(rnum%10);
        disbuffer[1]=(rnum%100/10);
        disbuffer[2]=(rnum/100);
        for(i=0;i<4;i++)
        {
                t=chocode[i];
                P2=t;
                p=disbuffer[i];
                t=codevalue[p];
                P0=t;
                delay(40);
        }
        P2=0xff;
}

void Timer0_INT() interrupt 1
{
        TH0=(65536-10)/256;
        TL0=(65536-10)%256;
        CLK=~CLK;
       
}



/********************************************************************
* 名称 : Com_Init()
* 功能 : 串口初始化,晶振11.0592,波特率9600,使能了串口中断
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Com_Init(void)
{
                 SCON = 0x50;       
     TMOD = 0x20;
     PCON = 0x00;
                    
     TH1 = 0xFd;    //设置波特率 9600
     TL1 = 0xFd;
          
     TR1 = 1;                //启动定时器1
                        ES = 1;                //开串口中断
                        EA = 1;                //开总中断               
}


void check_led()
{
if(rnum>200)
{
led=0;
}
else
{ led=1;}
}

char putchar(char c)
{
        SBUF = c;
        while(TI == 0);
        TI = 0;
        return c;
}

void SendString(char *s)
{
        while(*s)
        {
                putchar(*s);
                s++;
       
       
        }
}
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main()
{

       
        SCON = 0x50;
        TMOD = 0x21;
        PCON = 0x00;
        TH1  = 0xfd;
        TL1  = 0xfd;
//       
//        TMOD|=0X02;          
        TH0=(65536-10)/256;
        TL0=(65536-10)%256;
//       
////        EX0  = 1;
////        IT0  = 1;
        ES   = 1;   //  
        IP   = 0x10;
        TR1  = 1;
       
        TR0  = 1;
        OE=0;
        ST=0;
        ST=0;
        ST=1;
        ET0=1;   /**/
        EA   = 1;
//        TI=1;
        //delay_ms(300);
//delay_ms(500);
//delay_ms(1000);
//delay_ms(1000);
        while(1)
        {
        //        led=0;
#if 1
        delay_ms(10);
        if(Buf_Index>0) {
        if(Buf_Index < 4) {
//                        if(Buf_Index == 3)rnum = (Receive_Buffer[0]-'0')*100+(Receive_Buffer[1]-'0')*10+(Receive_Buffer[2]-'0');
//                        else if(Buf_Index == 2)rnum = (Receive_Buffer[0]-'0')*10+(Receive_Buffer[1]-'0');
//                        else rnum = (Receive_Buffer[0]-'0');
                        if(Buf_Index == 3)rnum = (Receive_Buffer[0]-48)*100+(Receive_Buffer[1]-48)*10+(Receive_Buffer[2]-48);
                        else if(Buf_Index == 2)rnum = (Receive_Buffer[0]-48)*10+(Receive_Buffer[1]-48);
                        else rnum = (Receive_Buffer[0]-48);
                if(rnum<256) {
               
                                SendString(Receive_Buffer);
                        for(ii=0;ii<sizeof(Receive_Buffer);ii++)Receive_Buffer[ii]=0;
                        Buf_Index=0;

               
                }
                else {
                                for(ii=0;ii<sizeof(Receive_Buffer);ii++)Receive_Buffer[ii]=0;
                        Buf_Index=0;
               
                }

        rnum = 0;
        }
        else {
                        for(ii=0;ii<sizeof(Receive_Buffer);ii++)Receive_Buffer[ii]=0;
                        Buf_Index=0;
        }
}

          if(EOC==1);
           {
           OE=1;  
           cc=P1;
           OE=0;
           ST=0;
           ST=1;
           ST=0;

           }
           display();
#endif
        }
}
void Serial_INT() interrupt 4
{
        uchar c;
        if(RI==0)
                return;
        //ES = 0;
        RI = 0;
        c  = SBUF;
        if(c>='0' && c<='9')
        {
                Receive_Buffer[Buf_Index] = c;
                Buf_Index++;
                if(Buf_Index>10)Buf_Index=0;
        }
//        ES = 1;
}

IMG_20200518_231114.png
回复

使用道具 举报

ID:267719 发表于 2020-5-19 11:02 | 显示全部楼层
硬件晶振没给数值。导致未知波特率。
回复

使用道具 举报

ID:267719 发表于 2020-5-19 11:16 | 显示全部楼层
另建议31脚EA接高电平,数码管选共阴。你要用模拟终端调试,那模拟终端的TXD应该接到MCU的RXD,模拟终端的RXD应该接到MCU的TXD。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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