MCU是AT89S51,然后用C51语言写一个以1毫秒为时间节拍,main函数采用状态机查询的程序架构
时间: 2024-04-30 21:18:24 浏览: 120
下面是一个使用C51语言编写的基于状态机查询的1毫秒节拍程序架构:
```c
#include <reg51.h>
#define TICK_MS 1 // 定义1毫秒的节拍时间
#define STATE_INIT 0 // 定义状态机初始状态
#define STATE_IDLE 1 // 定义状态机空闲状态
#define STATE_PROCESS 2 // 定义状态机处理状态
unsigned int tick = 0; // 定义全局变量tick,用于计时
void delay_ms(unsigned int ms)
{
unsigned int i, j;
for (i = 0; i < ms; i++)
for (j = 0; j < 114; j++); // 延时1毫秒
}
void timer0_init()
{
TMOD &= 0xF0; // 定时器0工作在模式1
TMOD |= 0x01;
TH0 = 0xFC; // 定时器0初值,1毫秒
TL0 = 0x66;
ET0 = 1; // 开启定时器0中断
EA = 1; // 全局中断使能
TR0 = 1; // 启动定时器0
}
void main()
{
unsigned char state = STATE_INIT; // 定义变量state,用于存储状态机状态
while (1)
{
switch (state) // 状态机查询
{
case STATE_INIT:
// 初始化操作
state = STATE_IDLE; // 跳转到空闲状态
break;
case STATE_IDLE:
// 空闲状态操作
break;
case STATE_PROCESS:
// 处理状态操作
break;
default:
state = STATE_IDLE; // 默认跳转到空闲状态
break;
}
}
}
void timer0_isr() interrupt 1
{
TH0 = 0xFC; // 重新赋值定时器0初值
TL0 = 0x66;
tick++; // 计时器加1
if (tick >= TICK_MS) // 判断时间是否到达1毫秒
{
tick = 0; // 计时器清零
state = STATE_PROCESS; // 时间到达1毫秒,跳转到处理状态
}
}
```
上述代码中,我们首先定义了 TICK_MS 宏来表示每个节拍的时间,然后定义了三个状态机状态:STATE_INIT、STATE_IDLE和STATE_PROCESS。在main函数中,我们不断地进行状态机查询,根据状态机的状态进行相应的操作。
在定时器中断函数timer0_isr中,我们首先重新赋值定时器0初值,然后计时器tick加1,如果计时器tick的值达到了TICK_MS,说明时间到达1毫秒,就将计时器tick清零,并跳转到处理状态STATE_PROCESS。在处理状态中,我们可以对一些任务进行处理,然后再跳转回空闲状态STATE_IDLE,等待下一个节拍的到来。
阅读全文