⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 555.c

📁 555定时器计数程序
💻 C
字号:
#include <AT89X51.h>
#define MAX_TASKS 3//任务槽个数.在本例中并未考虑任务换入换出,所以实际运行的任务有多少个,就定义多少个任务槽,不可多定义或少定义
//任务的栈指针
unsigned char idata task_sp[MAX_TASKS];
#define MAX_TASK_DEP 12 //最大栈深.最低不得少于2个,保守值为12.
						//预估方法:以2为基数,每增加一层函数调用,加2字节.如果其间可能发生中断,则还要再加上中断需要的栈深.
						//减小栈深的方法:1.尽量少嵌套子程序 2.调子程序前关中断.
unsigned char idata task_stack[MAX_TASKS][MAX_TASK_DEP];//任务堆栈.
unsigned char task_id;//当前活动任务号
unsigned char xdata porta _at_ 0x8fff;
unsigned char xdata portb _at_ 0x9fff;
unsigned char xdata portc _at_ 0xafff;
unsigned char xdata caddr _at_ 0xbfff;
unsigned char xdata *a _at_ 0x0060;
unsigned char xdata *b _at_ 0x0065;
unsigned char xdata *c _at_ 0x0070;
unsigned char num[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
static unsigned char n0;
static unsigned char n1;
static unsigned char n2;   
unsigned int n;
//任务切换函数(任务调度器)
void task_switch(){
	task_sp[task_id] = SP;
	if(++task_id == MAX_TASKS)
		task_id = 0;
	SP = task_sp[task_id];
}
//任务装入函数.将指定的函数(参数1)装入指定(参数2)的任务槽中.如果该槽中原来就有任务,则原任务丢失,但系统本身不会发生错误.
void task_load(unsigned int fn, unsigned char tid){
	task_sp[tid] = task_stack[tid] + 1;
	task_stack[tid][0] = (unsigned int)fn & 0xff;
	task_stack[tid][1] = (unsigned int)fn >> 8;
}
//从指定的任务开始运行任务调度.调用该宏后,将永不返回.
#define os_start(tid) {task_id = tid,SP = task_sp[tid];return;}
void task1(){
	while(1){//任务必须为死循环,不得退出函数,否则系统会崩溃
	static  unsigned char i;
	 i=TL0;
	 n0=i/100;
	 n1=(i-n0*100)/10;
	 n2=(i-n0*100-n1*10);
	 *b=0x7f;
	 *a=num[n2];
	 for (n=0;n<100;n++);
	 task_switch();
	// delayms(100);
	}
}
void task2(){
	while(1){//任务必须为死循环,不得退出函数,否则系统会崩溃
	     *b=0xbf;
     	*a=num[n1];
	   //	 delayms(4);
			 for (n=0;n<100;n++);
		task_switch();//释放CPU一会儿,让其它进程有机会运行.如果去掉该行,则别的进程永远不会被调用到
	}
}
void task3(){
	while(1){//任务必须为死循环,不得退出函数,否则系统会崩溃
		*b=0xdf;
		*a=num[n0];
	   	 for (n=0;n<100;n++);
		task_switch();//释放CPU一会儿,让其它进程有机会运行.如果去掉该行,则别的进程永远不会被调用到
	}
}
void main(){
	//这里装载了三个任务,因此在定义MAX_TASKS时也必须定义为3
	c=&caddr;
	*c=0x80;
	a=&porta;
	b=&portb;
	TMOD=0x06;
	TH0=0x00;
	TL0=0x00;
	TR0=1;
	c=&portc;
	*c=0xff;
task_load(task1, 0);//将task1函数装入0号槽
	task_load(task2, 1);//将task2函数装入1号槽
	task_load(task3, 2);//将task3函数装入2号槽
	os_start(0);//启动任务调度,并从0号槽开始运行.参数改为1,则首先运行1号槽.
				//调用该宏后,程序流将永不再返回main(),也就是说,该语句行之后的所有语句都不被执行到.
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -