• 嵌入式技术学习——c51——串口


    一、串口介绍。

    串口是一个 通讯接口。成本低,容易使用,通信线路简单,可实现两个设备的相互通信

    单片机的串口可以实现单片机于单片机,单片机与电脑,单片机与其他模块相互通信。

    51单片机内部自带UART,通用异步手法器,实现单片机的串口通信。

    二、硬件电路

    1、简单双向串口通信有两根通信线(发送端TXD和接收端RXD)

    TXD和RXD要交叉连接,

    当电平标准不一致时,需要加电平转换芯片。

    通信必须需要txd和rxd和gnd三根线

    三、电平标准

    电平标准时数据1和数据0的表达式,时传输线缆中人为规定的电平与数据的对应关系,串口常用的标准三种:

    TTL电平:-+5表述1,0V表示0                                     

    RS232电平:-3~-15V表示1,+3~+15V表示0

    RS485电平:两线压差+2~+6V表示1,-2~-6V表示0(差分信号)

    TTL和RS232z最多可以输出十多米

    RS485可以达到1000米

    四、通信接口

    (1)c51的单片机串口

    名称:UART           引脚定义:TXD RXD          通信方式:全双工、异步        特点:点对点通信

    (2)串行通信模式

            全双工:通信双方可以在同一时刻互相传输数据。

             半双工:通信双方可以互相传输数据,但必须分时复用一根数据线

             单工:通信只能一方发送给另一方。

    (3)传输数据方式

            异步:通信双方各各自约定通信速率

           同步:通信双方靠一根时钟线来约定通信速率

    (4)其他

    总线:连接各个设备的数据传输线路(类似于一条马路,把路边各住户连接起来,让住户相互交流)

     波特率:串口通信的速率,单位时间内发送的比特率(bits\s)

     检验位:用于数据验证(奇校验与偶校验)

     停止位:用于数据帧间隔

     时序图

    五、51单片机的UART

    c51中只有1个UART

    其有4种工作模式:

    (1)模式0:同步移位寄存器

    (2)模式1:8位UART,波特率可变(常用)

    (3)模式2:9位UART, 波特率固定

    (4)模式3:9位UART,波特率可变

    六、串口模式图

    SBUF:串口数据缓存寄存器。物理上时两个独立的寄存器,但占用的是相同的地址。写操作时,写入的是发送寄存器,读操作时,独处的时接收寄存器。

            在总线上接受数据和发送数据,靠定时器计数,T1的溢出率经过二分频或16分频控制收放的速率,通过SBUF写入发送数据。将数据放在SBUF,单片机自动读写数据,发送之后会申请TI这个发送中断,接收数据会生成RI接受中断。

    七。寄存器

    还有定时器,中断的寄存器看前面的文章。

    七、课堂练习

    发送数字,数码管输出相应的数字。

           uart.c

    1. #include "reg51.h"
    2. #include "utils.h"
    3. #include "ledNum.h"
    4. void uartInit(void)
    5. {
    6. SCON |= 0x01<<6; //选择uart 工作方式1 8位的uart
    7. SCON |= 0x01<<4; //开启接收
    8. PCON |= 0x01<<7; //波特率设置翻倍
    9. TH1 = 243;
    10. TL1 = 243;
    11. TMOD |= 0x01<<5;
    12. TCON |= 0x01<<6; //开启定时器
    13. //串口中断相关
    14. IE |= 0x01<<7 | 0x01 << 4; // 开启总中断 和 串口中断
    15. }
    16. void sendOneByte(unsigned char ch)
    17. {
    18. SBUF=ch;
    19. while (SCON&(0x01<<1) == 0)
    20. ;
    21. SCON &= ~(0x01<<1); //软件清零
    22. }
    23. void sendStr(const char *s)
    24. {
    25. int i = 0;
    26. while (s[i])
    27. {
    28. sendOneByte(s[i]);
    29. ++i;
    30. delay(30000);
    31. }
    32. }
    33. void uartHandler(void) interrupt 4
    34. {
    35. if (SCON&0x01)//接收中断
    36. {
    37. P2 = ~P2;
    38. displayNum(1,SBUF);
    39. SCON &= ~0x01<<0;
    40. }
    41. }

                      uart.h

    1. #ifndef _UART_H_
    2. #define _UART_H_
    3. void uartInit(void);
    4. void sendOneByte(unsigned char ch);
    5. #endif

    延迟 utils.c

    1. void delay(unsigned int n )
    2. {
    3. while(n)
    4. --n;
    5. }

    延迟   utils.h

    1. #ifndef _UTILS_H_
    2. #define _UTILS_H_
    3. void delay(int n);
    4. #endif

           ledNum.c

    1. #include
    2. void displayNum(unsigned int dig,int n)
    3. {
    4. unsigned char num[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d,
    5. 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c,
    6. 0x39, 0x5e, 0x79, 0x71, 0x00};
    7. //位的选择
    8. P1 = 0x01 << (dig-1); //1 2 3 4
    9. //显示数据 --段的选择
    10. P0 = num[n];
    11. }
    12. void display(int num)
    13. {
    14. //1234
    15. unsigned int k = 0;
    16. unsigned int i = 1;
    17. while(num)
    18. {
    19. k = num % 10; //
    20. displayNum(i,k);
    21. num = num/10; //123
    22. i++;
    23. // delay(500);
    24. }
    25. }

    main.c

    1. #include "reg51.h"
    2. #include "uart.h"
    3. #include "utils.h"
    4. #include
    5. void main(void)
    6. {
    7. uartInit();
    8. while (1)
    9. {
    10. sendOneByte(SBUF);
    11. delay(10000);
    12. }
    13. }

  • 相关阅读:
    Linux高并发服务器开发(六)线程
    传输层/UDP/TCP协议
    Spring Boot2中如何优雅地个性化定制Jackson
    sqllab第二十六关通关笔记
    Sleep(0)、Sleep(1)、SwitchToThread()
    【JUC】ThreadPoolExecutor构造函数及拒绝策略
    聚观早报 | OPPO Find N3首发;AI带来新红利
    热门高薪岗位大数据开发 自学转行如何就业(自学教程 学习路线 方法建议)
    【STM32学习】I2C通信协议 | OLED屏
    Android 开发技巧:音乐播放器的后台处理【Service、Handler、MediaPlayer】
  • 原文地址:https://blog.csdn.net/m0_71703182/article/details/139750138