YangHY 发表于 2026-1-13 22:13:02

再次编译连接:

按键按下也是正常反应的,问题解决了

YangHY 发表于 2026-1-13 22:17:26

就是说,串口打印任务和按键切换任务,亮灯移位任务,

都要符号任务调度要求,3个相互独立的任务,不能互相影响

仔细观察,3个任务都有人干活的


下面学一个非常重要的内容:



YangHY 发表于 2026-1-13 22:19:07

一般一个.c和一个出文件执行一个外设或者一个任务或功能。这样可以让代码看起来简洁明了

YangHY 发表于 2026-1-13 22:25:24

这样我们首先分文件夹,再分文件

把项目搞的很清爽,查找模块就很方便

一个.c对应一个.h

,h文件是这样的格式:

#ifndef__CONFIG_H
#define__CONFIG_H



#endif


YangHY 发表于 2026-1-14 19:19:15

一般一个.c和一个:h文件执行一个外设或者一个任务或功能。这样可以让代码看起来简洁明了

上面的描述,听起来很简单,实际上是要很细心的,我们STC的很多例子程序都是一个文件,当你想

改写成多文件的时候,要规划好,一个外设(至少是一类)外设一个.c+一个.h文件,一般都是这样配对的

我们先创建一个config.c文件

#include "config.h"



void Sys_init(void)// 系统初始化
{
                                                                               
        WTST = 0;                                                                                //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
    EAXFR = 1;                                                                                 //扩展寄存器(XFR)访问使能
    CKCON = 0;                                                                                 //提高访问XRAM速度
       
    P0M1 = 0x00;   P0M0 = 0x00;
    P1M1 = 0x00;   P1M0 = 0x00;
    P2M1 = 0x00;   P2M0 = 0x00;
    P3M1 = 0x00;   P3M0 = 0x00;
    P4M1 = 0x00;   P4M0 = 0x00;
    P5M1 = 0x00;   P5M0 = 0x00;
    P6M1 = 0x00;   P6M0 = 0x00;
    P7M1 = 0x00;   P7M0 = 0x00;

}

void Delay10ms(void)        //@24.000MHz,延时10ms
{
        unsigned long edata i;

        _nop_();
        _nop_();
        _nop_();
        i = 59998UL;
        while (i) i--;
}

YangHY 发表于 2026-1-14 19:20:53

接着继续创建和它配套的config.h文件:

#ifndef __CONFIG_H
#define __CONFIG_H

#include ".\ai8051u.h"                        //调用头文件
#include ".\stc32_stc8_usb.h"                //调用头文件
#include "intrins.h"                        //调用头文件
#include "io.h"                        //调用头文件
#include "task.h"                        //调用头文件

#define u8unsigned char                //8位无符号变量(0-255)
#define u16 unsigned int                //16位无符号变量(0-65535)       


void Sys_init(void);// 系统初始化函数声明
void Delay10ms(void);        //@24.000MHz,延时10ms函数声明

#endif

YangHY 发表于 2026-1-14 19:32:02

把所有要调用的.h文件都写在config.h里,主函数调用一次config.h就全都有了

还有以后定时器0的1ms的初始化函数,讲作为标志配置

直接把它放在config.c里:

#include "config.h"



void Sys_init(void)// 系统初始化
{
                                                                               
        WTST = 0;                                                                                //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
    EAXFR = 1;                                                                                 //扩展寄存器(XFR)访问使能
    CKCON = 0;                                                                                 //提高访问XRAM速度
       
    P0M1 = 0x00;   P0M0 = 0x00;
    P1M1 = 0x00;   P1M0 = 0x00;
    P2M1 = 0x00;   P2M0 = 0x00;
    P3M1 = 0x00;   P3M0 = 0x00;
    P4M1 = 0x00;   P4M0 = 0x00;
    P5M1 = 0x00;   P5M0 = 0x00;
    P6M1 = 0x00;   P6M0 = 0x00;
    P7M1 = 0x00;   P7M0 = 0x00;

}

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 Delay10ms(void)        //@24.000MHz,延时10ms
{
        unsigned long edata i;

        _nop_();
        _nop_();
        _nop_();
        i = 59998UL;
        while (i) i--;
}

YangHY 发表于 2026-1-14 19:35:25

接下来是今天最难,也是今后最重要的内容

结构体周期性任务调度

YangHY 发表于 2026-1-14 19:42:02

对应4句中文,我们想先定义一个大类:

typedef struct
{
u8 Run;//任务状态:Run/Stop
u16 TIMCount; //定时计数器
u16 TRITime;//重载计数器
void(*TaskHook)void);//任务函数
}.TASK_COMPONENTS;

这是个固定的搭配

YangHY 发表于 2026-1-14 19:45:07

下面参考STC的试验箱例子程序27,来改写:

页: 54 55 56 57 58 59 60 61 62 63 [64] 65 66 67 68 69 70 71 72 73
查看完整版本: 第一课 序言《AI8051U的特点》