ysp5318
发表于 2025-1-8 09:07:12
wlhet 发表于 2025-1-7 18:24
心愿有点难积累
{:4_250:}确实是积累不易。但如果必须也只有在所不惜了。
ysp5318
发表于 2025-1-8 09:12:35
wlhet 发表于 2025-1-7 18:23
好难得看见被禁言的
你好,是什么情况会被禁言?{:4_267:}
wlhet
发表于 2025-1-8 09:19:57
ysp5318 发表于 2025-1-8 09:12
你好,是什么情况会被禁言?
不知道 你得去问管理员
_奶咖君_
发表于 2025-1-8 09:22:49
wlhet 发表于 2025-1-7 18:24
心愿有点难积累
签到 69天都应该有200+的心愿了{:4_200:}
wlhet
发表于 2025-1-8 09:25:03
_奶咖君_ 发表于 2025-1-8 09:22
签到 69天都应该有200+的心愿了
哈哈 我这不止哦算下来加上回复那些 都有700左右啦
_奶咖君_
发表于 2025-1-8 09:28:23
wlhet 发表于 2025-1-8 09:25
哈哈 我这不止哦算下来加上回复那些 都有700左右啦
所以你已经换过东西啦?我看你这里积分只有700+ 照理说应该在1300+
wlhet
发表于 2025-1-8 09:39:27
_奶咖君_ 发表于 2025-1-8 09:28
所以你已经换过东西啦?我看你这里积分只有700+ 照理说应该在1300+
AI8051-DIP40 屠龙刀 还有擎天柱 还有个 usb转双串 1300是没得的709=69*2 + 545 + 13 *2
zhange
发表于 2025-1-8 10:26:22
这个坑可以入{:4_188:}{:4_188:}{:4_188:}
ysp5318
发表于 2025-1-10 16:54:25
今天回过头再学习《定时器周期性调度任务》
这课内容多,知识点基础性强,非常重要。准备反复再学。
一,所谓定时器周期性调度任务,如果每隔一定的时间重复执行一遍定时函数,这就是定时器周期性任务。如何用一个定时器实现多个任务呢。可以將定时器初始化函数定为1毫秒,根据任务数新建所需变量(注意变量类型注意长度)。让他们在定时器中断函数自动计数,计数到达后重新清0。再將任务变量的状态输出,实现多任务的调度。
二,引入数组的功能,用不一样的方法,可以简单一点实现以上任务。数组使用分为如下两步:
1.定义
类型 名称[长度] = { 数值 };
2.使用
赋值:名称[索引] = 数值,注意索引从0开始。
在调用数组的时候只要名称加索引然后直接一个等号就可以给他赋值,调用的时候就直接调用他的这个变量。
三,前面的三个计时变量可以运用for语句在定时器中断函数中实现自加并输出变量状态。
void Timer0_Isr(void) interrupt 1 //1MS执行一次
{
for(i=0; i<3; i++)
{
Count_ms++;
if( Count_ms >= 300 )
{
Count_ms=0;
State1 = !State1;
P00 = State1;
}
}
}
......待续,明天再来。
ysp5318
发表于 2025-1-11 16:03:31
今天接着再学习《定时器周期性调度任务》
昨天在周期性任务介绍中已经知道如何通过数组用一个定时器实现多个任务和流水灯。
今天学习:
一,任务3按键1按一下,LED通过数组移动一下重点:按键不能在通过while判断是否按下松开了。因为,如果是多任务就可能会在while中出现死循环。怎么办?用定时器,当检测到按键连续按下后,按键计数变量+1,只要松开一下,计数清0,计数累积到50ms的时候判定为按下,实现LED通过数组移动一下的任务。而其他任务比如计时、打印等都可以照常执行基本不受影响。
二,文件的创建(.c和.h) 创建程序文件三步,1新建文件并保存,2添加到工程 ,3添加引用路径。一般一个.c和一个.h文件一起执行一个外设或者一个任务或功能。这样可以让代码看起来简洁明了注意函数定义添加文件一定要记得把引用路径添加到工程里。
三,结构体数组的周期性任务调度 在前面的任务:LED1 0.3秒闪一次,LED2 0.6秒闪一次,LED3 0.9秒闪一次之中他们1都有定时器1ms加的变量,2都有一个设定的计数目标,3都有需要执行的功能,4.定时时间到了才能执行。那么就可以采用结构体数组实现。
首先创建Task.h文件
#ifndef __TASK_H
#define __TASK_H
#include "config.h" //调用头文件
typedef struct
{
u8 Run; //任务状态:Run/Stop
u16 TIMCount; //定时计数器
u16 TRITime; //重载计数器
void (*TaskHook) (void); //任务函数
} TASK_COMPONENTS;
void Task_Marks_Handler_Callback(void);
void Task_Pro_Handler_Callback(void);
#endif
然后创建Task.c文件。
u8 Tasks_Max = sizeof(Task_Comps)/sizeof(Task_Comps);
void Task_Marks_Handler_Callback(void)
{
u8 i;
for(i=0; i<Tasks_Max; i++)
{
if(Task_Comps.TIMCount) /* If the time is not 0 */
{
Task_Comps.TIMCount--; /* Time counter decrement */
if(Task_Comps.TIMCount == 0) /* If time arrives */
{ /*Resume the timer value and try again */
Task_Comps.TIMCount = Task_Comps.TRITime;
Task_Comps.Run = 1; /* The task can be run */
}
}
}
}
void Task_Pro_Handler_Callback(void)
{
u8 i;
for(i=0; i<Tasks_Max; i++)
{
if(Task_Comps.Run) /* If task can be run */
{
Task_Comps.Run = 0; /* Flag clear 0 */
Task_Comps.TaskHook(); /* Run task */
}
}
}
在io.c文件创建执行函数
#include "io.h"
u8 State1 = 0; //LED1初始状态
u8 State2 = 0; //LED2初始状态
u8 State3 = 0; //LED3初始状态
u16 Key_Vol = 0; //按键按下持续时间
void LED0_Blink(void)
{
State1 = !State1;
P00 = State1;
}
void LED1_Blink(void)
{
State2 = !State2;
P01 = State2;
}
void LED2_Blink(void)
{
State3 = !State3;
P02 = State3;
}
void KEY_Task(void)
{
if( P32 == 0 )
{
Key_Vol++;
if( Key_Vol==5 )
{
//按键按下的任务
printf( "按键单击\r\n" );
}
}
else
{
Key_Vol = 0;
}
}
在io.h文件中声明有关函数
#ifndef __IO_H
#define __IO_H
#include "config.h" //调用头文件
void LED0_Blink(void);
void LED1_Blink(void);
void LED2_Blink(void);
void KEY_Task(void);
#endif
我觉得这个是今天学习的重点的重点照抄了一遍,以便加深理解。