• 【51单片机】:串口通信控制LED亮灭任务


    学习目标:

            使用51单片机的串口通信,当串口通信助手

                    发送字符串  on  led开启   

                    发送字符串  off  led关闭

    并且串口助手实时返回   发送的字符串


    学习内容(代码):

            第一种方法,使用数组依次判断接收到的字符串,根据判断的结果来使能led灯,并持续发送到串口助手上。

    1. #include "reg52.h"
    2. #include "string.h"
    3. typedef unsigned int u16; //对系统默认数据类型进行重定义
    4. typedef unsigned char u8;
    5. /*******************************************************************************
    6. * 函 数 名 : uart_init
    7. * 函数功能 : 串口通信中断配置函数,通过设置TH和TL即可确定定时时间
    8. * 输 入 : baud:波特率对应的TH、TL装载值
    9. * 输 出 : 无
    10. *******************************************************************************/
    11. void uart_init(u8 baud)
    12. {
    13. TMOD|=0X20; //设置计数器工作方式2
    14. SCON=0X50; //设置为工作方式1
    15. PCON=0X80; //波特率加倍
    16. TH1=baud; //计数器初始值设置
    17. TL1=baud;
    18. ES=1; //打开接收中断
    19. EA=1; //打开总中断
    20. TR1=1; //打开计数器
    21. }
    22. /*******************************************************************************
    23. * 函 数 名 : main
    24. * 函数功能 : 主函数
    25. * 输 入 : 无
    26. * 输 出 : 无
    27. *******************************************************************************/
    28. u8 rec_data[6];
    29. void main()
    30. {
    31. uart_init(0XFA);//波特率为9600
    32. while(1)
    33. {
    34. if((rec_data[0] == 'o') && (rec_data[1] == 'n')){
    35. P2 = 0x00;
    36. }else if((rec_data[0] == 'o') && (rec_data[1] == 'f') && (rec_data[2] == 'f')){
    37. P2 = 0xff;
    38. }
    39. }
    40. }
    41. int i =0 ;
    42. void uart() interrupt 4 //串口通信中断函数
    43. {
    44. RI = 0; //清除接收中断标志位
    45. if(SBUF != '\n')
    46. {
    47. rec_data[i]=SBUF; //存储接收到的数据
    48. SBUF = rec_data[i];
    49. while(!TI);
    50. TI = 0;
    51. i++;
    52. }
    53. else
    54. i = 0;
    55. }

    串口助手返回:

    视频效果:

    51单片机串口通信控制led亮灭

    项目链接:(10条消息) 51单片机的串口通信控制板载led亮灭资源-CSDN文库


    学习内容:

            利用c语言的字符串匹配方法解决问题。

    C 库函数 int strncmp(const char *str1, const char *str2, size_t n) 把 str1 和 str2 进行比较,最多比较前 n 个字节。

    参数

    • str1 -- 要进行比较的第一个字符串。
    • str2 -- 要进行比较的第二个字符串。
    • n -- 要比较的最大字符数。

    返回值

    该函数返回值如下:

    • 如果返回值 < 0,则表示 str1 小于 str2。
    • 如果返回值 > 0,则表示 str1 大于 str2。
    • 如果返回值 = 0,则表示 str1 等于 str2。
    1. #include "reg52.h"
    2. #include "string.h"
    3. typedef unsigned int u16; //对系统默认数据类型进行重定义
    4. typedef unsigned char u8;
    5. /*******************************************************************************
    6. * 函 数 名 : uart_init
    7. * 函数功能 : 串口通信中断配置函数,通过设置TH和TL即可确定定时时间
    8. * 输 入 : baud:波特率对应的TH、TL装载值
    9. * 输 出 : 无
    10. *******************************************************************************/
    11. void uart_init(u8 baud)
    12. {
    13. TMOD|=0X20; //设置计数器工作方式2
    14. SCON=0X50; //设置为工作方式1
    15. PCON=0X80; //波特率加倍
    16. TH1=baud; //计数器初始值设置
    17. TL1=baud;
    18. ES=1; //打开接收中断
    19. EA=1; //打开总中断
    20. TR1=1; //打开计数器
    21. }
    22. /*******************************************************************************
    23. * 函 数 名 : main
    24. * 函数功能 : 主函数
    25. * 输 入 : 无
    26. * 输 出 : 无
    27. *******************************************************************************/
    28. u8 rec_data[6];
    29. void main()
    30. {
    31. uart_init(0XFA);//波特率为9600
    32. while(1)
    33. {
    34. if(strncmp(rec_data,"on",2)==0){
    35. P2=0X00;
    36. }else if(strncmp(rec_data,"off",3)==0){
    37. P2=0XFF;
    38. }
    39. }
    40. }
    41. int i =0 ;
    42. void uart() interrupt 4 //串口通信中断函数
    43. {
    44. RI = 0; //清除接收中断标志位
    45. if(SBUF != '\n')
    46. {
    47. rec_data[i]=SBUF; //存储接收到的数据
    48. SBUF = rec_data[i];
    49. while(!TI);
    50. TI = 0;
    51. i++;
    52. }
    53. else
    54. i = 0;
    55. }

    效果如上个一样,不再展示。


    梦回大唐

  • 相关阅读:
    myCat实现分库分表
    Linux系统中驱动之设备树的platform驱动实现
    【牛客网】Verilog快速入门-基础语法(1)
    Vue2问题:分享一个通用多文件类型预览库
    Java -基础知识之类的初始化顺序
    Android---动态权限适配问题
    关于Linux命令的使用
    【Python从入门到进阶】58、Pandas库中Series对象的操作(一)
    nacos2.2.1搭建
    Flask 快速上手教程 — 了解与基本使用
  • 原文地址:https://blog.csdn.net/oxygen23333/article/details/130802048