用单片机不同 IO 脚输出 1Hz,5Hz,10Hz,20Hz 方波信号 关键字:单片机 C语言 51 多任务
for(i=0;i<MAX_TASK;i++)task_delay=0;for(i=0;i<MAX_TASK;i++)if(task_delay)task_delay--...
for(i=0;i<MAX_TASK;i++) task_delay=0;
for(i=0;i<MAX_TASK;i++) if(task_delay) task_delay--;
这两处 task_delay不是数组吗 这里是怎么用的?
怎么实现4个任务分别计数的?
(task0到4省略了)
任务要求:用单片机不同 IO 脚输出 1Hz,5Hz,10Hz,20Hz 方波信号
#include "reg51.h"
#define TIME_PER_SEC 200 //定义任务时钟频率,200Hz
#define CLOCK 22118400 //定义时钟晶振,单位Hz
#define MAX_TASK 4 //定义任务数量
extern void task0(void); //任务声明
extern void task1(void);
extern void task2(void);
extern void task3(void);
sbit f1Hz = P1^0; //端口定义
sbit f5Hz = P1^1;
sbit f10Hz = P1^2;
sbit f20Hz = P1^3;
unsigned char task_delay[4]; //任务延时变量定义
//定时器0初始化
void timer0_init(void)
{
unsigned char i;
for(i=0;i<MAX_TASK;i++) task_delay=0; //任务延时量清零
TMOD = (TMOD & 0XF0) | 0X01; //定时器 0工作在模式 1, 16Bit定时器模
式
TH0 = 255-CLOCK/TIME_PER_SEC/12/256;
TL0 = 255-CLOCK/TIME_PER_SEC/12%256;
TR0 =1;
ET0 =1; //开启定时器和中断
}
// 系统 OS定时中断服务
void timer0(void) interrupt 1
{
unsigned char i;
TH0 = 255-CLOCK/TIME_PER_SEC/12/256;
TL0 = 255-CLOCK/TIME_PER_SEC/12%256;
for(i=0;i<MAX_TASK;i++) if(task_delay) task_delay--;
//每节拍对任务延时变量减1 ,减至 0 后,任务就绪。
}
void main(void)
{
timer0_init();
EA=1;//开总中断
while(1)
{
if(task_delay[0]==0) {task0(); task_delay[0] = TIME_PER_SEC/ 2;}
//要产生 1hz 信号,翻转周期就是 2Hz,以下同
if(task_delay[1]==0) {task1(); task_delay[1] = TIME_PER_SEC/10;}
if(task_delay[2]==0) {task2(); task_delay[2] = TIME_PER_SEC/20;}
if(task_delay[3]==0) {task3(); task_delay[3] = TIME_PER_SEC/40;}
}
} 展开
for(i=0;i<MAX_TASK;i++) if(task_delay) task_delay--;
这两处 task_delay不是数组吗 这里是怎么用的?
怎么实现4个任务分别计数的?
(task0到4省略了)
任务要求:用单片机不同 IO 脚输出 1Hz,5Hz,10Hz,20Hz 方波信号
#include "reg51.h"
#define TIME_PER_SEC 200 //定义任务时钟频率,200Hz
#define CLOCK 22118400 //定义时钟晶振,单位Hz
#define MAX_TASK 4 //定义任务数量
extern void task0(void); //任务声明
extern void task1(void);
extern void task2(void);
extern void task3(void);
sbit f1Hz = P1^0; //端口定义
sbit f5Hz = P1^1;
sbit f10Hz = P1^2;
sbit f20Hz = P1^3;
unsigned char task_delay[4]; //任务延时变量定义
//定时器0初始化
void timer0_init(void)
{
unsigned char i;
for(i=0;i<MAX_TASK;i++) task_delay=0; //任务延时量清零
TMOD = (TMOD & 0XF0) | 0X01; //定时器 0工作在模式 1, 16Bit定时器模
式
TH0 = 255-CLOCK/TIME_PER_SEC/12/256;
TL0 = 255-CLOCK/TIME_PER_SEC/12%256;
TR0 =1;
ET0 =1; //开启定时器和中断
}
// 系统 OS定时中断服务
void timer0(void) interrupt 1
{
unsigned char i;
TH0 = 255-CLOCK/TIME_PER_SEC/12/256;
TL0 = 255-CLOCK/TIME_PER_SEC/12%256;
for(i=0;i<MAX_TASK;i++) if(task_delay) task_delay--;
//每节拍对任务延时变量减1 ,减至 0 后,任务就绪。
}
void main(void)
{
timer0_init();
EA=1;//开总中断
while(1)
{
if(task_delay[0]==0) {task0(); task_delay[0] = TIME_PER_SEC/ 2;}
//要产生 1hz 信号,翻转周期就是 2Hz,以下同
if(task_delay[1]==0) {task1(); task_delay[1] = TIME_PER_SEC/10;}
if(task_delay[2]==0) {task2(); task_delay[2] = TIME_PER_SEC/20;}
if(task_delay[3]==0) {task3(); task_delay[3] = TIME_PER_SEC/40;}
}
} 展开
1个回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询