标题: 单片机串口通信程序错误 [打印本页]

作者: 电子1912    时间: 2019-12-19 20:41
标题: 单片机串口通信程序错误
我用上位机发送数字对应的灯亮
哪里错了,灯不亮?求改错
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar dat,num;
uint a,i;
void main()
{
        TMOD=0x20;
        TH1=0xfd;
        TH1=0xfd;
        TR1=1;
        REN=1;
        SM0=0;
        SM1=1;
        EA=1;
        ES=1;
        while(1)
        {
          if(num==1)
          {
              switch(dat)
                  {case1:P0=0xfe;break;
                   case2:P0=0xfd;break;
                   case3:P0=0xfb;break;
               case4:P0=0xf7;break;
                   case5:P0=0xef;break;
               case6:P0=0xdf;break;
               case7:P0=0xbf;break;
               case8:P0=0x7f;break;
                   case0:P0=0xff;break;
                    }
                        ES=1;
                        num=0;
                }
        }
}

  void ser() interrupt 4
{
     RI=0;
         dat=SBUF;
         ES=0;
         num=1;
}

18c73e0374bfbbf3.jpg (1.07 MB, 下载次数: 56)

18c73e0374bfbbf3.jpg

作者: csmyldl    时间: 2019-12-19 23:11
程序看起来没错,关键是你上位机发送时是以何种代码发送,未打开HEX开关时,发送1,接收则是31,要找开HEX开发,发送01才收到1
作者: ws1zxm    时间: 2019-12-19 23:44
不懂帮顶一下!
作者: baiyun1234    时间: 2019-12-20 13:59
给你调好了,问题出在case 语句上,我给你的P0改成P2了,你自己改回来。
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar dat,num;
uint a,i;

void main()
{
        TMOD=0x20;
        TH1=0xfd;
        TH1=0xfd;
        TR1=1;
        REN=1;
        SM0=0;
        SM1=1;
        EA=1;
        ES=1;
        while(1)
        {
          if(num==1)
          {
              switch(dat)
                  {
                                        case 1:P2=0xfe;break;
                    case 2:P2=0xfd;break;
                    case 3:P2=0xfb;break;
                                        case 4:P2=0xf7;break;
                    case 5:P2=0xef;break;
                                        case 6:P2=0xdf;break;
                    case 7:P2=0xbf;break;
                    case 8:P2=0x7f;break;
                    case 0:P2=0xff;break;
                                          
                    }
                        ES=1;
                        num=0;
                }
        }
}

  void ser() interrupt 4
{
                        RI=0;
         dat=SBUF;
         ES=0;
         num=1;
}
作者: csmyldl    时间: 2019-12-20 14:54
baiyun1234 发表于 2019-12-20 13:59
给你调好了,问题出在case 语句上,我给你的P0改成P2了,你自己改回来。
#include
#include

除了P0改为P2,还改了什么?看不出来
作者: baiyun1234    时间: 2019-12-20 15:53
csmyldl 发表于 2019-12-20 14:54
除了P0改为P2,还改了什么?看不出来

原版:case1:,我改成了:case 1:他的case中间的空格没有,语句写法还需巩固下。
作者: 电子1912    时间: 2019-12-20 22:16
baiyun1234 发表于 2019-12-20 13:59
给你调好了,问题出在case 语句上,我给你的P0改成P2了,你自己改回来。
#include
#include

大神,这个程序只可以控制单个LED灯亮,能不能改成花样流水
作者: linzhiqi1    时间: 2019-12-21 08:05
图上没看到晶振的频率多少,这个好波特率有关,11.0592,或22.1184Mhz 9600 或 19200波特率发数据
作者: baiyun1234    时间: 2019-12-21 18:08
电子1912 发表于 2019-12-20 22:16
大神,这个程序只可以控制单个LED灯亮,能不能改成花样流水

如下:给你调好了,P0改成P2了,自己改回来。
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar dat,num,t;

void delayms(uint time)
{
        uint x,y;
        for(x=0;x<time;x++)
          for(y=0;y<112;y++);
}
void main()
{
        TMOD=0x20;
        TH1=0xfd;
        TH1=0xfd;
        TR1=1;
        REN=1;
        SM0=0;
        SM1=1;
        EA=1;
        ES=1;
        while(1)
        {
          if(num==1)
          {
                          delayms(500);
              switch(dat)
                  {
                                       
                    case 1:P2=0xfe;break;
                    case 2:P2=0xfd;break;
                    case 3:P2=0xfb;break;
                    case 4:P2=0xf7;break;
                    case 5:P2=0xef;break;
                    case 6:P2=0xdf;break;
                    case 7:P2=0xbf;break;
                    case 8:P2=0x7f;break;
                    case 0:P2=0xff;break;
                                        case 9:
                                        {
                               
                                                delayms(500);       
                                                P2=0xfe;
                                                delayms(500);       
                                                P2=0xfd;
                                                delayms(500);       
                                                P2=0xfb;
                                                delayms(500);       
                                                P2=0xf7;
                                                delayms(500);       
                                                P2=0xef;
                                                delayms(500);       
                                                P2=0xdf;
                                                delayms(500);       
                                                P2=0xbf;
                                                delayms(500);       
                                                P2=0x7f;
                                                delayms(500);       
                                                P2=0xff;
                                        }break;
                                }
                  
                        ES=1;
                        num=0;
                }
        }
}

  void ser() interrupt 4
{
          RI=0;
         dat=SBUF;
         ES=0;
         num=1;
}




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1