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

📄 ex1.c

📁 51单片机嵌入ucos实例.通过此模块可以对其它型号的51系列单片机进行移值
💻 C
字号:
//-------------------------------------包涵文件
#include "..\uc_os_II\includes.h"
#include "..\Ex1_Keil\ucos51_bl.h"

//-------------------------------------定义任务堆栈大小
OS_STK xdata KEYStack[CPU_MAX_STK_SIZE];						//定义OS_STK堆栈类型,存放于xdata连续空间,大小为CPU_MAX_STK_SIZE的数组中
OS_STK xdata SPKStack[CPU_MAX_STK_SIZE];
OS_STK xdata LEDStack[CPU_MAX_STK_SIZE];

//-------------------------------------函数定义
void fsbyte(INT8U byte);
//-------------------------------------按键扫描(10ms-100ms)
void jianpan(void xdata * ppdata) reentrant
{
	ppdata = ppdata;
	while(1)
	{
		if(P1&128)
		{
			keyys=0,keyok=0;
			OSTimeDly(10);//100ms
		}
		else
		{
			OSTimeDly(1);//10ms
			keyys++;
			if(keyys>=5 & keyok==0)//连按无效
			{
				keyok=1;
				sycd=10,syyx=1;
				keyys=0,key++;
				if(key>=100)	key=0;
			}
		}
	}
}

//-------------------------------------喇叭程序(10ms)
void SPK(void xdata * ppdata) reentrant
{
	ppdata = ppdata;
	while(1)
	{
		OSTimeDly(1);
		if(syyx==1)
		{
			P3|=1;
			if(sycd>0)
			{
				sycd--;
			}
			else
			{
				syyx=0;
				P3&=254;
			}
		}
		else
		{
			sycd=0,P3&=254;
		}
	}
}

//-------------------------------------LED扫描(2ms)
void LedSM(void xdata * ppdata) reentrant
{
unsigned char err=0;
	ppdata = ppdata;
	while(1)
	{
		OSMboxPend (LEDSM,0,&err);
		js100++;
		P1&=252;
		switch(ledfen)
		{
			case 0:
			{//个位扫描
				ledfen=1;
				fsbyte(LED[ge]);
				P1|=1;
			}
			break;

			case 1:
			{//十位扫描
				ledfen=0;
				fsbyte(LED[shi]);
				P1|=2;
			}
			break;

			default:
				ledfen=0;
		}

		if(js100>=50)
		{//100ms
			js100=0;
			ge=key%10;
			shi=key/10;
			if(shi==0)	shi=10;
		}

	}
}

//-------------------------------------字节发送器
void fsbyte(INT8U byte)
{
unsigned char fsjsq=0;
	for(fsjsq=0;fsjsq<8;fsjsq++)
 	{
	 	P1&=251; 			//CLK=0
	  	P1|=((byte<<fsjsq)&128)>>4;
	  	P1|=4; 				//CLK=1	
		P1&=247;
   	}
}

//-------------------------------------参数初始化
void ParameterInitial()
{
	//计数器
	time0=0;
	
	//按键
	keyys=keyok=key=0;
	
	//led分配器
	ledfen=0;
	js100=0;
	
	//100ms计数器清空
	js100=0;
	
	//声音
	sycd=0;syyx=0;

	//LED表
	//0		  ;1 		 ;2			;3		   ;4
	LED[0]=192;LED[1]=249;LED[2]=164;LED[3]=176;LED[4]=153;
	//5		  ;6 		 ;7		    ;8		   ;9
	LED[5]=146;LED[6]=130;LED[7]=248;LED[8]=128;LED[9]=144;
	//Nothing ;
	LED[10]=255;
	
	//邮箱
	LEDSM=OSMboxCreate((void*)0);
}

//-------------------------------------定时中断初始化
void InterruptInitial()
{
	/* set timer. 50ms, THTL = 3caf when cpu at 12MHz */
	TMOD = 0x01;						//2ms,mode 1,16 bits
	TH0 = TIMER_24M_25MS_H;
	TL0 = TIMER_24M_25MS_L;
	/* TR0 is set in OSStart() */
	ET0 = 1;
}

//-------------------------------------主函数
main()
{
	InterruptInitial();
    OSInit();

	ParameterInitial();

	OSTaskCreate(LedSM, 	(void xdata *)0, &LEDStack[0],	1);
    OSTaskCreate(jianpan, 	(void xdata *)0, &KEYStack[0],	2);
	OSTaskCreate(SPK, 		(void xdata *)0, &SPKStack[0],	3);
 	OSStart();
}

⌨️ 快捷键说明

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