单片机程序模块化编程问题问题

#ifndef __UAST_H
#define __UAST_H
#include <STC32G.H>
extern u8  TX1_Cnt;    //发送计数
extern u8  RX1_Cnt;    //接收计数
extern bit B_TX1_Busy; //发送忙标志

extern u8  RX1_Buffer[UART1_BUF_LENGTH]; //接收缓冲
void UART1_config(u8 brt);
#endif
#include "uast.h"

//========================================================================
// 函数: void UART1_config(u8 brt)
// 描述: UART1初始化函数。
// 参数: brt: 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
// 返回: none.
// 版本: VER1.0
// 日期: 2014-11-28
// 备注: 
//========================================================================
void UART1_config(u8 brt)
{
    /*********** 波特率使用定时器2 *****************/
    if(brt == 2)
    {
        S1BRT = 1;    //S1 BRT Use Timer2;
        SetTimer2Baudraye(Baudrate1);
    }

    /*********** 波特率使用定时器1 *****************/
    else
    {
        TR1 = 0;
        S1BRT = 0;        //S1 BRT Use Timer1;
        T1_CT = 0;        //Timer1 set As Timer
        T1x12 = 1;        //Timer1 set as 1T mode
        TMOD &= ~0x30;//Timer1_16bitAutoReload;
        TH1 = (u8)(Baudrate1 / 256);
        TL1 = (u8)(Baudrate1 % 256);
        ET1 = 0;    //禁止中断
        TR1 = 1;
    }
    /*************************************************/

    SCON = (SCON & 0x3f) | 0x40;    //UART1模式, 0x00: 同步移位输出, 0x40: 8位数据,可变波特率, 0x80: 9位数据,固定波特率, 0xc0: 9位数据,可变波特率
//  PS  = 1;    //高优先级中断
    ES  = 1;    //允许中断
    REN = 1;    //允许接收
    P_SW1 &= 0x3f;
//  P_SW1 |= 0x00;      //UART1 switch to, 0x00: P3.0 P3.1, 0x40: P3.6 P3.7, 0x80: P1.6 P1.7, 0xC0: P4.3 P4.4

    B_TX1_Busy = 0;
    TX1_Cnt = 0;
    RX1_Cnt = 0;
}

stc试验箱程序 我想模块化编程 就写了一个初始化就疯狂报错 什么原因啊
hansu\uast\uast.h(5): error C29: formal/parameter has illegal storage class
hansu\uast\uast.h(5): error C33: 'u8': invalid storage class
hansu\uast\uast.h(5): error C25: syntax error near 'RX1_Cnt'
hansu\uast\uast.h(5): error C33: 'RX1_Cnt': invalid storage class

根据您提供的代码和错误信息,问题可能出在您的头文件"uast.h"中。

首先,根据错误信息,编译器指出您的头文件中出现了一些不合法的存储类指定符。这可能是因为您在头文件中声明了变量,而头文件通常只应该包含函数声明和变量定义。

其次,错误信息指出'u8'是一个无效的存储类指定符。在您的代码中,u8被用作变量类型,这可能是一个自定义的数据类型定义。但是,如果您的编译器不支持u8作为数据类型,就会导致错误。

最后,错误信息还指出在头文件中出现语法错误和无效的存储类指定符。这可能是因为您在头文件中使用了错误的语法或错误的变量声明。

为了解决这个问题,您可以采取以下措施:

  1. 将变量定义移动到源文件中。将变量定义移动到"uast.c"文件中,而不是在头文件中进行声明。
  2. 确保您的编译器支持u8作为数据类型。您可以查看编译器的文档或使用其他数据类型来代替u8。
  3. 检查头文件中的语法错误。确保您的头文件中没有语法错误,并且变量和函数的声明符合语法规则。

如果您仍然遇到问题,请提供完整的代码和编译器的错误信息,以便我们更好地帮助您解决问题。

首先说一下,在h文件里定义函数是个很不好的习惯,会带来很多问题,当然,这不一定会导致编译错误。
这里的错误,我估计是u8这类型导致的,u8并不是c的标准类型,需要在其它地方先进行定义,我估计是在前面没有对应的定义导致的。

【以下回答由 GPT 生成】

要编写单片机程序时使用模块化编程,你可以按照以下步骤进行:

  1. 创建头文件:在你的项目中创建一个头文件(例如uast.h),可以使用#ifndef#define来防止头文件被重复包含。在头文件中,你可以定义外部变量和函数的声明。
#ifndef __UAST_H
#define __UAST_H

#include <STC32G.H>

extern u8  TX1_Cnt;    //发送计数
extern u8  RX1_Cnt;    //接收计数
extern bit B_TX1_Busy; //发送忙标志

extern u8  RX1_Buffer[UART1_BUF_LENGTH]; //接收缓冲

void UART1_config(u8 brt);

#endif
  1. 实现函数功能:在你的源文件中(例如uast.c),包含头文件,并实现函数的具体功能。
#include "uast.h"

void UART1_config(u8 brt)
{
    // 实现函数的具体功能
    if(brt == 2)
    {
        S1BRT = 1;    //S1 BRT Use Timer2;
        SetTimer2Baudraye(Baudrate1);
    }
    else
    {
        TR1 = 0;
        S1BRT = 0;        //S1 BRT Use Timer1;
        T1_CT = 0;        //Timer1 set As Timer
        T1x12 = 1;        //Timer1 set as 12T mode
        TMOD &= ~0x30;    //Timer1_16bitAutoReload;
        TH1 = (u8)(Baudrate1 / 256);
        TL1 = (u8)(Baudrate1 % 256);
        ET1 = 0;    //禁止中断
        TR1 = 1;
    }

    SCON = (SCON & 0x3f) | 0x40;    //UART1模式, 0x00: 同步移位输出, 0x40: 8位数据,可变波特率, 0x80: 9位数据,固定波特率, 0xc0: <
}

使用模块化编程的好处是可以更好地组织代码并提高代码的可读性和可维护性。你可以在其他源文件中使用头文件中定义的外部变量和函数,来实现更复杂的功能。同时,你可以根据需要将不同的功能划分到不同的模块中,方便管理和维护。

关于使用定时器1或定时器2来设置波特率的问题,你可以在UART1_config函数中根据传入的参数(brt)选择使用定时器1还是定时器2来设置波特率。根据你提供的代码片段,我无法确认Baudrate1的值,如果Baudrate1是你事先定义的波特率值,那么你可以在选择定时器后设置相应的波特率值。

希望以上解答对你有帮助,如果你还有其他问题,请随时提问!


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^