搞点有用的干货(让新手小白看了都能懂的模块化编程)

利用 函数 ,不仅可以实现程序模块,使得程序设计更加简单和直观,从而提高了程序的易读性和可维护性,而且还可以把程序中经常用到的一些计算或操作编写成 通用函数 ,以供随时调用。

废话不说直接上操作

 上图时模块化模块编程所需要用到的一些文件

我们把图上主文件(mian.c)头文件和源文件(hotel)都存放在同一个项目里(带dev后缀的)


/* usehotel.c -- 房间费率程序 */
/* 与程序清单9.10一起编译 */
#include <stdio.h>
#include "hotel.h" /* 定义符号常量,声明函数 */
 
int main(void)
{
int nights;
double hotel_rate;
int code;
while ((code = menu()) != QUIT)
{
switch (code)
{
    case 1: hotel_rate = HOTEL1;
    break;
    case 2: hotel_rate = HOTEL2;
    break;
    case 3: hotel_rate = HOTEL3;
    break;
    case 4: hotel_rate = HOTEL4;
    break;
    default: hotel_rate = 0.0;
    printf("Oops!\n");
    break;
}
    nights = getnights();
    showprice(hotel_rate, nights);
}
printf("Thank you and goodbye.\n");
return 0;
}

这是我们的主文件,里边主要用到了我们《stdio.h编译器自带的数据库》跟我们自行编写的一个在定义头文件(个人叫他在定义的函数库)


/* hotel.c -- 酒店管理函数 */
#include <stdio.h>
#include "hotel.h"
 
int menu(void)            //获取一个范围内的数字(1~5)--菜单选择
{
int code, status;
printf("\n%s%s\n", STARS, STARS);
printf("Enter the number of the desired hotel:\n");
printf("1) Fairfield Arms 2) Hotel Olympic\n");
printf("3) Chertworthy Plaza 4) The Stockton\n");
printf("5) quit\n");
printf("%s%s\n", STARS, STARS);
while ((status = scanf("%d", &code)) != 1 ||
(code < 1 || code > 5))
{
if (status != 1)
scanf("%*s"); // 处理非整数输入
printf("Enter an integer from 1 to 5, please.\n");
}
return code;
}
 
int getnights(void)          //获取到一个整数--入住天数
{
int nights;
printf("How many nights are needed? ");
while (scanf("%d", &nights) != 1)
{
scanf("%*s"); // 处理非整数输入
printf("Please enter an integer, such as 2.\n");
}
return nights;
}
 
void showprice(double rate, int nights)    //获取到价格
{
int n;
double total = 0.0;
double factor = 1.0;
for (n = 1; n <= nights; n++, factor *= DISCOUNT)
total += rate * factor;
printf("The total cost will be $%0.2f.\n", total);
}

这个是源文件


/* hotel.h -- 符号常量和 hotel.c 中所有函数的原型 */
#define QUIT 5
#define HOTEL1 180.00
#define HOTEL2 225.00
#define HOTEL3 255.00
#define HOTEL4 355.00
#define DISCOUNT 0.95
#define STARS "**********************************"
// 显示选择列表
int menu(void);
// 返回预订天数
int getnights(void);
// 根据费率、入住天数计算费用
// 并显示结果
void showprice(double rate, int nights);

最后一个就是我们自定义的一个头文件

 这是运行结果

里边用到了一个switch函数,提供给我们选择函数里边定义的酒店选项,在1~5之间可以输入有效值,超出有效值系统会让我们重新输入知道输入正确选项为止。

输入正确选项之后输入你要在该酒店所入住的天数,系统会按照所给天数计算价格然后给我们呈现。

 这是面板

接下来进入实操

pace1

我用的时dvec++这款编译器

新建一个项目

 选择第二个,然后是c项目

紧接着创建完一个项目,在这个项目之内点击创建新项目把主文件,头文件,源文件一次创建即可

实现自己想要的功能。

