当前位置:   article > 正文

51单片机:电脑通过串口控制LED亮灭(附溢出率和波特率详解)

51单片机:电脑通过串口控制LED亮灭(附溢出率和波特率详解)

目录

一、功能实现

1.电脑通过串口发送数据:0F

2.点亮4个LED

二、注意事项

1.发送和接受数据的文本模式

2.串口要对应

3.注意串口的波特率要和程序中的波特率保持一致

4.有无校验位和停止位

三、如何使用串口波特率计算器

1.以本程序为例

2.生成代码如下

3.需要手动配置中断系统

根据原理图

配置代码

四、如何理解软件生成的波特率

以上述代码为例子进行分析

串口模式图

五、如何计算波特率

参考STC89C52手册P235

六、串口中断函数

中断函数(函数可自由命名,但是要加上中断号"interrupt 4")

中断函数查询表P166

七、模块化代码:

1.main.c

2.UART.c

3.UART.h


 

一、功能实现

1.电脑通过串口发送数据:0F

ca74ab64fe7c4ac58a40be88711e20af.png

2.点亮4个LED

b729529787664d8da1da9b7d5fa59acf.jpeg

二、注意事项

1.发送和接受数据的文本模式

6befa0172c5243deb351b17fc97f7430.png

2.串口要对应

3.注意串口的波特率要和程序中的波特率保持一致

4.有无校验位和停止位

三、如何使用串口波特率计算器

1.以本程序为例

0587cad36c784808a4c7eb979b136aa7.png

2.生成代码如下

  1. void Uart1_Init(void) //9600bps@11.0592MHz
  2. {
  3. SCON = 0x50; //8位数据,可变波特率
  4. AUXR |= 0x40; //定时器时钟1T模式
  5. AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
  6. TMOD &= 0x0F; //设置定时器模式
  7. TL1 = 0xE0; //设置定时初始值
  8. TH1 = 0xFE; //设置定时初始值
  9. ET1 = 0; //禁止定时器中断
  10. TR1 = 1; //定时器1开始计时
  11. }

3.需要手动配置中断系统

根据原理图

8eaa18c3ed5e434cbcc04b30ee58f113.png

配置代码

  1. //手动配置中断系统
  2. ES=1;
  3. EA=1;
  4. PS=0;

 

四、如何理解软件生成的波特率

  1. void UART_Init()
  2. {
  3. //由软件自动生成
  4. SCON=0x50; //STC89C52操作手册P235方式1
  5. PCON &= 0x7F; //波特率不倍速
  6. TMOD &= 0x0F; //设置定时器1模式
  7. TMOD |= 0x20; //设置定时器1模式
  8. TL1 = 0xFA; //设置定时初始值
  9. TH1 = 0xFA; //设置定时重载值
  10. ET1 = 0; //禁止定时器中断
  11. TR1 = 1; //定时器1开始计时
  12. //需要手动配置中断系统
  13. ES=1;
  14. EA=1;
  15. PS=0;
  16. }

以上述代码为例子进行分析

    由于配置是8位自动重载,TL1=TH1=0xFA ,0xFA=250;
    总计八位,那么数据范围0~255(256溢出)
    256-250=6
    那么每计6个数溢出一次
    晶体振荡器的输出经12 分频后得到输入的时钟脉冲
    一个机器周期内有12 个振荡周期。故其频率为晶振频率的1/12。
    此设备是11.0592M 的晶振,1.085μs为一个输入脉冲的时间
    则6.51μs溢出一次
    1/6.51,则0.1536098MHz就是定时器的溢出率
    再看PCON=0111 1111
    可知SMOD=0(参考串口模式图)
    那么波特率=0.1536098MHz   /2  /16
    波特率为0.00480030625MHz约等于4800Hz
    约等于没有误差

串口模式图

2dec9404953f42a5b6b26b2d91ee19f7.png

五、如何计算波特率

参考STC89C52手册P235

b632e176e1e449dcad0f0da5aba7b749.png

六、串口中断函数

中断函数(函数可自由命名,但是要加上中断号"interrupt 4")

  1. void UART_Routine(void) interrupt 4
  2. {
  3. if (TI==1) //检测串口1发送中断
  4. {
  5. //功能......
  6. TI = 0; //清除串口1发送中断请求位
  7. }
  8. if (RI==1) //检测串口1接收中断
  9. {
  10. //功能......
  11. RI = 0; //清除串口1接收中断请求位
  12. }
  13. }

中断函数查询表P166

0e03338fb5594159aa2641f3f029d6a7.png

七、模块化代码:

1.main.c

  1. #include <REGX52.H>
  2. #include "UART.h"
  3. unsigned char Sec=0;
  4. void main()
  5. {
  6. UART_Init();
  7. while(1)
  8. {
  9. }
  10. }
  11. /**
  12. * @brief 中断函数查询P166,函数命名可自由,但是要更上中断号"interrupt 4"
  13. * @param 无
  14. * @retval 无
  15. */
  16. void UART_Routine(void) interrupt 4
  17. {
  18. if(RI==1)
  19. {
  20. P2=~SBUF;
  21. RI=0;
  22. }
  23. }

2.UART.c

  1. #include <REGX52.H>
  2. /**
  3. * @brief 串口初始化//4800bps@11.0592MHz
  4. * @param 无
  5. * @retval 无
  6. */
  7. void UART_Init()
  8. {
  9. SCON=0x50; //STC89C52操作手册P235方式1
  10. PCON &= 0x7F; //波特率不倍速
  11. TMOD &= 0x0F; //设置定时器1模式
  12. TMOD |= 0x20; //设置定时器1模式
  13. TL1 = 0xFA; //设置定时初始值
  14. TH1 = 0xFA; //设置定时重载值
  15. ET1 = 0; //禁止定时器中断
  16. TR1 = 1; //定时器1开始计时
  17. //补上中断系统
  18. ES=1;
  19. EA=1;
  20. PS=0;
  21. }
  22. /**
  23. * @brief 串口发送一个字节的数据
  24. * @param Byte 要发送的一个字节数据
  25. * @retval 无
  26. */
  27. void UART_SendByte(unsigned char Byte)
  28. {
  29. SBUF=Byte;
  30. while(TI==0); //TI=0,数据完整发送出去,TI=1,跳出循环
  31. TI=0; //TI=0,使用软件复位
  32. }

3.UART.h

  1. #ifndef __UART_H__
  2. #define __UART_H__
  3. void UART_Init();
  4. void UART_SendByte(unsigned char Byte);
  5. #endif

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/825438
推荐阅读
相关标签
  

闽ICP备14008679号