找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 4395|回復(fù): 3
收起左側(cè)

新手請(qǐng)教一下單片機(jī)串口PC通信控制燈的問題

[復(fù)制鏈接]
ID:210889 發(fā)表于 2017-6-18 00:56 | 顯示全部樓層 |閱讀模式
新手自學(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);   // 忽略這延時(shí),本來還想用串口通信實(shí)現(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)試助手上確實(shí)可以顯示接收到 0x01 ,但是燈沒亮*/
  54.          if(a == 0x01)      
  55.          {
  56.            led1 = 0;
  57.                 }
  58.          if(a == 0x02)
  59.          {
  60.             led1 = 1;
  61.                 }
  62.                     

  63. }
復(fù)制代碼

回復(fù)

使用道具 舉報(bào)

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

評(píng)分

參與人數(shù) 1黑幣 +5 收起 理由
LIPPPP + 5 贊一個(gè)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:210889 發(fā)表于 2017-6-18 21:51 | 顯示全部樓層
HC6800-ES-V2.0 發(fā)表于 2017-6-18 09:27
我用你的程序,在我的板子上試驗(yàn)了一下,完全是正確的。輸入HEX的數(shù)據(jù)1,可以開燈,輸入HEX的數(shù)據(jù)2,可以關(guān) ...

原來如此!! 我搞了好久不知道哪里出錯(cuò)。我這 新手確實(shí)好多小細(xì)節(jié)都沒弄懂,學(xué)習(xí)學(xué)習(xí)了。
回復(fù)

使用道具 舉報(bào)

ID:123289 發(fā)表于 2017-6-18 23:19 | 顯示全部樓層
執(zhí)行“SBUF = 0x01;  //開發(fā)板開關(guān)開啟接收到,01 FF數(shù)據(jù)”,是向串口發(fā)送一個(gè)01,發(fā)完后會(huì)產(chǎn)生一個(gè)中斷,程序轉(zhuǎn)入中斷服務(wù)去。
在中斷服務(wù)程序中你:“a = SBUF;” -----由于SBUF中原來沒有一個(gè)確定的數(shù)據(jù)(發(fā)送的SBUF與接收的SBUF是不同的,請(qǐng)你認(rèn)真仔細(xì)讀單片機(jī)手冊(cè)),所以a不知道是等于什么,=01的可能性為1/256。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表