找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1935|回复: 5
打印 上一主题 下一主题
收起左侧

新人求教,51单片机串口通讯问题

[复制链接]
跳转到指定楼层
楼主
ID:243036 发表于 2017-10-28 12:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我在做51单片机串口的时候上位机以16进制发送01,单片机里面用case判断收到的为0x01就发送一个值,这样是可以收到的,但是我在单片机里面用case判断收到的为0x10就发送一个值,这样却不会返回数据,这是什么原因呢?代码如下,求解答
  1. #include <reg52.h>            //包含单片机寄存器的头文件
  2. #define port P0
  3. sbit lsa=P2^2;
  4. sbit lsb=P2^3;
  5. sbit lsc=P2^4;
  6. #define uchar unsigned char
  7. #define uint  unsigned int
  8. #define N     2
  9. uchar temp,j,flag,begin;
  10. uchar dat[N];
  11. unsigned char code table[17]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
  12. //0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码
  13. void Delay(int c);
  14. void SendByte(unsigned char d)
  15. {
  16. SBUF = d/10;
  17. while(!TI);
  18.       TI = 0;
  19. }
  20. void UARTInit(void)
  21. {
  22. TMOD=0x20;            //用定时器设置串口波特率
  23. TH1=0xfd;       //配置波特率为9600
  24. TL1=0xfd;
  25. TR1=1;
  26. REN=1;          //串口初始化
  27. SM0=0;
  28. SM1=1;
  29. EA=1;           //开启总中断
  30. ES=1;         //开启串口中断
  31. }
  32. void reset(void)
  33. {
  34.           ES=1;
  35.                 j=0;
  36.           flag=0;
  37. }
  38. void display(){
  39. int i=0;//计数器
  40. lsa=0;
  41. lsb=0;
  42. lsc=0;

  43. lsa=1;
  44. lsb=0;
  45. lsc=0;
  46. if (dat[0]<0||dat[0]>9) {reset();port=table[0];}
  47. else port=table[dat[0]];
  48. Delay(10);
  49. lsa=0;
  50. lsb=0;
  51. lsc=0;
  52. port=table[dat[1]];
  53. //port=0x06;
  54. Delay(10);
  55. //i++;
  56. //if(i==10) i=0;

  57. }
  58. void main()
  59.         {
  60. uint i;
  61.          for(i=0;i<4;i++) dat[i]=0;

  62. reset();
  63. UARTInit();
  64. while(1)
  65.         {
  66. if (flag==1)
  67.     reset();        
  68. display();
  69. }
  70. }
  71. void Delay(int c){
  72. unsigned a,b;
  73. for(;c>0;c--)
  74. for(b=38;b>0;b--);
  75. //for(a=130;a>0;a--);
  76. }
  77. void ser() interrupt 4
  78. {
  79. RI=0;
  80.         
  81.   dat[j]=SBUF;
  82.         temp=dat[j];
  83.         switch(temp)
  84.         {
  85.                 case 0x01: SendByte(1); break;
  86.                 default:break;
  87.         }
  88.   j++;
  89.         if (j==N)
  90.         {
  91.     ES=0;             //关闭串口中断
  92.     flag=1;
  93.         }


  94. }
复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:123289 发表于 2017-10-29 12:41 | 只看该作者
在01的地方,换成10试试呢?
回复

使用道具 举报

板凳
ID:243036 发表于 2017-11-1 16:28 | 只看该作者
yzwzfyz 发表于 2017-10-29 12:41
在01的地方,换成10试试呢?

您好,按照你说的试了还是不可以,我试了之后发现只要串口发的是1位数就可以收到,2位数总是不行的,网上也有人说是因为要分两次接收,不知道是不是这样的。
回复

使用道具 举报

地板
ID:244993 发表于 2017-11-1 17:15 | 只看该作者
顶顶。。
回复

使用道具 举报

5#
ID:245009 发表于 2017-11-1 18:08 | 只看该作者
看得不是很懂
回复

使用道具 举报

6#
ID:213173 发表于 2017-11-1 18:11 | 只看该作者
串口每次可以收发1个字节,从0x00~0xff,从你的程序看杂乱无章,建议找一个例程参考,在其基础上改进。
#include <AT89X52.H>
#define uint unsigned int
#define uchar unsigned char
uchar flag;                //接收完成标志,
uchar a;                //收发变量
void main()                                                       
{
        TMOD=0x20;//定时器1方式2(8位重载)
        TH1=0xfd; //波特率9600
        TL1=0xfd; //波特率9600
        TR1=1;        //开定时器1
        REN=1;        //允许串行接收
        SM0=0;        //设置串口方式1(8位UART波特率可变)
        SM1=1;        //设置串口方式1(8位UART波特率可变)
//        PCON=0x80;        //波特率加倍9600*2
        EA=1;        //总中断开
        ES=1;        //串口中断开
        while(1)
        {
                if(flag==1)                //接收完成标志为1
                {
                        ES=0;                //关串口中断
                        flag=0;                //接收完成标志清0
                        SBUF=a;                //发送数据
                        while(!TI);        //等待发送中断请求标志位为1
                        TI=0;                //发送中断请求标志位清0
                        ES=1;                //开串口中断
                }
                P1=~a;                        //LED显示收到的数据
        }
}

void ser() interrupt 4
{                                //当接收完成发生中断请求RI由硬件置1
                RI=0;        //接收中断请求标志位清0,必须软件清0
                a=SBUF;//获取SBUF接收到的数据
                flag=1;//接收完成标志置1
}
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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