【单片机自学笔记】(4): C语言的printf和scanf中的格式字符、字符的输入输出、选择结构和条件判断、零碎的知识、Stepper库函数、自定义函数控制28BYJ-48

/ C语言的printf中的格式字符 /

printf(格式控制, 输出列表)

e格式符:用%e指定以指数形式输出实数

实数占13列,一般自动给出的数字部分的小数位数为6位,指数部分占5列(如“e+002”,其中e占一列,指数符号占一列,指数占三列)

例如 printf(“%e”,123.456);

输出为:

1.234560e+002

也可用“%m.ne”形式的格式声明

例如  printf(“%13.2e”, 123.456)

输出为:

    1.23e+002  (数的前面有四个空格)

O格式符:以八进制的格式输出,存储在四个字节里,在内存单元中实际的二进制数从右往左按3位一组构成一个八进制数

X格式符:以十六进制数形式输出整数

/ C语言的scanf中的格式字符 /

scanf(格式控制, 地址列表)

例如: scanf(“a=%f, b=%f”, &a, &b);

输入时在同样的位置输入同样的字符,即

a=1, b=2, c=3  (连逗号都不能省!)

/ 字符输入输出函数 /

putchar()

先定义字符变量: char a = ‘B’   赋予的初值要用单引号括起来。

然后  putchar(a);   则会在显示器上输出B这个符号

getchar()

先定义字符变量: char a;

然后:           a = getchar(在键盘上输入一个字符);

最后再:  putchar(a);

/ 选择结构和条件判断 /

If语句的常用形式

一:if(表达式1){语句1}

二:if(表达式1)

       语句1;

else

   语句2;

三:if (表达式1) 语句1;

else if(表达式2) 语句2;

else if(表达式3) 语句3;

。。。。。。

else if (表达式n)  语句n ;

else             语句n+1;

条件表达式

条件运算符由“?”和“:”组成

表达式1 ? 表达式2 :表达式3;

例如:a>b ? (max = a) : (max = b);

相当于: if(a>b)  max = a;

         else     max = b;

如果表达式1为真,则执行表达式2;如果表达式1为假,则执行表达式3.

If语句的嵌套

If()

  {

     if()  语句1

     else 语句2

}

else   语句3

switch语句

switch(语句1)

  case 常量1 : 语句1;break;

  case 常量2 : 语句2;  break;

  ……

  Case 常量n: 语句n; break;

 default :       语句n+1;

case后面可不加花括号,它会自动执行case 后的所有语句

也可以多个case标号共用一组执行语句,例如:

case  ’A ’:

case ‘ B‘ :

case ‘ C ’:  printf(“\n”);break;

…..

/ 零碎的知识 /

return 0;:当main函数执行结束前将整数0作为函数值,返回调用函数处。每一个c语言程序都必须有一个main函数。如果用void main()则可以最后不写return o;

const int:整形常量

复合的赋值运算符

a+=3      等价于  a=a+3

x*=y+8    等价于  x=x*(y+8)

x%=3      等价于  x=x%3

  

/调用 Arduino的Stepper库/

Stepper 电机的名字(转子转一圈的步数,开发板相应引脚一,引脚二,引脚三,引脚四);

上面这个语句用于定义一个步进电机对象

Arduino需要通过ULN2003电机驱动板来控制28BYJ-48

虽然杜邦线是按顺序接的,但在调用Stepper函数的时候得把引脚二三调换顺序,不然其不能正常运行

查找Stepper函数源码,源码如下图所示

可发现控制B、C相的C1和C2顺序不对。

图中的时序为: AC-BC-BD-DA

而正确的双四拍时序应该为: AB-BC-CD-DA

故而需要调换二三引脚的顺序

而且我发现我调用Stepper函数后实际运行时序是BC-CD-DA-AB(按下开发板的复位键后,先亮BC两个灯)。

所以我推测还是是Arduino自带的Stepper库的Stepper函数源码有问题,为验证自己的推测,我写了如下程序

实验结果:电机输出轴逆时针转动;转子转2048步,输出轴转一圈;按下复位键后先亮AB这两个灯,时序为AB-BC-CD-DA

即表明,我的猜想是正确的。

setSpeed(rpm);

rpm:转速参数(每分钟电机转数)(长整形)

上面这个语句用来设定步进电机的运行速度。

step(steps)

用来让步进电机转子旋转相应的步数。此函数为“blocking”类型函数,要等待电机执行完以后才能进行下一条语句。为了更好的控制,可以在调用step函数时尽量让电机少执行步数。

steps是int型参数,表示步数,其正值是逆时针转,负值是顺时针转。

用setSpeed和 step函数前,要先写步进电机的名字

格式: 步进电机名.setSpeed(100);

在使用Stepper库函数时,程序中的void setup(){}中的{}不需要写入内容

如需控制多个步进电机,可使用第三方库:AccelStepper库

(暂时不学,先尝试自定义步进电机的控制函数,等需要用到的时候再学)

/ 自定义函数控制28BYJ-48 /

前半部分代码是通用的

单相绕组通电四拍时序:A-B-C-D

其中

双相绕组通电四拍时序:AB-BC-CD-DA

双相绕组通电八拍时序:A-AB-B-BC-C-CD-D-DA

而且八拍的时候代码要适当的修改

通过上述程序可完成“全步进小力矩”、“全步进大力矩”、“半步进”的三种模式下的逆时针转动顺时针转动的动作

或者用while(1)建立一个死循环,将其放在适当的位置,也可停止电机运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值