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

📄 main.c

📁 在C8051F060上实现嵌入式系统ucos
💻 C
字号:
#include "..\ucos-ii\includes.h" 


static INT16U 	count_t2=2000;	//定时2的1000次 就是1秒/亮
static INT16U   count_prit=20;	//在任务6中用着调试print用的参数。

sbit LED_GRE=P2^0;
sbit LED_RED=P2^1;

						//start/alarm /sec /min /hour /day  /week /month /year
INT8U code	Clock_buf[9]={0x01, 0x00, 0x10,0x40,0x08, 0x1B, 0x05, 0x02,  0x09}; 

void TaskStart(void* ppdata) reentrant;
void Task_GRE(void* ppdata) reentrant;	
void Task_RED(void* ppdata) reentrant;

OS_STK TaskStkStart[MaxStkSize];  //MaxStkSize=100
OS_STK TaskStk_GRE[MaxStkSize];
OS_STK TaskStk_RED[MaxStkSize];

void TMR2_ISR(void) reentrant;


/*******************结构体定义************************/
struct real_time
{	 
     INT8U  year;
	 INT8U  month;
	 INT8U  day;
	 INT8U  hour;
	 INT8U  min;
	 INT8U  sec;

}R_time;

void main(void)
{ 
    
   config(); //要关看门狗
    OSInit();	

  OSTaskCreate(TaskStart, (void *)0, TaskStkStart,5); 
   EA=1;

  OSStart();
}

void TaskStart(void* ppdata) reentrant
{
//   INT8U k;
   char SFRPAGE_SAVE;
   SFRPAGE_SAVE = SFRPAGE; 


   ppdata=ppdata;

   
   InitTimer0();
   ET0=1;

   I2cInit();
   PCF8563_init();

   

   OSTaskCreate(Task_GRE, (void *)0,TaskStk_GRE,6); 
 //  OSTaskCreate(Task_RED, (void *)0, TaskStk_RED,7); 
   for(;;)
   {
   	
	LED_RED=~LED_RED;
	PCF8563_Read();
   
	SFRPAGE = UART0_PAGE;
 /*
	 printf("******YEAR:  20%d\n",R_time.year);
	 printf("******MONTH: %d\n",R_time.month);
	 printf("******DAY:   %d\n",R_time.day);
	 printf("******MINITUE:  %d\n",R_time.min);
	 printf("******SECOND:  %d\n",R_time.sec);
	

	SFRPAGE =SFRPAGE_SAVE; 
  */
    OSTimeDly(2*OS_TICKS_PER_SEC);
   }
}

void Task_GRE(void* ppdata) reentrant
{ 
   char SFRPAGE_SAVE;
   SFRPAGE_SAVE = SFRPAGE;   
    
   ppdata=ppdata;
  
   for(;;)
   {
     //LED_GRE=~LED_GRE;
	  SFRPAGE = UART0_PAGE;
	 count_prit--;
	 printf("******number of task_entering: %d\n",count_prit);
	 if(count_prit==10)
	 {
        count_prit=20;
	 }

     
	  SFRPAGE =SFRPAGE_SAVE ;
	 OSTimeDly(OS_TICKS_PER_SEC);
   }
   
   
}
	
void Task_RED(void* ppdata) reentrant
{  
   ppdata=ppdata;
   for(;;)
   {
     //LED_RED=~LED_RED;
	 OSTimeDly(12);
   }
}

void TMR2_ISR(void)  reentrant
{
 char SFRPAGE_SAVE;

   SFRPAGE_SAVE = SFRPAGE;             // Preserve SFRPAGE
   SFRPAGE   = TMR2_PAGE;
  count_t2--;
  if(count_t2==0)
  { 
      count_t2=2000;
      LED_GRE=~LED_GRE;     
  }

  TF2=0;
  SFRPAGE =SFRPAGE_SAVE ;

   
}


/****************************************************************************	
* 功    能:读取PCF8563时钟芯片内寄存器数据
*---------------------------------------------------------------------------*
* 入口参数:nil
* 出口参数:nil
****************************************************************************/

void PCF8563_Read(void)	reentrant
{	 
				 	
		R_time.year=I2C_ReadData(0x08,0xff);  //读取year,屏蔽高7~5位(7~5无效)		  	  

		R_time.month=I2C_ReadData(0x07,0x1f);	//读取month,屏蔽高7~5位(7~5无效) 	

		R_time.day=I2C_ReadData(0x05,0x3f);	  //读取day,屏蔽高7-6位(7-6无效) 		
		
	    R_time.hour=I2C_ReadData(0x04,0x3f);  //读取小时,屏蔽高7-6位(7-6无效)		
		
		R_time.min=I2C_ReadData(0x03,0x7f);	  //读取分钟,屏蔽高7位(7无效)	 		

		R_time.sec=I2C_ReadData(0x02,0x7f);	 //读取秒,屏蔽高7位(7无效)	

}

INT8U I2C_ReadData(INT8U reg,INT8U mark) reentrant
{
	 INT8U cur_tmr; 
	
	 cur_tmr=SM_Receive(PCF_R_ADD, reg,SINGLE_ADD) &mark;
	 cur_tmr=Bcd2Decimal(cur_tmr);//转换为十进制

	 return cur_tmr;

}

INT8U Bcd2Decimal(INT8U bcd_dat)  reentrant
{
	 INT8U num1,num2;

	 num1=bcd_dat/16;
	 num2=bcd_dat%16;

	 return (num1*10+num2);	
}

void PCF8563_init(void)	reentrant
{
  INT8U  i=0;	 

  i=SM_Receive(PCF_R_ADD, 0x00,SINGLE_ADD);	

	if(i!=0x01)	//没有初始化
	 { 		
			//start/alarm /sec /min /hour /day  /week /month /year
				
			for(i=0;i<9;i++)
			{
				SM_Send(PCF_W_ADD, i,SINGLE_ADD, Clock_buf[i]);  //启动时钟
				OSTimeDly(3);//delay 30ms
			}
					//设置报警及定时器中断,定时器中断为脉冲形

⌨️ 快捷键说明

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