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

📄 ex1.c

📁 uc/osII基于51单片机的时钟
💻 C
字号:
#include "..\uc_os_II\includes.h"
#define uchar unsigned char
#define uint unsigned int

sbit LED1=P1^3;
sbit LED2=P3^2;
sbit LED3=P2^4;
sbit LED4=P2^3;
sbit CLK=P1^4;
sbit DAT=P1^5;
uchar code seg[10]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x19};
uchar disp[6];//显示缓冲区
unsigned char count1;
struct {unsigned char h;
        unsigned char m;
        unsigned char s;
       }run_time={0,0,0};

OS_STK xdata Task1Stack[CPU_MAX_STK_SIZE];
OS_STK xdata Task2Stack[CPU_MAX_STK_SIZE];
void SendTime(void) reentrant
{TI=0;
 SBUF=run_time.h;
 while(TI==0);
 TI=0;
 SBUF=run_time.m;
 while(TI==0);
 TI=0;
 SBUF=run_time.s;
 while(TI==0);

}
void delay(int t)//延时子程序
{int i,j;
 for(i=0;i<t;i++)
    for (j=0;j<100;j++);    
}



void Moni_Send(uchar dsdata) 
 {uchar i,temp=0;

	CLK=0;
		for(i=0;i<=7;i++)
		{
			temp=dsdata&0x01;
			dsdata=dsdata>>1;
			if(temp==0)
				DAT=0;
			else
				DAT=1;   //置数据在端口上

			CLK=1;  //发出移位脉冲
			CLK=0;
		}
	
 }
void disp_num(uchar num)
{disp[0]=seg[num%10];  //ge wei
 disp[1]=seg[num/10];  //shi wei
 Moni_Send(disp[1]);
 Moni_Send(disp[0]);
 
}

void Task1(void xdata * ppdata) reentrant
{
	ppdata = ppdata;
	while(1)
	{
		OSTimeDly(50); 
        count1++;  
        if(count1>5)
        {count1=0;     
         LED4=~LED4;
        
        } 
        if(run_time.s>=59)
         {run_time.s=0;
              if(run_time.m>=59)
               {run_time.m=0;
                   if(run_time.h>=23)run_time.h=0;
                   else run_time.h++;
               }
              else
              { run_time.m++;
              }
        }
        else
        { run_time.s++;
        }

       // LED3=~LED3;        
        disp_num(run_time.h);
        disp_num(run_time.m);
        disp_num(run_time.s);
		printf("\nTASK1 IS ACTIVE");
	}
}

void Task2(void xdata * ppdata) reentrant
{
	ppdata = ppdata;
	while(1)
	{
		OSTimeDly(50);  
        OS_ENTER_CRITICAL();
        SendTime();
        OS_EXIT_CRITICAL(); 
        LED1=~LED1;   
		printf("\n TASK2 IS ACTIVE");
	}
}
void SerialInitial()
{
	/* set TI to 1, set TR1 to 1 */
	SCON = 0x52;/* SM0 SM1 =1 SM2 REN TB8 RB8 TI RI */
	TMOD = 0x20;/* GATE=0 C/T-=0 M1 M0=2 GATE C/T- M1 M0 */
	TH1 = 0xE6;	/* TH1=E6 4800bit/s when at 24MHz,TH1=F3,9600bit/s,24MHz */
	PCON = 0x80;
	TCON = 0x40;/* 01101001 TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT */
}
void InterruptInitial()
{
	/* set timer. 50ms, THTL = 3caf when cpu at 12MHz */
	TMOD |= 0x01;
	TH0 = 0x70;
	TL0 = 0x00;
	/* TR0 is set in OSStart() */
	ET0 = 1;
}
main()
{
	SerialInitial();
	InterruptInitial();
    OSInit();
    printf("\nstart");
    OSTaskCreate(Task1, (void xdata *)0, &Task1Stack[0],2);
	OSTaskCreate(Task2, (void xdata *)0, &Task2Stack[0],3);
    OSStart();
}

⌨️ 快捷键说明

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