我们以让电机以变化的占空比转动 并将占空比显示在屏幕上举例。

我们可以写出一下

简单的程序

#include "headfile.h"

uint16 duty;//定义占空比
/*
 *关于内核频率的设定,可以查看board.h文件
 *在board_init中,已经将P54引脚设置为复位
 *如果需要使用P54引脚,可以在board.c文件中的board_init()函数中删除SET_P54_RESRT即可
 */


void main()
{

    sys_clk = 30000000;     //设置系统频率为30MHz

    board_init();            //初始化寄存器
    //此处编写用户代码(例如:外设初始化代码等)
    pwm_init(PWM3_P63,17000,0);
    pwm_init(PWM4_P64,17000,0);
    lcd_init();
    lcd_clear(WHITE);
    while(1)
    {
    //此处编写需要循环执行的代码

    if(duty >= 1000)
    {
    duty = 0;
    }
    duty += 100;

    delay_ms(1000);
    }

    pwm_duty(PWM3_P63,0);
    pwm_duty(PWM4_P64,duty);
    lcd_showstr(1,0,"duty is");
    lcd_showuint16(0,1,duty);

    }
}

这个看起来不复杂,但是以后增加更多的模块,如果还放在main.c,整个代码就看着很杂乱,因此需要模块化编程。

首先建立空白的.c.h文件

//My.c
#include "My.h"
//My.h
#ifndef __MY_H_
#define __MY_H_
#include "headfile.h"




#endif


注意:.h文件最后一行必须是空行,否则会报错。

在My.c里编写初始化代码:

void all_init()
{

    pwm_init(PWM3_P63,17000,0);
    pwm_init(PWM4_P64,17000,0);
    lcd_init();
    lcd_clear(WHITE);
}

在My.h中写对应的声明:

void all_init();

写剩下的代码:

uint16 duty = 0;//定义占空比

void duty_change(void)
{
    if(duty >= 1000)
    {
    duty = 0;
    }
    duty += 100;

    delay_ms(1000);

}

void mitor_duty(void)
{
    pwm_duty(PWM3_P63,0);
    pwm_duty(PWM4_P64,duty);
    lcd_showstr(1,0,"duty is");
    lcd_showuint16(0,1,duty);

}

.h写声明

extern uint16 duty;//定义占空比

void duty_change(void);

void mitor_duty(void);

接下来是完整的代码:

main.c:

#include "headfile.h"


void main()
{

    sys_clk = 30000000;     //设置系统频率为30MHz

    board_init();            //初始化寄存器
    //此处编写用户代码(例如:外设初始化代码等)
    all_init();

    while(1)
    {
    //此处编写需要循环执行的代码

    duty_change(void);

    mitor_duty(void);


    }
}

My.c:


#include "My.h"

uint16 duty = 0;//定义占空比

void all_init()
{

    pwm_init(PWM3_P63,17000,0);
    pwm_init(PWM4_P64,17000,0);
    lcd_init();
    lcd_clear(WHITE);
}

void duty_change(void)
{
    if(duty >= 1000)
    {
    duty = 0;
    }
    duty += 100;

    delay_ms(1000);

}

void mitor_duty(void)
{
    pwm_duty(PWM3_P63,0);
    pwm_duty(PWM4_P64,duty);
    lcd_showstr(1,0,"duty is");
    lcd_showuint16(0,1,duty);

}

My.h:

//My.h
#ifndef __MY_H_
#define __MY_H_
#include "headfile.h"


extern uint16 duty;//定义占空比

void all_init();
void duty_change(void);
void mitor_duty(void);

#endif

可以看出来main.c十分整洁

参考文章

智能车入门——模块化编程

[5-1] 模块化编程_哔哩哔哩_bilibili


系列文章目录
文章分为三个层次

速通版是希望通过简化的步骤搭建出寻迹小车,进而了解整个智能车是如何实现的,快速上手,为后续参与智能车竞赛做基础。

如果只是为了完成学校智能车初期培训,做出能简单循迹的小车,可以看这个速通版。

全程引导篇是讲了做出能够完赛的智能车的整个过程,大部分文章只是简单点拨一下,但是附上了相关的文章链接,方便根据自己的情况深入了解。

全程引导篇,能够带你比较系统地了解整个智能车的制作过程,推荐备赛初期或者有车模之后学习。

详细讲解篇是全程引导篇的补充,由于全程引导篇是引导性质,文章内容只是点拨,缺乏相应的原理或代码讲解,因此写详细讲解篇作为补充。

详细讲解篇会渗透在全程引导篇中。


速通版
智能小车速通版——手把手教程


全程引导篇


智能车入门——IDE安装以及库函数选用

智能车入门——编程语言(c)的学习

智能车入门——简单驱动常用模块

智能车入门——车模器件篇

智能车入门——模块化编程

智能车入门——跑车前的零碎知识

智能车入门——电磁循迹原理与实现

智能车入门——实现低速完赛


详细讲解篇


智能车入门补充篇

智能车入门补充篇——逐飞开源库介绍

智能车入门补充篇——常见宏定义和使用

智能车入门补充篇——模块化编程

智能车入门补充篇——电感值处理、转向控制与巡线

智能车入门补充篇——元素识别

智能车模块详解——按键及按键调参

智能车模块详解——数据存储与读写(eeprom/flash)

智能车入门——I/O、PWM

智能车入门——中断

智能车入门——编码器

智能车入门——陀螺仪

智能车入门——摄像头和CCD

智能车入门——舵机

(更新中)