標題: 51單片機串口程序C語言版 [打印本頁]

作者: 51hei學習技術中    時間: 2016-10-11 23:05
標題: 51單片機串口程序C語言版
這篇文章主要來介紹一下 51單片機的串口,下面先來看一下與串口相關的寄存器。
  
  圖1 (該圖來自51單片機技術文檔)
  下面來逐個介紹個寄存器。
  SCON寄存器的SM1,SM2主要用來設置串行口的工作方式,具體對應關系見圖2,REN:串行口接受使能位,當單片機要接受數據時該位應該置一,TB8:發(fā)送數據的第九位。在方式2或者方式3中TB8為發(fā)送的第九位數據。該位不是很常用,具體介紹請查看51單片機的技術文檔,這里不多做介紹。TI:發(fā)送中斷標志,由硬件在方式0串行發(fā)送第8位結束時置位,或在其它方式串行發(fā)送停止位的開始時置位,必須由軟件清零。RI:接受中斷標志,由硬件由硬件在方式0串行發(fā)送第8位結束時置位,或在其它方式串行發(fā)送停止位的中間時置位,必須由軟件清零。
  在這里需要提醒的是,大家在看技術文檔是一定要注意那些必須由軟件清零的標志位,在寫程序時一定要記得清零。
  
  圖2(本圖來自51單片機技術文檔)
  SBUF寄存器:(為了方便就直接截圖說明了)
  
  PCON寄存器D7位SMOD是串行波特率倍增位,SMOD為一時,串行口在工作方式1,方式2,方式3中波特率加倍,復位時,SMOD=0.
  寄存器IPH,IPSADEN,SADDR不是很常用,在這里就不做介紹,我下面的程序中也沒有用到,感興趣的可以自己查閱一下技術文檔。
  接下來開始調試串口的方法和步驟。
  1.STC—ISP下載軟件自帶串口調試功能。下面是軟件界面
  
  2.在串口調試之前還必須知道自己學習板接的是電腦的哪個端口,查看端口的方法如下:
  右鍵單擊桌面上的:我的電腦—設備管理器,如果學習板通過下載線連接到了電腦會顯示如下界面:
  
  從端口選項中可以看到我連接的是COM3.
  3接下來的任務就是不程序下載到單片機中開始調試了(程序我會在下面給出,先把調試步驟介紹完)
  程序下載完畢之后單擊STC-ISP下載軟件中的:串口助手按鈕,就會出現(xiàn)如下界面:
  
  然后在點擊打開串口按鈕,上圖中顯示的是:關閉串口,是因為我的串口已經打開了,接下來在單字符串發(fā)送區(qū),輸入要傳送的數據,例如傳送:77,選擇十六進制發(fā)送,觀察,學習班上LED的亮滅情況,和數據接區(qū)的反應。如下圖:
  
  需要注意的是必須要將COM(即端口號),比特率,校驗位,數據位,停止位,設置正確否則會顯示亂碼。
  可以觀察到的現(xiàn)象是:led的第八個和第四個點亮了,原因也很簡單,因為發(fā)送的數據是77,選擇的是十六進制發(fā)送,即0111 0111,可以看到第8位和第四位是零,所以LED點亮了。接受單口顯示data recieve ok,說明單片機數據接受成功。
  最后也是最重要的就是編寫程序了:下面是我的調試程序,希望對大家能有幫助。
  
  
  (因為程序粘貼過來的時候注釋會顯示亂碼,沒辦法只好使用截圖,請大家將就著看一下,還有需要提醒的是程序的第57,58和第29行在截圖時重復了請大家仔細對著行標號看就很清楚了)
  程序的注釋寫的很清楚,我在這里就不重復解釋了,不懂的請大家仔細看注釋。

51單片機的串口通信程序.rar

1.13 KB, 下載次數: 44, 下載積分: 黑幣 -5


