標(biāo)題: 新人求教,51單片機(jī)串口通訊問題 [打印本頁(yè)]

作者: xzc1109    時(shí)間: 2017-10-28 12:53
標(biāo)題: 新人求教,51單片機(jī)串口通訊問題
我在做51單片機(jī)串口的時(shí)候上位機(jī)以16進(jìn)制發(fā)送01,單片機(jī)里面用case判斷收到的為0x01就發(fā)送一個(gè)值,這樣是可以收到的,但是我在單片機(jī)里面用case判斷收到的為0x10就發(fā)送一個(gè)值,這樣卻不會(huì)返回?cái)?shù)據(jù),這是什么原因呢?代碼如下,求解答
  1. #include <reg52.h>            //包含單片機(jī)寄存器的頭文件
  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;            //用定時(shí)器設(shè)置串口波特率
  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;//計(jì)數(shù)器
  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;             //關(guān)閉串口中斷
  92.     flag=1;
  93.         }


  94. }
復(fù)制代碼




作者: yzwzfyz    時(shí)間: 2017-10-29 12:41
在01的地方,換成10試試呢?
作者: xzc1109    時(shí)間: 2017-11-1 16:28
yzwzfyz 發(fā)表于 2017-10-29 12:41
在01的地方,換成10試試呢?

您好,按照你說的試了還是不可以,我試了之后發(fā)現(xiàn)只要串口發(fā)的是1位數(shù)就可以收到,2位數(shù)總是不行的,網(wǎng)上也有人說是因?yàn)橐謨纱谓邮,不知道是不是這樣的。
作者: 天123    時(shí)間: 2017-11-1 17:15
頂頂。。
作者: aaa56156    時(shí)間: 2017-11-1 18:08
看得不是很懂
作者: wulin    時(shí)間: 2017-11-1 18:11
串口每次可以收發(fā)1個(gè)字節(jié),從0x00~0xff,從你的程序看雜亂無章,建議找一個(gè)例程參考,在其基礎(chǔ)上改進(jìn)。
#include <AT89X52.H>
#define uint unsigned int
#define uchar unsigned char
uchar flag;                //接收完成標(biāo)志,
uchar a;                //收發(fā)變量
void main()                                                       
{
        TMOD=0x20;//定時(shí)器1方式2(8位重載)
        TH1=0xfd; //波特率9600
        TL1=0xfd; //波特率9600
        TR1=1;        //開定時(shí)器1
        REN=1;        //允許串行接收
        SM0=0;        //設(shè)置串口方式1(8位UART波特率可變)
        SM1=1;        //設(shè)置串口方式1(8位UART波特率可變)
//        PCON=0x80;        //波特率加倍9600*2
        EA=1;        //總中斷開
        ES=1;        //串口中斷開
        while(1)
        {
                if(flag==1)                //接收完成標(biāo)志為1
                {
                        ES=0;                //關(guān)串口中斷
                        flag=0;                //接收完成標(biāo)志清0
                        SBUF=a;                //發(fā)送數(shù)據(jù)
                        while(!TI);        //等待發(fā)送中斷請(qǐng)求標(biāo)志位為1
                        TI=0;                //發(fā)送中斷請(qǐng)求標(biāo)志位清0
                        ES=1;                //開串口中斷
                }
                P1=~a;                        //LED顯示收到的數(shù)據(jù)
        }
}

void ser() interrupt 4
{                                //當(dāng)接收完成發(fā)生中斷請(qǐng)求RI由硬件置1
                RI=0;        //接收中斷請(qǐng)求標(biāo)志位清0,必須軟件清0
                a=SBUF;//獲取SBUF接收到的數(shù)據(jù)
                flag=1;//接收完成標(biāo)志置1
}





歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1