久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2935|回復: 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. }
復制代碼



回復

使用道具 舉報

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 | 顯示全部樓層
頂頂。。
回復

使用道具 舉報

ID:245009 發表于 2017-11-1 18:08 | 顯示全部樓層
看得不是很懂
回復

使用道具 舉報

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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产午夜精品视频 | jlzzxxxx18hd护士| japan21xxxxhd美女 日本欧美国产在线 | 亚洲视频在线看 | 成人免费观看男女羞羞视频 | 欧美一级片免费看 | 精品国产一二三区 | 日韩图区 | 91久操网| 日韩精品一区二区三区视频播放 | 国产一区二区三区在线 | 伊人久久综合 | 精品99久久久久久 | 爱爱综合网 | 国产成人精品免费 | 亚洲精品一 | 欧美8一10sex性hd | 午夜影院毛片 | 国产视频福利一区 | 欧美一级在线观看 | 国产精品美女久久久久aⅴ国产馆 | 欧美成人精品欧美一级 | 精品欧美激情精品一区 | 亚洲欧洲精品一区 | 久久国产亚洲精品 | 久久伊人精品一区二区三区 | 欧美日韩在线一区二区 | 日本久久一区 | 久久精品小短片 | 精品国产乱码久久久久久丨区2区 | 精品视频在线观看 | 性高湖久久久久久久久3小时 | 久久精彩视频 | 久久久久久高潮国产精品视 | 亚洲 欧美 日韩 在线 | 久久美女网 | 色橹橹欧美在线观看视频高清 | 日韩一区二区三区视频 | 中文字幕日韩欧美一区二区三区 | 在线看无码的免费网站 | 91在线视频观看免费 |