国产免费AV|泡泡玛特欧洲总部将设在伦敦|中文天堂网www新版资源在线|一本久道综合在线中文|国精产品一二三产区的使用方法|香蕉鱼在线观看|www.27eee

 找回密碼
 注冊
搜索

51單片機串行通信技術

[復制鏈接]
樓主
eng 發表于 2021-6-7 01:46:59 | 只看該作者 |只看大圖 |倒序瀏覽 |閱讀模式
通信,單片機與外部設備之間的信息交換。
通信方式包含:串行通信和并行通信。
1.串行通信特點:傳輸速度慢,接線簡單;并行通信傳輸速度快,接線復雜。
串行通信分為異步串行通信和同步串行通信。
1.異步串行通信:起始位(0)、數據位、停止位(1)。串行通信時,約定好波特率;
2.同步串行通信:無起始位和停止位,使用的時同步字符指示,由時鐘控制發送和接收端的同步。
串行通信的數據傳送方向
1.單工、半雙工、全雙工
串行通信的奇偶校驗位
1.為了保證數據的正確傳輸,使用程序狀態子(PSW)的奇偶校驗位。如果發送端的奇偶校驗位與接收端的奇偶校驗位相同,則接收,否則不接收,重新發送。
串行通信的結構
1.兩個數據緩沖器SBUF;2輸入移位寄存器;3.串行控制寄存器SCON;4.定時器T1(用作波特率發生器)
進行串行通信,主要是控制寄存器的使用。
串行口控制寄存器SCON:SM0和SM1控制串行口的工作方式;SM2控制多機通信;REN允許/禁止數據接收位;TB8:發送第9位,RB8接收第9位;TI和RI分別為發送和接收中斷標志。
電源控制寄存器PCON只影響波特率的大小
4種工作方式與波特率設置
1.方式0
1.1數據發送
方式0是同步移位寄存方式,因此串行通信中使用8位串/并轉換移位寄存器74LS164,RXD輸出串行數據,TXD輸出移位脈沖,還需要引腳對74LS136清零.  發送數據前,P1.7引腳對74LS164清零,D0~D7引腳輸出0,然后執行寫命令,向SBUF寫數據,從RXD引腳送出8位數據,74LS164從RXD引腳接收8位數據;
1.2數據接收
接收數據,需要在外部接并/串轉換移位寄存器74LS165,RXD斷用來接收輸入的串行數據,TXD端用來輸出移位寄存器,P3.7端用來對74LS165的數據進行所存。
2.方式1
方式1是八位異步收發。可以發送或接收10位數據格式信息。1位起始位,8位數據位,1停止位。
2.1數據發送:從TXD引腳輸出一個起始位,然后將8位數據依次輸出,然后將TI=1,從TXD輸出停止位。
2.2數據接收:REN=1,串行口采樣由1到0的負跳變,啟動接收位,八位數據依次被接收。
3.方式2
9位異步通信方式,每幀數據是11位。1起始位,1停止位,8數據位,1可編程的第九位。其中TB8可以作為奇偶校驗位使用。
3.1發送數據:首先設置TB8,然后將要發送的數據寫入sbuf,開始發送數據。串行口自動取走TB8的數據,逐一發送數據。發送完成后,將TI=1.
3.2數據接收:REN=1,才可以接收數據。當RXD發生負跳變,開始接收數據。
3.方式3
與方式2工作原理相同,僅僅波特率不同。
51單片機串行通信技術 1.png
單片機串行通訊發送數據,控制流水燈的實現
發送端程序
  1. #include<reg52.h>
  2. unsigned char code Tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
  3. void Send(unsigned char dat)
  4. {
  5.    SBUF=dat;
  6.    while(TI==0)        //若發送中斷標志位沒有置"1",就等待
  7.    {
  8.       ;
  9.    }
  10.    TI=0;
  11. }
  12. void delay(void)
  13. {
  14.    unsigned char m,n;
  15.    for(m=0;m<200;m++)
  16.         for(n=0;n<250;n++)
  17.             ;
  18. }
  19. void main()
  20. {
  21.    unsigned char i;
  22.    TMOD=0x20;           //定時器工作在方式2
  23.    SCON=0x40;           //串口工作方式1
  24.    PCON=0x00;           //設置波特率為9600b/s
  25.    TH1=0xfd;
  26.    TL1=0xfd;
  27.    TR1=1;
  28.    while(1)
  29.    {
  30.       for(i=0;i<8;i++)
  31.          {
  32.              Send(Tab[i]);
  33.                 delay();
  34.          }                  
  35.    }
  36. }
復制代碼
接收端程序

  1. #include<reg52.h>
  2. unsigned char code Tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
  3. void Send(unsigned char dat)
  4. {
  5. SBUF=dat;
  6. while(TI==0) //若發送中斷標志位沒有置"1",就等待
  7. {
  8. ;
  9. }
  10. TI=0;
  11. }
  12. void delay(void)
  13. {
  14. unsigned char m,n;
  15. for(m=0;m<200;m++)
  16. for(n=0;n<250;n++)
  17. ;
  18. }
  19. void main()
  20. {
  21. unsigned char i;
  22. TMOD=0x20; //定時器工作在方式2
  23. SCON=0x40; //串口工作方式1
  24. PCON=0x00; //設置波特率為9600b/s
  25. TH1=0xfd;
  26. TL1=0xfd;
  27. TR1=1;
  28. while(1)
  29. {
  30. for(i=0;i<8;i++)
  31. {
  32. Send(Tab[i]);
  33. delay();
  34. }
  35. }
  36. }
復制代碼


您需要登錄后才可以回帖 登錄 | 注冊

本版積分規則

手機版|小黑屋|ELEOK |網站地圖

GMT+8, 2026-5-26 01:08

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回復 返回頂部 返回列表