开发平台:AVR128
移植系统:uC/OS-II
功能: 系统建立两个任务,操作“8个LED” 以及 “蜂鸣器”(附上LED和蜂鸣器 部分的原理图)
代码量少,添加了个人注释,容易理解
电路原理图如下:
此工程为TS8900-M128开发板uCOSii移植教程代码
功能是
1--8个LED进行“亮-灭”操作
2--控制蜂鸣器“响-不响”操作
单片机源程序如下:
/*
***********************************Copyright(c)*****************************
*
* All Rights Reserved
*
*
*---------------------------------File Info---------------------------------
*File Name : main.c
*Descriptor : 主程序
*Create By :
*Create Date : 2008-9-26
*Version : V1.0
*Note :
*
*---------------------------------------------------------------------------
*Modified By :
*Modified Date :
*Version :
*Note :
*
****************************************************************************
*/
#define _IN_MAIN_
#include "config.h"
#define OS_TASK_MAIN_STK_SIZE 200
#define OS_TASK_MAIN_HARD_STK_SIZE 40
#define OS_TASK2_STK_SIZE 200
#define OS_TASK2_HARD_STK_SIZE 40
OS_STK TaskMainStk[OS_TASK_MAIN_STK_SIZE];
OS_STK Task2Stk[OS_TASK2_STK_SIZE];
void* MainMsg[16];
/***************************************************************************
*Function Name :OSTickISRInit
*Description :系统时钟初始化
*Input parameters :
*Return Values: :
*Global Variables :
*Calling Modules :
***
*Create By :
*Create Tate :2008-9-26
***
*Modified By :
*Modified Date :
*Note :
****************************************************************************/
void OSTickISRInit(void)
{
TCNT0 = 0x00;//将“定时计数器0”清零
OCR0 = TCNT0_INIT;// “OCR0”为“输出比较寄存器0”
TCCR0 = TMC8_CK128;// “TCCR0”为“定时计数器0的控制寄存器” WGM01 = 3 ;CS02 = 2 ; CS00 = 0 ; BIT(x) (1 << (x)) ,即有TCCR0 = (1<<3)|(1<<2)|(1<<0) ,
// --设定“CTC--匹配时清楚定时计数器”模式、“COM01- COM00--正常端口操作”、“CS02-CS01-CS00--时钟选择位定义为系统时钟128分频”
TIMSK = BIT(OCIE0);// “TIMSK-定时计数器中断屏蔽寄存器”;“OCIE0 = 1” ;使能“定时计数器0” 的输出比较匹配中断。
}
/***************************************************************************
*Function Name :MainTask
*Description :主线程任务
*Input parameters :
*Return Values: :
*Global Variables :
*Calling Modules :
***
*Create By :
*Create Tate :2008-9-26
***
*Modified By :
*Modified Date :
*Note :
****************************************************************************/
void Task2(void* pData);
/***************************************************************************
“主任务”的主要“任务代码”
****************************************************************************/
void MainTask(void* pData)
{
uint8 byTemp = 0xff;
pData = pData;
DDRA = 0xff;// --GpioA引脚方向为“输出”
DDRE = 0xff;// --GpioE引脚方向为“输出”
OSTickISRInit();// --系统时钟初始化
OSTaskStkSize = OS_TASK2_STK_SIZE;// --为第二个任务配置“堆栈大小”以及“硬件堆栈大小”
OSTaskHardStkSize = OS_TASK2_HARD_STK_SIZE;
OSTaskCreate(Task2, (void*)0, (OS_STK*)&Task2Stk[OS_TASK2_STK_SIZE - 1], 1);// --建立“次任务”,优先级为1
while(TRUE)
{
byTemp = ~byTemp;// --将定义的字节取反,用于对LED输出相反的电平,即“亮-灭”
PORTA = byTemp;// --将值从GpioA 发送出去
PORTE = 0x00;// --将74HC573的“LE-锁存引脚”拉低,将数据填到74HC573的寄存器中
PORTE = 0xff;// --将“LE”拉高,执行直通模式
OSTimeDlyHMSM(0, 0, 0, 600);// --执行“任务延时”,等系统执行其他“最高优先级”的任务
//(在优先级为0的“主任务”处于等待状态”,那么当前的“最高优先级”任务就是“Task2”)
}
}
/***************************************************************************
*Function Name :Task2
*Description :
*Input parameters :
*Return Values: :
*Global Variables :
*Calling Modules :
***
*Create By :
*Create Tate :2008-9-26
***
*Modified By :
*Modified Date :
*Note :
****************************************************************************/
void Task2(void* pData)
{
pData = pData;
DDRG |= BIT(4);// --0x10 GpioG^4 设置为输出,控制“蜂鸣器”的引脚
while(TRUE)
{
PORTG ^= BIT(4);
OSTimeDlyHMSM(0, 0, 1, 0);
}
}
/***************************************************************************
*Function Name :main
*Description :主函数
*Input parameters :
*Return Values: :
*Global Variables :
*Calling Modules :
***
*Create By :
*Create Tate :2008-9-26
***
*Modified By :
*Modified Date :
*Note :
****************************************************************************/
void main(void)
{
OSTaskStkSize = OS_TASK_STK_SIZE;// --设置堆栈的总空间
OSTaskHardStkSize = OS_TASK_HARD_STK_SIZE;// --设置硬件堆栈空间(AVR单片机)
OSInit();// --uCOSII初始化
上一篇:SPI协议工作过程详解文档,内含实例代码
下一篇:AVR内部EEPROM读写程序-先写入数据,然后读出来,看是否一致