欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: 新手請教一下單片機串口PC通信控制燈的問題 [打印本頁]

作者: LIPPPP    時間: 2017-6-18 00:56
標(biāo)題: 新手請教一下單片機串口PC通信控制燈的問題
新手自學(xué)到串口通信那部分,用了教程里面的發(fā)送a數(shù)據(jù)的串口通信程序例子,串口調(diào)試助手可以顯示數(shù)據(jù)a。然后我自己嘗試寫了,當(dāng)a = 0x01 led亮,但是串口調(diào)試助手有顯示接收到的數(shù)據(jù),可是開發(fā)板的燈卻沒亮。 下面是程序,先謝謝論壇中的為我解答的人
  1. #include <reg52.h>         
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. //#define LED P1
  6. uchar dat,num = 0,a=0;
  7. uchar ON = 0;
  8. uchar OFF = 1;
  9. sbit led1 = P1^0;
  10. void initial_com();
  11. void delay(unsigned int z);   // 忽略這延時,本來還想用串口通信實現(xiàn)呼吸流水之類的,現(xiàn)在連燈亮都不行
  12. void delay2(unsigned int t);


  13. void  initial_com(void)
  14. { SCON = 0x50;
  15.   TMOD|= 0x20;   //設(shè)置波特率 9600
  16.   TH1 = 0xfd;
  17.   TL1 = 0xfd;
  18.   TR1 = 1;
  19.   REN = 1;           //串口初始化
  20.   SM0 = 0;
  21.   SM1 = 1;
  22.   EA = 1;
  23.   ES = 0;           //串口中斷開啟位  
  24. SBUF = 0x01;  //開發(fā)板開關(guān)開啟接收到,01 FF數(shù)據(jù)
  25.   while(!TI);
  26.   TI = 0;
  27.   ES = 1;
  28. }

  29. void main()
  30. {        
  31.         initial_com();
  32.         while(1)
  33.         {        
  34.                 if(num==1)
  35.                 {
  36.                      ES = 0;
  37.                          num = 0;
  38.                          SBUF = a;   //
  39.                          while(!TI);
  40.                          TI = 0;
  41.                          ES = 1;
  42.                         
  43.                 }
  44.                
  45.         }        
  46. }
  47. void ser() interrupt 4
  48. {
  49.         RI=0;
  50.         a = SBUF;
  51. //        ES=0;                                    //關(guān)閉串口中斷
  52.         num=1;
  53. /*在調(diào)試助手上確實可以顯示接收到 0x01 ,但是燈沒亮*/
  54.          if(a == 0x01)      
  55.          {
  56.            led1 = 0;
  57.                 }
  58.          if(a == 0x02)
  59.          {
  60.             led1 = 1;
  61.                 }
  62.                     

  63. }
復(fù)制代碼


作者: HC6800-ES-V2.0    時間: 2017-6-18 09:27
我用你的程序,在我的板子上試驗了一下,完全是正確的。輸入HEX的數(shù)據(jù)1,可以開燈,輸入HEX的數(shù)據(jù)2,可以關(guān)燈。
可能你的問題是:
我讀你程序時,特別注意了你的判斷用的數(shù)據(jù)類型——HEX十六進制數(shù)據(jù)類型,所以,串口通訊實驗時,我特地將輸入的選項,設(shè)置為HEX,所以是成功的。
如果你輸入的數(shù)據(jù)類型是字符型,輸入、輸出看起來都是1,但單片機可不那么想,‘1’和0x01是不同的。
你注意一下,返回的是01,則說明輸入的1是十六進制數(shù)據(jù),若返回的是1,就是輸入的字符數(shù)據(jù)。
切切!數(shù)據(jù)類型在串口通訊中控制時,重要!!!
作者: LIPPPP    時間: 2017-6-18 21:51
HC6800-ES-V2.0 發(fā)表于 2017-6-18 09:27
我用你的程序,在我的板子上試驗了一下,完全是正確的。輸入HEX的數(shù)據(jù)1,可以開燈,輸入HEX的數(shù)據(jù)2,可以關(guān) ...

原來如此!!! 我搞了好久不知道哪里出錯。我這 新手確實好多小細節(jié)都沒弄懂,學(xué)習(xí)學(xué)習(xí)了。
作者: yzwzfyz    時間: 2017-6-18 23:19
執(zhí)行“SBUF = 0x01;  //開發(fā)板開關(guān)開啟接收到,01 FF數(shù)據(jù)”,是向串口發(fā)送一個01,發(fā)完后會產(chǎn)生一個中斷,程序轉(zhuǎn)入中斷服務(wù)去。
在中斷服務(wù)程序中你:“a = SBUF;” -----由于SBUF中原來沒有一個確定的數(shù)據(jù)(發(fā)送的SBUF與接收的SBUF是不同的,請你認真仔細讀單片機手冊),所以a不知道是等于什么,=01的可能性為1/256。





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