<think>好的,我现在需要帮助用户将之前的专业代码解释转换为更通俗易的内容,适合新手小白。首先,我要回顾之前的对话,用户已经得到了一个基于STM32和Keil的四足机器人控制代码,但觉得不够易,现在希望更简单明了的解释。 首先,我需要分析用户的需求。用户可能是一个刚开始学习嵌入式系统和机器人控制的新手,对STM32、PWM、舵机控制等概念不熟悉。他们需要的是分步骤的指导,避免专业术语,用生活化的例子来解释。 接下来,我得考虑如何简化代码中的各个部分。例如,系统时钟配置、PWM初始化、舵机控制函数等,都需要用更简单的语言描述。可能需要将代码分解成几个主要模块,逐一解释每个模块的作用,而不深入复杂的寄存器配置。 然后,我需要用类比来帮助理解。比如,把舵机比作水龙头,PWM信号比作开关水龙头的时间,这样用户更容易明白脉宽调制是如何控制舵机转速的。同时,步态函数可以比喻为跳舞的步骤,分阶段执行动作。 另外,用户可能对硬件连接和实际调试步骤不太清楚。需要补充一些硬件准备的内容,比如如何连接舵机到STM32,电源注意事项,以及调试的步骤,比如先测试单个舵机,再逐步增加复杂度。 还要注意代码中的关键部分,比如舵机通道定义、PWM参数的设置,以及主函数中的初始化流程。需要解释每个参数的意义,例如PWM周期20ms对应的频率,脉宽范围0.5ms到2.5ms如何对应舵机的不同运动状态。 此外,用户可能对代码中的宏定义和函数调用感到困惑,需要举例说明如何调用SetServoSpeed函数来控制不同舵机的转动方向和速度。同时,强调安全注意事项,比如避免电源过载,舵机线序正确连接等。 最后,总结整个控制流程,从初始化到执行步态,用流程图或步骤列表的形式呈现,帮助用户形成整体认识。确保语言亲切,避免使用专业术语,多用“就像”、“例如”这样的引导词,让用户感觉是在朋友指导下学习。</think>好的!我尽量用「做菜」的方式来解释,把专业术语换成生活化的例子,并拆解步骤来说明: --- **📌 整体思路比喻:** > 把四足机器人想象成一只机器狗🐶,我们要做的是: > 1. **准备厨具**(配置硬件) > 2. **调好火候**(设置PWM信号) > 3. **指挥四肢**(编写动作指令) > 4. **让狗子动起来**(执行步态) --- ### 一、硬件准备(厨具篇) #### 1. 核心设备 - **主控板**:STM32 ➜ 相当于机器狗的「大脑」 - **360°舵机**×8 ➜ 相当于「肌肉关节」(注意区分髋关节和膝关节) - **电源**:单独给舵机供电 ➜ 建议用6V电池(就像给肌肉单独供能) #### 2. 接线示意 ```c // 举例:腿1的髋关节接PA0,膝关节接PA6(类似插头对应插座) HIP1_PWM → PA0 KNEE1_PWM → PA6 HIP2_PWM → PA1 KNEE2_PWM → PA7 ...(其他腿同理) ``` --- ### 二、代码详解(菜谱篇) #### 1. 基础设置(火开锅) ```c // 设置时钟频率 → 类似调整燃气灶火力 void SystemClock_Config() { // 这里配置让CPU跑72MHz(普通家用燃气灶的中火) } ``` #### 2. PWM配置(控制火候) ```c void PWM_Init() { // 设置PWM周期为20ms → 就像水龙头每隔20秒开关一次 // 脉冲宽度500-2500对应舵机转速(500=全速逆时针,2500=全速顺时针) } ``` #### 3. 舵机控制(指挥肌肉) ```c // 函数功能:告诉第X号舵机用多大力度转动 void SetServoSpeed(uint8_t id, int16_t speed) { // 例如:SetServoSpeed(0, 100) → 腿1的髋关节正转 // speed范围:-200到+200(数值越大转得越快) } ``` #### 4. 步态设计(跳舞动作) ```c void TrotGait() { // 小跑步态 // 分四个阶段(像跳舞的分解动作): // 1. 抬左前腿 & 右后腿 SetServoSpeed(0, 150); // 左前髋关节正转 SetServoSpeed(3, -150); // 右后髋关节反转 Delay_ms(200); // 保持0.2秒 // 2. 其他腿同理... } ``` --- ### 三、新手调试指南(尝咸淡) #### 🔧 第一步:测试单个舵机 ```c // main函数里测试腿1的髋关节 SetServoSpeed(0, 100); // 应该正转 Delay_ms(2000); SetServoSpeed(0, -100); // 应该反转 ``` #### 🔧 第二步:校准停止位置 ```c // 所有舵机给1500脉冲(1.5ms停止信号) for(int i=0; i<8; i++) { SetServoSpeed(i, 0); } ``` #### 🔧 第三步:简单踏步 ```c // 让左前腿上下摆动 SetServoSpeed(0, 150); // 抬腿 Delay_ms(500); SetServoSpeed(0, 0); // 停住 Delay_ms(500); ``` --- ### 四、常见问题(糊锅怎么办?) 1. **舵机不转**: - ✅ 检查电源是否独立供电 - ✅ 用万用表量信号线电压(应有3.3V脉冲) 2. **方向反了**: - ✅ 调换SetServoSpeed的正负值 - ✅ 或交换舵机信号线 3. **动作不协调**: - ✅ 增加Delay_ms的时间 - ✅ 减小speed数值(动作更柔和) --- ### 五、终极秘诀(大厨私房话) - ✨ **先调单腿再组合**:就像先练分解动作再跳完整舞蹈 - ✨ **小数值慢动作**:speed先用50-100,别一上来就开最大 - ✨ **机械结构先行**:装好腿后再编程,避免空中楼阁 建议从最简单的「前后摇晃」开始,慢慢增加复杂度。就像学骑自行车,先保持平衡再尝试转弯~ 🚴‍♂️
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值