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

📄 transplant_5_tasks_with_arm7.txt

📁 transplant 5 tasks with ARM7
💻 TXT
字号:
#i nclude "config.h"
#i nclude "stdlib.h"
#define   LED1 (1 << 18)            // P1.18控制LED1
#define   LED2 (1 << 19)            // P1.19控制LED2
#define   LED3 (1 << 20)            // P1.20控制LED3
#define   LED4 (1 << 21)            // P1.21控制LED4
#define   LED5 (1 << 22)            // P1.22控制LED5
#define   LED6 (1 << 23)            // P1.22控制LED5
#define key1 (1<<16)///按键管脚定义
#define key2 (1<<17)///按键管脚定义
#define  TASK_STK_SIZE                  32////堆栈指针的长度
OS_STK        TaskSTK0[TASK_STK_SIZE];
OS_STK        TaskSTK1[TASK_STK_SIZE];
OS_STK        TaskSTK2[TASK_STK_SIZE];
OS_STK        TaskSTK3[TASK_STK_SIZE];
OS_STK        TaskSTK4[TASK_STK_SIZE];
OS_STK        TaskSTK5[TASK_STK_SIZE];
OS_EVENT *Uart0ReviceMbox;////邮箱指针
OS_EVENT *Uart1ReviceMbox;
OS_EVENT *Uart2ReviceMbox;
OS_EVENT *DispSem;//////信号量的定义   
void  Task0(void *pdata);//建立各个任务。将串口0对应邮箱的数据发送到串口0
void  Task1(void *pdata);//串口0接收函数,将接收数据送到邮箱1
void  Task2(void *pdata);//按键检测,将固定数据送到邮箱1
void  Task3(void *pdata);//按键检测,将固定数据直接发送到串口1
void  Task4(void *pdata);//串口1接收函数,将接收的数据直接发送到串口1 
void  Task5(void *pdata);//SPI总线,控制数码管显示固定的数据0-9
uint8 const ShowTable[11] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x00};
          //     0     1   2    3    4    5    6    7    8    9    
