Ccy_cyn 2024-05-06 16:12 采纳率: 100%
浏览 12
已结题

51单片机中C语言怎么做到下面类似的功能的函数(相关搜索:c语言)

51单片机中C语言怎么做到下面类似的功能的函数?
主要是将引脚每几个分为一组,每一组引脚根据需要分为几种状态,这里是两个分为一组,一共两组,一共三种状态,用一个函数改参实现。小菜鸡学单片机、学c,诚心请教这种在单片机里该怎么实现,需要注意哪些地方?

sfr P1 = 0x80;
sbit Rs_1=P1^0;
sbit Rx_1=P1^1;

sbit Rs_2=P1^2;
sbit Rx_2=P1^3;

void R_C(int a,int b);
void R_g(int a);
void M_s(int b);

int main()
{
    R_C(1,2);
}
void R_C(int a,int b)
{
    R_g(a);
    M_S(b);
}
void R_g(int a)
{
    switch(a)
    {
        case 1:A=Rs_1;B=Rx_1;//组1
        break;
        case 2:A=Rs_2;B=Rx_2;//组2
        break;
    }
}
void M_s(int b)
{
    switch(b)
    {
        case 0:A=1;B=1;//1
        break;
        case 1:A=0;B=1;//2
        break;
        case 2:A=1;B=0;//3
        break;
    }
}

  • 写回答

6条回答 默认 最新

  • 专家-皆知 2024-05-06 16:14
    关注

    参考免费微信小程序:皆我百晓生 作答,经由专家-皆知整理回复,如问题解决,望采纳;如仍有疑问,请评论回复。

    你的需求是通过一个函数根据传入的参数控制51单片机P1端口的不同组合,实现引脚的分组控制。你的代码框架已经很接近正确答案了,但是有些变量未定义(A和B),以及一些细节需要修正。下面是一个根据你的描述调整后的完整示例代码,确保可以直接在51单片机环境中运行:

    #include <reg52.h> // 包含51单片机寄存器定义
    
    sfr P1 = 0x80; // 定义P1端口地址
    
    // 由于直接操作位,不需要额外的A和B变量,直接操作Rs_1, Rs_2, Rx_1, Rx_2
    void R_C(int group, int state) {
        switch (group) {
            case 1:
                R_g(Rs_1, Rx_1, state); // 控制第一组
                break;
            case 2:
                R_g(Rs_2, Rx_2, state); // 控制第二组
                break;
        }
    }
    
    // 修改为接受具体的引脚和状态
    void R_g(sbit pin1, sbit pin2, int state) {
        switch (state) {
            case 0:
                pin1 = 1; pin2 = 1; // 组合1: 都高电平
                break;
            case 1:
                pin1 = 0; pin2 = 1; // 组合2: 第一个低电平,第二个高电平
                break;
            case 2:
                pin1 = 1; pin2 = 0; // 组合3: 第一个高电平,第二个低电平
                break;
        }
        // 确保更改立即生效,尽管对于51单片机,位操作后通常会立即更新
        // 但明确地写入整个P1端口是个好习惯
        P1 = P1; 
    }
    
    void main() {
        R_C(1, 2); // 这将会设置第一组引脚为状态2
        while(1); // 循环等待,防止程序结束
    }
    

    注意事项:

    1. 编译环境:确保你的开发环境支持51单片机的编译,比如Keil uVision。
    2. 位操作:直接操作位变量如Rs_1和Rx_2是51单片机编程中的常见做法,这样可以精确控制每个引脚的状态。
    3. P1 = P1;:这行代码虽然在这个上下文中不是必须的,因为位操作通常会立即影响到对应的硬件状态,但写入是为了确保编译器不优化掉前面的位设置,尤其是在更复杂的程序中可能有其作用。
    4. 循环等待while(1);确保主函数不会执行完毕退出,这是单片机程序中的常见做法,保持程序持续运行。
    5. 调试:在实际开发中,可能需要通过串口或其他方式输出状态以验证代码是否按预期工作。

    这个例子直接实现了你的需求,即通过一个函数根据不同的参数设置不同引脚的组合状态。记得在实际应用中根据具体情况调整逻辑和测试代码的正确性。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

问题事件

  • 系统已结题 5月14日
  • 已采纳回答 5月6日
  • 创建了问题 5月6日

悬赏问题

  • ¥15 统计大规模图中的完全子图问题
  • ¥15 使用LM2596制作降压电路,一个能运行,一个不能
  • ¥60 要数控稳压电源测试数据
  • ¥15 能帮我写下这个编程吗
  • ¥15 ikuai客户端l2tp协议链接报终止15信号和无法将p.p.p6转换为我的l2tp线路
  • ¥15 经gamit解算的cors站数据再经globk网平差得到的坐标做形变分析
  • ¥15 phython读取excel表格报错 ^7个 SyntaxError: invalid syntax 语句报错
  • ¥20 @microsoft/fetch-event-source 流式响应问题
  • ¥15 ogg dd trandata 报错
  • ¥15 高缺失率数据如何选择填充方式