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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2811|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 香蕉av免费 | 国产一区二 | 欧洲精品码一区二区三区免费看 | 日本成人免费网站 | 一区二区三区国产精品 | 精品一区久久 | 国产亚洲一区精品 | 精品国产色| 涩涩视频在线观看 | 国产免费看 | 午夜在线小视频 | 五月天激情电影 | 看片国产 | 一级毛片播放 | 欧美国产日韩一区二区三区 | 超碰在线观看97 | 国产精品第2页 | 中文字幕一区二区三区精彩视频 | 日韩一级欧美一级 | 国产免费色 | av一区二区在线观看 | 亚洲精品第一 | 99福利 | 国产午夜三级一区二区三 | 丁香综合 | 剑来高清在线观看 | 国产日韩亚洲欧美 | 久久综合一区二区三区 | avhd101在线成人播放 | 色综合色综合色综合 | 欧美一区二区三区 | 日韩三级 | 涩色视频在线观看 | 欧美久久精品一级黑人c片 91免费在线视频 | 九九热在线免费视频 | 久久久久久久久国产精品 | 日韩伦理电影免费在线观看 | 红色av社区 | 午夜黄色影院 | 武道仙尊动漫在线观看 | aaaaaaa片毛片免费观看 |