/*********************************************************************************************************
** 函数名称: PC_DispChar1
** 功能描述: 从UART0将缓冲区的数据发送出去。共发送5字节数据。
********************************************************************************************************/
        void PC_DispChar1(uint8 *cp)
{
    OS_ENTER_CRITICAL();
    UART0Putch(0xfE);
    UART0Putch(*cp++);
    UART0Putch(*cp++);
    UART0Putch(*cp++);
    UART0Putch(*cp++);
    OS_EXIT_CRITICAL();
}
/****************************************************************************************
    按键检测程序
功能描述: 检测按键,为按键检测后加系统OS延时函数 切换任务
*****************************************************************************************/
void key(void)
{
while((IO0PIN&key1)!=0) OSTimeDly(OS_TICKS_PER_SEC / 5);
OSTimeDly(OS_TICKS_PER_SEC / 10);/////
}
/****************************************************************************************
    按键检测程序
功能描述: 检测按键,为按键检测后加系统OS延时函数 帮助任务切换
*****************************************************************************************/
void k2()
{
while((IO0PIN&key2)!=0) OSTimeDly(OS_TICKS_PER_SEC / 5);
OSTimeDly(OS_TICKS_PER_SEC / 10);
}
/*********************************************************************************************************
** 函数名称: main
** 功能描述: c语言的主函数,由它启动多任务环境
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: PC_DispClrScr,OSInit,OSTaskCreate,OSStart
********************************************************************************************************/
        int main (void)
{   OSInit();
    OSTaskCreate(Task0, (void *)0, &TaskSTK0[TASK_STK_SIZE - 1], 0);
    OSStart();
    return 0;
}
/*********************************************************************************************************
** 函数名称: Task0
** 功能描述: μCOS-II的第一个任务,通常由它初始化目标板和建立其它任务
等待邮箱中的消息,有可用消息的时候,将邮箱内的消息指向的数组通过串口0发送出去.
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 
********************************************************************************************************/
        void  Task0(void *pdata)
{    uint8 *cp,err;
   PINSEL1 = PINSEL1 & (~(0x03 << 4));    // P1.18选择GPIO    
    IO1DIR |= LED1;                        // 设置LED1控制口输出
    IO1SET=LED1; 
    pdata = pdata;                                                  /* 避免编译警告 */
 Uart0ReviceMbox = OSMboxCreate(NULL);  // 建立邮箱0   /
    Uart1ReviceMbox = OSMboxCreate(NULL);       // 建立邮箱1     
    Uart2ReviceMbox = OSMboxCreate(NULL);       // 建立邮箱2   
    if( (Uart2ReviceMbox) == NULL)
    {
        while (1);
    }
    OSTaskCreate(Task1, (void *)0, &TaskSTK1[TASK_STK_SIZE - 1], 5);//任务1:接收串口0的数据
    //OSTaskCreate(Task2, (void *)0, &TaskSTK2[TASK_STK_SIZE - 1], 6);//任务2:按键检发送消息到邮箱
 OSTaskCreate(Task2, (void *)0, &TaskSTK2[TASK_STK_SIZE - 1], 6);//任务1:接收串口0的数据
    OSTaskCreate(Task3, (void *)0, &TaskSTK3[TASK_STK_SIZE - 1], 7);//任务3:串口1发送检测按键
    OSTaskCreate(Task4, (void *)0, &TaskSTK4[TASK_STK_SIZE - 1], 8);//任务4:串口1接收数据
    OSTaskCreate(Task5, (void *)0, &TaskSTK5[TASK_STK_SIZE - 1], 9);//任务4:串口1接收数据
    Uart0ReviceMbox = OSMboxCreate(NULL);  // 建立邮箱0   /
    
    for (;;) 
    { 
     
     cp = (uint8 *)OSMboxPend(Uart2ReviceMbox, 0, &err);         ///等待邮箱信息的发送
        IO1CLR=LED1; 
        OSTimeDly(OS_TICKS_PER_SEC/15  );
     IO1SET=LED1;
        OSTimeDly(OS_TICKS_PER_SEC/2  );
        UART0Write(cp,6);///将消息邮箱中的数据发送到串行口0
    }
} 
/*********************************************************************************************************
** 函数名称: Task1
** 功能描述: 串口0接收函数,接受到数据后LED3闪烁,并且将收到的数据发送消息到邮箱
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 
********************************************************************************************************/
        void  Task1(void *pdata)
{
    uint8 *cp;
    uint8 Buf[]={"你好我朋友"};
    uint8 temp, i;
    pdata = pdata;
    TargetInit();
    PINSEL1 = PINSEL1 & (~(0x03 << 8));    // P1.18选择GPIO    
    IO1DIR |= LED3;                        // 设置LED1控制口输出
    IO1SET  = LED3;
    for (;;)
    {
        while (UART0Getch() == 0x30)     /* 接收数据头 */    
        {
           //UART0Getch();
         *cp=0x30;
         Buf[0]=0x30;
            for (i = 1; i < 10; i++)
         {
          IO1CLR=LED3;
             OSTimeDly(OS_TICKS_PER_SEC/4  );
          IO1SET=LED3;
             OSTimeDly(OS_TICKS_PER_SEC / 4);
             temp = UART0Getch();////接收数据
             Buf[i] = temp;
         }
        OSMboxPost(Uart0ReviceMbox, (void *)Buf);////发送消息
      //////接受到数据后马上发送出去
     //  PC_DispChar1(Buf);///
   } 
      OSTimeDly(OS_TICKS_PER_SEC/20  );
    }
} 
/*********************************************************************************************************
** 函数名称:  Task2
** 功能描述: 按键检测发送函数,检测按键,LED2闪烁,并且将固定数据内的数据发送消息到邮箱.
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 
********************************************************************************************************/
     void Task2(void *pdata)
{
 uint8 BUF[]={"中国人民"};
 pdata = pdata;     
    PINSEL1 = PINSEL1 & (~(0x03 << 6));    // P1.18选择GPIO    
    IO1DIR |= LED2;                        // 设置LED1控制口输出
    IO1CLR  = LED2;
 OSTimeDly(OS_TICKS_PER_SEC/2 );
 IO1SET  = LED2;
 OSTimeDly(OS_TICKS_PER_SEC/2); 
     
    for(;;)
 { key();
  IO1CLR  = LED2;
     OSTimeDly(OS_TICKS_PER_SEC/2 );
     IO1SET  = LED2;
     OSTimeDly(OS_TICKS_PER_SEC/2);
    // UART0Write(BUF,8);       //串口1发送数据
     OSMboxPost(Uart0ReviceMbox, (void *)BUF);
 }
}


