第八集定时器周期性调度任务
1.周期性任务介绍
2.文件的创建(.c和.h)
3.结构体的介绍
4.结构体数组的周期性任务调度
任务1
用一个定时器实现这个任务。LED1实现0.3秒取反一次,LED2实现0.6秒取反一次,LED3 0.9秒取反一次
解法:通过一个变量计数,假设这个变量1ms自加一次,加到300即为300ms,加到600就是600ms,计数到达后重新清0。
//while循环
while(1)
{
if(count1>=300)
{
state1 = !state1;//LED1的状态
P00 = state1;
count1 = 0;//计数清零
}
if(count2>=600)
{
state2 = !state2;//LED2的状态
P01 = state2;
count2 = 0;//计数清零
}
if(count3>=900)
{
state3 = !state3;//LED3的状态
P03 = state3;
count3 = 0;//计数清零
}
}
//定时器初始化
void Timer0_Init(void) //1毫秒@24.000MHz
{
TM0PS = 0x00; //设置定时器时钟预分频
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x30; //设置定时初始值
TH0 = 0xF8; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
}
//定时器中断
void Timer0_Isr(void) interrupt 1 //1MS执行一次
{
count1++;//计数1
count2++;//计数2
count3++;//计数3
}
任务2
数组点亮LED,实现流水灯
state[8] = [0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80];//P0的状态
num = 0;//循环计数
//定时器中断
void Timer0_Isr(void) interrupt 1 //1MS执行一次
{
count1++;//计数1
}
//while循环
while(1)
{
if(count1>=500)//500ms变化一次
{
state1 = ~state[num];//LED的状态
P0 = state1;
count1 = 0;//计数清零
num++;
if(num > 7)//循环清零
{
num = 0;
}
}
}
任务3:按键1按一下,LED通过数组移动一下;
注意事项:
按键不能在通过while判断是否按下松开了
可以通过按键按下计数
state[8] = [0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80];//P0的状态
num = 0;//循环计数
//定时器中断
void Timer0_Isr(void) interrupt 1 //1MS执行一次
{
count1++;//计数1
}
//while循环
while(1)
{
if(count1>=5)//5ms检测一次
{
state1 = ~state[num];//LED的状态
P0 = state1;
count1 = 0;//计数清零
if(P32 == 0)//按键按下检测
{
key_num++;//按下时间计数
if(key_num == 10)//50ms持续按下
{
num++;
if(num > 7)
{
num = 0;
}
}
}
else
{
key_num = 0;
}
}
}