作者: 51hei學習技術中    時間: 2016-10-11 23:10
  1. #include <reg52.h>
  2. #include<intrins.h>
  3. #include <stdio.h>
  4. #include <math.h>
  5. #define uchar unsigned char
  6. #define uint unsigned int
  7. sbit Key1 = P2^3;
  8. sbit Key2 = P2^2;
  9. sbit Key3 = P2^1;
  10. sbit Key4 = P2^0;
  11. sbit BELL = P3^6;
  12. sbit CONNECT = P3^7;
  13. unsigned int  Key1_flag = 0;
  14. unsigned int  Key2_flag = 0;
  15. unsigned int  Key3_flag = 0;
  16. unsigned int  Key4_flag = 0;
  17. unsigned char b;
  18. unsigned char code Num[21]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,
  19.                             0x90,0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,
  20.                             0x10,0x89};
  21. unsigned char code Disdigit[4] = {0x7F,0xBF,0xDF,0xEF};
  22. unsigned char Disbuf[4];
  23. void delayms(uint t)
  24. {
  25. uint i;
  26. while(t--)
  27. {
  28.   /* 對于11.0592M時鐘,約延時1ms */
  29.   for (i=0;i<125;i++)
  30.   {}
  31. }
  32. }

  33. //-----------------------------------------------------
  34. void SendData(uchar Dat)
  35. {
  36. uchar i=0;
  37. SBUF = Dat;
  38. while (1)
  39.   {
  40.     if(TI)
  41.       {
  42.         TI=0;
  43.         break;
  44.    }
  45.   }
  46. }
  47. void ScanKey()
  48. {
  49.     if(Key1 == 0)
  50.     {
  51.        delayms(100);
  52.     if(Key1 == 0)
  53.     {
  54.        Key1_flag = 1;
  55.        Key2_flag = 0;
  56.     Key3_flag = 0;
  57.     Key4_flag = 0;
  58.        Key1 = 1;
  59.     }
  60.     else;
  61.     }
  62.     if(Key2 == 0)
  63.     {
  64.     delayms(100);
  65.     if(Key2 == 0)
  66.     {
  67.        Key2_flag = 1;
  68.        Key1_flag = 0;
  69.     Key3_flag = 0;
  70.     Key4_flag = 0;
  71.     Key2 = 1;
  72.     }
  73.     else;
  74.     }
  75.    if(Key3 == 0)
  76.     {
  77.     delayms(50);
  78.     if(Key3 == 0)
  79.     {
  80.        Key3_flag = 1;
  81.        Key1_flag = 0;
  82.     Key2_flag = 0;
  83.     Key4_flag = 0;
  84.     Key3 = 1;
  85.     }
  86.     else;
  87.     }
  88. if(Key4 == 0)
  89.     {
  90.     delayms(50);
  91.     if(Key4 == 0)
  92.     {
  93.        Key4_flag = 1;
  94.        Key1_flag = 0;
  95.     Key2_flag = 0;
  96.     Key3_flag = 0;
  97.     Key4 = 1;
  98.     }
  99.     else;
  100.     }
  101. else;  
  102. }
  103. void KeyProc()
  104. {
  105.     if(Key1_flag)
  106.     {
  107.      TR1 = 1;
  108.   SendData(0x55);
  109.      Key1_flag = 0;     
  110. }   
  111. else if(Key2_flag)
  112.     {
  113.      TR1 = 1;
  114.      SendData(0x11);   
  115.      Key2_flag = 0;  
  116.     }
  117.     else if(Key3_flag)
  118.     {
  119.     P1=0xff;
  120.     BELL = 0;
  121. CONNECT = 1;
  122.     Key3_flag = 0;
  123.     }
  124. else if(Key4_flag)
  125. {
  126. CONNECT = 0;
  127. BELL = 1;
  128.     Key4_flag = 0;
  129. }
  130.     else;      
  131. }
  132. void Initdisplay(void)
  133. {
  134. Disbuf[0] = 1;
  135. Disbuf[1] = 2;
  136. Disbuf[2] = 3;
  137. Disbuf[3] = 4;
  138. }
  139. void Display()     //顯示
  140. {
  141. unsigned int     i = 0;
  142. unsigned int temp,count;
  143.         temp = Disdigit[count];   
  144.   P2 =temp;
  145.   temp = Disbuf[count];
  146.   temp = Num[temp];
  147.         P0 =temp;
  148.         count++;      
  149.     if  (count==4)
  150.         count=0;        
  151. }   

  152. void time0() interrupt 1  using 2
  153. {  
  154.    Display();   
  155.   TH0 = (65535 - 2000)/256;
  156.   TL0 = (65535 - 2000)%256;
  157. }
  158.   
  159. void main()
  160. {
  161. Initdisplay();
  162. TMOD = 0x21;
  163. TH0 = (65535 - 2000)/256;
  164. TL0 = (65535 - 2000)%256;
  165. TR0 = 1;
  166. ET0 = 1;  
  167. TH1 = 0xFD; //11.0592M
  168. TL1 = 0xFD;
  169. PCON&=0x80;
  170. TR1 = 1;
  171. ET1 = 1;
  172. SCON = 0x40; //串口方式
  173. REN = 1;
  174. PT1 = 0;
  175. PT0 = 1;
  176. EA = 1;
  177.   while(1)
  178.   {
  179.    ScanKey();
  180.    KeyProc();     
  181.    
  182.    if(RI)
  183.    {
  184.    Disbuf[0] = 0;
  185.    Disbuf[1] = 20;
  186.    Disbuf[2] = SBUF>>4;
  187.    Disbuf[3] = SBUF&0x0f;
  188.    RI = 0;
  189.    }
  190.    else;   
  191.   }
  192. }
復制代碼





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