/*********************************************************************************************************
** 函数名称:  Task3
** 功能描述: 检测按键K2,检测按键后串口1发送数据,暂时不发送邮箱消息
** 输 入: 无
** 输 出: 无
** 全局变量: 无 
** 调用模块: 
********************************************************************************************************/
     void Task3(void *pdata)
{   uint8 BUF[]={"你好哈"};////需要发送的内容
    uint8 err,*cp;
    pdata = pdata;     
    PINSEL1 = PINSEL1 & (~(0x03 << 10));    // P1.18选择GPIO    
    IO1DIR |= LED4;                        // 设置LED1控制口输出
    IO1CLR  = LED4;
    OSTimeDly(OS_TICKS_PER_SEC / 4);
 IO1SET  = LED4;
    for(;;)
 { //k2();
     cp=(uint8 *)OSMboxPend(Uart0ReviceMbox, 0, &err);
     IO1CLR   = LED4;
     OSTimeDly(OS_TICKS_PER_SEC / 4);
     IO1SET  = LED4;
     OSTimeDly(OS_TICKS_PER_SEC / 4);
     UART0Write(BUF,6);       //串口1发送数据
    // OSMboxPost(Uart0ReviceMbox, (void *)BUF);////发送消息到串口1使用的邮箱
 }
}
/*********************************************************************************************************
** 函数名称:  Task4
** 功能描述: 串口1循环检测接收到数据后,驱动LED5闪烁,暂时不发送消息
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 
********************************************************************************************************/
     void Task4(void *pdata)
{  uint8 *cp;
    uint8 Buf[]={"你好吗"}; 
    uint8 temp, i;
    PINSEL1 = PINSEL1 & (~(0x03 << 12));    // P1.18选择GPIO    
    IO1DIR |= LED5;                        // 设置LED1控制口输出
    IO1CLR  = LED5;
    OSTimeDly(OS_TICKS_PER_SEC /4 );
 IO1SET  = LED5;
    pdata = pdata; 
    for (;;)
    {   cp = Buf;
        while (UART1Getch() == 0x30)///等待接收数据头0X30    
        { Buf[0]=0x30;
         for (i = 1; i < 10; i++)////////循环接收发来的数据
         { IO1CLR=LED5;
             OSTimeDly(OS_TICKS_PER_SEC /4 );
          IO1SET=LED5;
             OSTimeDly(OS_TICKS_PER_SEC / 4);
          temp = UART1Getch();////接收数据
             Buf[i] = temp;
         }
      OSTimeDly(OS_TICKS_PER_SEC /2);
         UART1Write(Buf,10);//将收到的数据再发送出去
       //OSMboxPost(Uart1ReviceMbox, (void *)Buf);////发送消息
      }
    OSTimeDly(OS_TICKS_PER_SEC / 20);
    }
}
/***************************************************************************************
** 函数名称:  Task5
** 功能描述: SPI函数 发送函数通过SPI接口控制数码管的显示
具体功能:设置定时器的初值,当定时器时间到,就刷新数码管的显示
AD转换。将AD转换的值,通过处理送到数码管上显示需要"参考电压"开发板上设置2.480V
*****************************************************************************************/
        void  Task5(void *pdata)
{   
 uint32 ADCDATA;
 uint8 buf[5], DataBuf[11];
    uint8 temp,i;
    pdata = pdata;                                                  // 避免编译警告
    IO0DIR = HC595_CS;
  PINSEL1 = PINSEL1 & (~(0x03 << 14));    // P1.18选择GPIO    
    PINSEL1 = (PINSEL1&(~(0x03<<28)))|(0x01<<28);//选择AD0.3
    IO1DIR |= LED6;                        // 设置LED1控制口输出
    IO1CLR  = LED6;
    OSTimeDly(OS_TICKS_PER_SEC /4 );
 IO1SET  = LED6;
    T1PR=0;
 T1MR0=Fpclk/2;
 T1MCR = 0x03;   // 禁止比较功能
 T1CCR = 0x00;   // 禁止捕获功能
 T1TCR = 0x01;   // 启动定时器
 AD0CR=     (1<<3)|
   ((Fpclk/1000000-1)<<8)|
        (0<<16)|
        (0<<17)|
        (1<<21)|
        (0<<22)|
        (1<<24)|
        (0<<27);
     ADCDATA=AD0DR;

    for (;;)
    {
        for (i = 0; i < 10; i++)
        { 
         AD0CR|=1<<24;
   while((AD0DR&0X80000000)==0);
   AD0CR|=1<<24;
   while((AD0DR&0X80000000)==0);
   OSTimeDly(OS_TICKS_PER_SEC /50);
            ADCDATA=AD0DR;
   ADCDATA=(ADCDATA>>6)&0X3FF;//调整结果保留结果位
   buf[4]=0XFF;
   buf[3]=(ADCDATA%10);
   buf[2]=(ADCDATA/10%10);
   buf[1]=(ADCDATA/100%10);
   //buf[0]=(ADCDATA/1000%10);
   UART0Write(buf,5);
   OSTimeDly(OS_TICKS_PER_SEC / 100 + 1);
            SPIStart();
            IO0CLR = HC595_CS;
            SPIRW(&temp,~ShowTable[buf[1]]);
            IO0SET = HC595_CS;
            SPIEnd();
         while((T1IR&0X01)==0);
   T1IR=0X01;
   if((IO1SET&LED6)==0) IO1SET=LED6;
   else IO1CLR=LED6;
  }
  for (i = 0; i < 10; i++)
     {
         DataBuf[i] = 10-i;
     }
    DataBuf[0] = 0;                                 // 扩展地址
    //I2cWrite(CAT1025, DataBuf, 11);//
    OSTimeDly(OS_TICKS_PER_SEC / 100 + 1);
    for (i = 0; i < 10; i++)
     {
         DataBuf[i] = i;
     }
    I2cRead(CAT1025, DataBuf, DataBuf, 1, 11);
    //UART1Write(DataBuf,10);
   
 }
     
  
}

⌨️ 快捷键说明

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