单片机C语言模块化程序

时间:2021-02-04 19:49:43
求大神给下我单片机C语言模块化程序,让我好好学习,规范化我的代码编写

6 个解决方案

#1


网上能找到华为的编码规范这个是其一

其二,模块化的代码关键在于封装,什么高内聚\低耦合,其实一套套的,大家说着都容易,做起来不容易.多读别人的代码,尽量读好代码,多想想别人为什么这么封装函数,以另外的方式\粒度进行封装为什么不好.读到不良的代码的时候,可以试着自己重写.看看能不能比原作者写得更好.

#2


推荐 <<高质量 C++/C 编程指南(林锐)>>,值得一看

推荐UCOS源码,看一遍一举多得

#3


正如1楼所说,模块化很重要的是封装,封装的好处一个方面是本程序结构的模块化,另一方面以后再使用同样的东西时会非常方便。
比如下面这个12C5A60S2的PWM驱动函数:
/*
两路PWM通道分别是P1.3和P1.4
P1.3对应的是pwm通道0,P1.4对应的是pwm通道1

CL寄存器在PCA时钟作用下不断地加1,加到255后溢出,CL的加法必须从0加到255,不能调成整百或其它数字。也就是说周期必须是256个PCA时钟周期;
当CL<CCAPxL时,pwmx输出低电平;
当CL>=CCAPxL时,pwmx输出高电平。
在使用时不知道这些也没关系,只要调用setzkb(n,zkb)设置通道n占空比就行了
*/
void pwm_init()
{
CMOD=0x00; //空闲时PCA工作,选择的PCA时钟是fosc/12,PCA溢出中断关
//PWM频率=PCA系统时钟频率/256,在这里就是 fosc/12/256
CL=0;
CH=0;
CCAPM0 = 0X42; //模块0设置为8位PWM输出,无中断 P1.3
CCAPM1 = 0X42; //模块0设置为8位PWM输出,无中断 P1.4
CR=1; //开启PCA计数器
}

void setzkb(unsigned char n,unsigned char zkb) //设置通道占空比
{
if(zkb==100)
{
if(n==0)
{
CCAP0L=0;
CCAP0H=0;
}
else if(n==1)
{
CCAP1L=0;
CCAP1H=0;
}
}
else
{
if(n==0)
{
CCAP0L = 0XFF-(zkb*256/100);
CCAP0H = 0XFF-(zkb*256/100);
}
else if(n==1)
{
CCAP1L = 0XFF-(zkb*256/100);
CCAP1H = 0XFF-(zkb*256/100);  
}
}
}
//注意:这里有个问题,应该算是通病,如果我想让占空比为0,CCAPxL的最大值只能是255,而当CL==255时必然会输出一个PCA时钟的高电平,达不到完全的低电平输出。

把这两个函数放到一个文件里,它就是对这款单片机的PWM模块的封装,使用时只要包含此文件,初始化然后直接调用函数就行了,不需要记住每个寄存器。
封装就像建立了一个黑盒子,盒子里面的内容别人不需要知道,自己也没必要记住,只要知道它对外提供的接口怎么使用就行了。

#4


我想你需要的应该是这个:
http://wenku.baidu.com/view/8b6bf3ecaeaad1f346933fbf.html

#5


该回复于2013-07-25 15:47:41被管理员删除

#6


看下那本c primer plus中文版 

#1


网上能找到华为的编码规范这个是其一

其二,模块化的代码关键在于封装,什么高内聚\低耦合,其实一套套的,大家说着都容易,做起来不容易.多读别人的代码,尽量读好代码,多想想别人为什么这么封装函数,以另外的方式\粒度进行封装为什么不好.读到不良的代码的时候,可以试着自己重写.看看能不能比原作者写得更好.

#2


推荐 <<高质量 C++/C 编程指南(林锐)>>,值得一看

推荐UCOS源码,看一遍一举多得

#3


正如1楼所说,模块化很重要的是封装,封装的好处一个方面是本程序结构的模块化,另一方面以后再使用同样的东西时会非常方便。
比如下面这个12C5A60S2的PWM驱动函数:
/*
两路PWM通道分别是P1.3和P1.4
P1.3对应的是pwm通道0,P1.4对应的是pwm通道1

CL寄存器在PCA时钟作用下不断地加1,加到255后溢出,CL的加法必须从0加到255,不能调成整百或其它数字。也就是说周期必须是256个PCA时钟周期;
当CL<CCAPxL时,pwmx输出低电平;
当CL>=CCAPxL时,pwmx输出高电平。
在使用时不知道这些也没关系,只要调用setzkb(n,zkb)设置通道n占空比就行了
*/
void pwm_init()
{
CMOD=0x00; //空闲时PCA工作,选择的PCA时钟是fosc/12,PCA溢出中断关
//PWM频率=PCA系统时钟频率/256,在这里就是 fosc/12/256
CL=0;
CH=0;
CCAPM0 = 0X42; //模块0设置为8位PWM输出,无中断 P1.3
CCAPM1 = 0X42; //模块0设置为8位PWM输出,无中断 P1.4
CR=1; //开启PCA计数器
}

void setzkb(unsigned char n,unsigned char zkb) //设置通道占空比
{
if(zkb==100)
{
if(n==0)
{
CCAP0L=0;
CCAP0H=0;
}
else if(n==1)
{
CCAP1L=0;
CCAP1H=0;
}
}
else
{
if(n==0)
{
CCAP0L = 0XFF-(zkb*256/100);
CCAP0H = 0XFF-(zkb*256/100);
}
else if(n==1)
{
CCAP1L = 0XFF-(zkb*256/100);
CCAP1H = 0XFF-(zkb*256/100);  
}
}
}
//注意:这里有个问题,应该算是通病,如果我想让占空比为0,CCAPxL的最大值只能是255,而当CL==255时必然会输出一个PCA时钟的高电平,达不到完全的低电平输出。

把这两个函数放到一个文件里,它就是对这款单片机的PWM模块的封装,使用时只要包含此文件,初始化然后直接调用函数就行了,不需要记住每个寄存器。
封装就像建立了一个黑盒子,盒子里面的内容别人不需要知道,自己也没必要记住,只要知道它对外提供的接口怎么使用就行了。

#4


我想你需要的应该是这个:
http://wenku.baidu.com/view/8b6bf3ecaeaad1f346933fbf.html

#5


该回复于2013-07-25 15:47:41被管理员删除

#6


看下那本c primer plus中文版