找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 746|回复: 2
打印 上一主题 下一主题
收起左侧

状态机程序在51单片机上正常运行

[复制链接]
跳转到指定楼层
楼主
ID:731890 发表于 2023-12-30 17:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
对于51单片机由于其内部资源的限制,运行一个打操作系统是比较困难的,但是我们可以使用一个状态机来运行不同的任务,这样可以大减轻51单片机内部资源的负担,也实现了多任务的架构。

单片机源程序如下:

  1. #include <reg52.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include "delay.h"
  5. #include "timer0.h"
  6. #include "usart1.h"


  7. #define   Task_Size      8
  8. unsigned char Event_List[8];
  9. unsigned char Task_PQH;
  10. void (*Task_List[Task_Size])(void);

  11. void Task0()
  12. {
  13.   Uart1_SendString("Task0\r\n");
  14.         delay_ms(250);
  15. }

  16. void Task1()
  17. {
  18.   Uart1_SendString("Task1\r\n");
  19.         delay_ms(250);
  20. }

  21. void Task2()
  22. {
  23.         Uart1_SendString("Task2\r\n");
  24.         delay_ms(250);
  25. }

  26. void Task3()
  27. {
  28.         Uart1_SendString("Task3\r\n");
  29.         delay_ms(250);
  30. }

  31. void Task4()
  32. {
  33.         Uart1_SendString("Task4\r\n");
  34.         delay_ms(250);
  35. }

  36. void Task5()
  37. {
  38.         Uart1_SendString("Task5\r\n");
  39.         delay_ms(250);
  40. }


  41. void Task6()   
  42. {
  43.         Uart1_SendString("Task6\r\n");
  44.   delay_ms(250);        
  45. }

  46. void Task7()       //空闲任务
  47. {
  48.   Uart1_SendString("Task7\r\n");
  49.         delay_ms(250);
  50. }


  51. void main()
  52. {
  53.         Uart1_Init();//串口初始化
  54.         Init_timer0();      //定时器0初始化
  55.         Task_List[0]=Task0;     //初步化任务表
  56.   Task_List[1]=Task1;
  57.   Task_List[2]=Task2;
  58.   Task_List[3]=Task3;
  59.   Task_List[4]=Task4;
  60.   Task_List[5]=Task5;
  61.   Task_List[6]=Task6;
  62.   Task_List[7]=Task7;
  63.         
  64.         for(Task_PQH=0;Task_PQH<Task_Size;Task_PQH++)   //初始化事件
  65. {
  66.    Event_List[Task_PQH]=0;
  67. }
  68.   while(1)
  69. {
  70.                  for(Task_PQH=0;Task_PQH<Task_Size-1;Task_PQH++)   //查找最高优先级任务
  71.                  {
  72.                          if(Event_List[Task_PQH]>0)                   //有事件发生
  73.                          break;
  74.                  }

  75.                  Task_List[Task_PQH]();           //执行任务
  76. }
  77. }
复制代码
原理图: 无
仿真: 无
代码: 状态机.7z (19.26 KB, 下载次数: 29)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶2 踩
回复

使用道具 举报

沙发
ID:145357 发表于 2024-1-17 22:45 来自手机 | 只看该作者
感谢楼主分享,认真学习一下
回复

使用道具 举报

板凳
ID:1064915 发表于 2024-1-18 08:21 | 只看该作者
       状态机,一般指有限状态机(英语:finite-state machine,缩写:FSM)又称有限状态自动机(英语:finite-state automaton,缩写:FSA),是表示有限个状态以及在这些状态之间的转移和动作等行为的数学计算模型。有限状态机是在自动机理论和计算理论中研究的一类自动机。
       有限状态机归属于自动机理论范畴,从自动机理论的领域分层图可以看出,越往外层,概念越复杂。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表