word板文档下载:Arduino c语言基本知识
Arduino c语言基本知识1
1.程序结构:
基本结构
void setup() {这里写只运行一次的代码}
void loop() {这里写反复运行的程序}
程序注释
使用//开头或者包含在/ /里面
2.程序示例
//13号灯闪烁程序
void setup() {
pinMode(13, OUTPUT); // 13号灯所在引脚设置为输出模式
}
void loop() {
digitalWrite(13, HIGH); // 13号引脚设置为高电平(5V)
delay(1000); // 等待1000毫秒
digitalWrite(13, LOW); // 13号引脚设置为低电平(0V)
delay(1000);
}
3.给引脚取个名字
这里的13可以给它取个名字
#define deng 13
用deng代替上面的数字13 可以让程序更容易读懂
4.串口打印
在void setup() {}里加入Serial.begin(9600); 在需要打印的地方加入Serial.println("灯开了");
示例:
#define deng 13
void setup() {
pinMode(deng, OUTPUT);
Serial.begin(9600);
}
void loop() {
digitalWrite(deng, HIGH);
Serial.println("灯开了");
delay(1000);
digitalWrite(deng, LOW);
Serial.println("灯关了");
delay(1000);
}
5.练习:编写一个红绿灯程序,有AB两个路口,每个路口都有红黄绿三盏灯红绿灯亮5秒,黄灯亮1秒。打印灯的状态。
Arduino c语言基本知识2
1.变量与条件判断
上一页用#define deng 13这句话可以实现用deng代替13,这里的deng就永远是13不能在程序中改变它的值,如果要变则需要使用定义变量的方法,如整数用int,小数用float,真假用bool。
用 if(条件){满足条件执行的语句} 或者 if(条件){满足条件执行的语句}else{不满足条件执行的语句} 可以实现条件判断。
2.引脚控制包括数字输出输入,模拟输出输入
所有引脚都可以数字输出与输入,数字输出使用digitalWrite(引脚,HIGH或LOW);数字输入使用digitalRead(引脚);它的结果为0或1.
模拟输出引脚只有6个3 5 6 9 10 11,板上常标注有~,模拟输出使用analogWrite();它的数值范围为0-255。模拟输入引脚为A0-A5使用analogRead();它返回0到1023之间的数字,表示0到5伏之间的电压。所以如果analogRead()要输出到analogWrite()要除以4或者用map函数映射.使用方法:map(值,0,1023,0,255)
数字输出输入示例:
int anniu = 2; // 按钮连接到引脚2 用int代替#define
int deng = 13; // LED连接到引脚13
void setup() {
pinMode(anniu, INPUT); // 设置按钮引脚为输入
pinMode(deng, OUTPUT); // 设置LED引脚为输出
}
void loop() {
if (digitalRead(anniu) == HIGH) {
digitalWrite(deng, HIGH); // 如果按钮被按下,点亮LED
}
else {
digitalWrite(deng, LOW); // 如果按钮没有被按下,关闭LED
}
}
模拟输入输出示例:
int dianweiqi = A0; // 电位器连接到模拟引脚A0
int deng = 9; // LED连接到引脚9,只有3 5 6 9 10 11可用
void setup() {
pinMode(dianweiqi, INPUT); // 设置电位器引脚为输入
pinMode(deng, OUTPUT); // 设置LED引脚为输出
}
void loop() {
analogWrite(deng, map(analogRead(dianweiqi), 0, 1023, 0, 255)); // 映射0-1023为0-255
delay(10); // 小延迟,避免读取过于频繁
}
3.练习:按住按钮灯的亮度可调,松开按钮灯的亮度不可调
Arduino c语言基本知识3
1.函数,局部变量与全局变量
除了setup与loop外还可以有别的函数
例如:程序运行后1秒后开灯可以这么写
void setup () {
pinMode(13,OUTPUT);
}
void turnonled(){
digitalWrite(13,High);
}
void loop(){
delay(1000);
turnonled();
}
void setup () {
pinMode(A0, INPUT);
pinMode(11,OUTPUT);
}
int getXbeiA0(float x){ //形式参数
return x*analogRead(A0);
}
void loop(){
delay(1000);
analogWrite(11,getXbeiA0(0.25));//实参
}
在函数或代码块内部,称为局部变量。在所有函数之外,称为全局变量。
void setup () {
}
void loop () {
int x=0 , y=0 ; //局部变量只能内部中使用
} int x=0 , y=0 ; //全局变量可以到处使用
void setup () {
}
void loop () {
}
2.算术运算符、比较运算符、布尔运算符、复合运算符
运算符名称 简写 例子
赋值运算符 = A = B
加号 + A + B将得出30
减号 - A - B将得出-10
乘号 A B将得出200
除号 / B / A将得出2
模数 % B % A将得出0
运算符名称 运算符简写 例子
等于 == (A == B)不为真
不等于 != (A != B)为真
小于 < (A < B)为真
大于 > (A > B)不为真
小于或等于 <= (A <= B)为真
大于或等于 >= (A >= B)不为真
运算符名称 简写 例子
and(与) && (A && B)为真
or(或) || (A || B)为真
not(非) ! !(A && B)为假
运算符名称 运算符简写 例子
自增 ++ A++ 将得出11
自减 -- A-- 将得出9
复合加 += B += A 等效于 B = B + A
3.作业:
编写一个由电位器控制的正方形周长计算器,通过串口打印出边长及计算结果,通过按压一个按钮进行暂存,在按钮按下后打印出暂存的累加结果。例:
第1次:边长为10;周长为40,累加结果为40。
Arduino c语言基本知识4
1.条件控制(选择语句)与循环语句
If 语句
If … else 语句
If … else if … else 语句
switch case 语句 while循环
do…while循环
for循环
嵌套循环与无限循环
例子
int A = 5 ;
int B = 9 ;
Void setup () {
}
Void loop () {
If ( ( A < B ) && ( B != 0 )) {
A += B;
B--;
}
if (A > B) {
A++;
}else {
B -= A;
}
}
例子
switch (dengji) {
case 0: di(); break;
case 1: zhong(); break;
case 2: gao(); break;
default: xiaoxi("cuole!");
}
while(条件) {
条件为真执行的语句
}
do {
条件为真执行的语句
}
while (条件);
for( i = 2; i <= 9; i++) {
每次循环都会把第一个语句中的变量i的值与中间语句对比,如果为真则执行第三个语句
}
for(counter = 0;counter <= 9;counter++) {
for(i = 0;i <= 99;i++) {
}
}//共执行了10*100=1000次
无限循环语句语法
使用for循环for (;;) {语句}
使用while循环while(1) {语句}
使用do ... while循环
do {语句} while(1);
2.时间函数
delay() 函数以毫秒为单位。delayMicroseconds() 函数微秒。
millis() 函数返回Arduino板开始运行当前程序时的毫秒数。
micros() 函数micros()函数返回微秒数。该数字在大约70分钟后溢出,即回到零。
3.数组:声明数组并使用循环来初始化数组的元素;使用初始化器列表在声明中初始化数组
int n[ 10 ] ;
void setup () {
Serial.begin(9600); //串口初始化
}
void loop () {
for ( int i = 0; i < 10; ++i ){
n[ i ] = 0;
Serial.print (i) ;
Serial.print (‘\r’) ;
}
for ( int j = 0; j < 10; ++j ){
Serial.print (n[j]) ;
Serial.print (‘\r’) ;
}
} int n[ 10 ] = { 32, 27, 64, 18, 95, 14, 90, 70, 60, 37 } ;
void setup () {
Serial.begin(9600); //串口初始化
}
void loop () {
for ( int i = 0; i < 10; ++i ){
Serial.print (i) ;
Serial.print (‘\r’) ;
}
for ( int j = 0; j < 10; ++j ){
Serial.print (n[j]) ;
Serial.print (‘\r’) ;
}
}
Arduino c语言基本知识5
1.练习平台
编程小伙伴测评网:http://www.cierobot.com
账号:吴禹锡nbsz008,王明善nbsz009,刘奇彦nbsz010
2.突破平台复制限制
点edge浏览器上的扩展,获取Microsoft edge扩展,搜索copy,安装第一个Supreme Copy,然后在所在网页上打开这个扩展的Enable extension on this website按钮即可复制。
3.小练习:
交通灯A位于主路,交通灯B位于支路,正常情况下,两个交通灯的黄灯时间为2秒,绿灯时间为12秒,其中当绿灯时间还剩下2秒时,绿灯以200毫秒的频率闪烁,提示车辆即将变灯。在早晚高峰拥堵时段,主路的绿灯时间根据拥堵情况在12~20秒之间可调。
(1)装置启动后,交通灯A和交通灯B按照正常的规则,交替工作。交通灯的亮灯顺序为绿灯、黄灯、红灯;
(2)旋转电位器,实现主路交通灯A的绿灯时长在12~20秒之间可调;
4.红外遥控,红外遥控这种复杂程序一般都是在参考资料下修改的。注意这里用的IRremote库是2.6.0版本的,太新的库程序不同,无法使用。
参考资料:
#include <IRremote.h> //导入红外控制库,在arduino软件的工具-管理库-搜索IRremote
const int RECV_PIN = 12; //const int 定义整数常量
IRrecv irrecv(RECV_PIN); //创建名为IRrecv的红外接收对象
decode_results results; //创建名为decode_results对象,用于存储解码后的结果
void setup(){
Serial.begin(9600);
irrecv.enableIRIn(); //启动红外接收
}
void loop() {
if (irrecv.decode(&results)) { // 如果接收到红外信号并解码成功
Serial.println(results.value, HEX);// 以十六进制格式打印接收到的信号
irrecv.resume();// 准备接收下一个信号
}
delay(100);
}
5.小练习:
通过多次点击红外遥控器的按键1,实现LED灯不同状态的循环显示,具体说明如下:
(1)初始状态:LED_A和LED_B均处于熄灭状态;
(2)第1次按下按键1后,LED_A点亮,LED_B熄灭;
(3)第2次按下按键1后,LED_A熄灭,LED_B点亮;
(4)第3次按下按键1后,LED_A和LED_B均点亮;
(5)第4次按下按键1后,LED_A和LED_B持续闪烁;
(6)第5次按下按键1后,LED_A和LED_B均回归到熄灭状态,依此反复;
Arduino c语言基本知识6
1.Led按照不同频率亮灯同时闪烁或交替闪烁问题
void setup() {
pinMode(11, OUTPUT);
}
int ledDelay = 1000; //改变它就能改频率
long timeold = 0;
void loop() {
if (millis() - timeold > ledDelay) {
digitalWrite(11, !digitalRead(11));
digitalWrite(13, !digitalRead(13));
timeold = millis();
}
} void setup() {
pinMode(11, OUTPUT);
}
int ledDelay = 1000; //改变它就能改频率
long timeold = 0;
void loop() {
if (millis() - timeold > ledDelay) {
digitalWrite(11, !digitalRead(11));
digitalWrite(13, !digitalRead(11));
timeold = millis();
}
}
2.基本知识5最后一题的另一种答案
#include <IRremote.h>
const int RECV_PIN = 12;
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup() {
Serial.begin(9600);
irrecv.enableIRIn(); //启动红外接收
pinMode(11, OUTPUT);
pinMode(13, OUTPUT);
}
int zuangtai = 0;
int ledDelay = 500; //改变它就能改频率
long timeold = 0;
int kaishishan = 0;
void loop() {
if (irrecv.decode(&results)) {
if (results.value == 0xFF41BE) {
zuangtai++;
switch (zuangtai) {
case 1:
digitalWrite(11, HIGH);
digitalWrite(13, LOW);
break;
case 2:
digitalWrite(11, LOW);
digitalWrite(13, HIGH);
break;
case 3:
digitalWrite(11, HIGH);
digitalWrite(13, HIGH);
break;
case 4:
kaishishan = 1;
break;
case 5:
digitalWrite(11, LOW);
digitalWrite(13, LOW);
zuangtai = 0;
kaishishan = 0;
break;
}
}
Serial.println(results.value, HEX);
irrecv.resume(); // 准备接收下一个信号
}
if (kaishishan == 1) {
if (millis() - timeold > ledDelay) {
digitalWrite(11, !digitalRead(11));
digitalWrite(13, !digitalRead(13));
timeold = millis();
}
}
}
Arduino c语言基本知识5(简易答案)
上一页最后一题的答案
int zhuhong = 13, zhuhuang = 12, zhulv = 11;
int zhihong = 10, zhihuang = 9, zhilv = 8;
void setup() {
for (int i = 8; i <= 13; i++) {
pinMode(i, OUTPUT);
}
pinMode(A0, INPUT);
}
void loop() {
digitalWrite(zhuhuang, LOW);//上一状态关
digitalWrite(zhihuang, LOW);
digitalWrite(zhuhong, HIGH);//主红亮
digitalWrite(zhilv, HIGH);//支绿亮
delay(10000);
for (int i = 0; i < 5; i++) {//绿灯闪烁
digitalWrite(zhilv, LOW);
delay(200);
digitalWrite(zhilv, HIGH);
delay(200);
}
digitalWrite(zhuhong, LOW);//主红灭
digitalWrite(zhilv, LOW);//支红灭
digitalWrite(zhuhuang, HIGH);//黄亮
digitalWrite(zhihuang, HIGH);
delay(2000);
digitalWrite(zhuhuang, LOW);
digitalWrite(zhihuang, LOW);
digitalWrite(zhihong, HIGH);
digitalWrite(zhulv, HIGH);//主绿亮
delay(10000);
delay(map(digitalRead(A0),0,1023,0,8000));//
for (int i = 0; i < 5; i++) {
digitalWrite(zhulv, LOW);
delay(200);
digitalWrite(zhulv, HIGH);
delay(200);
}
digitalWrite(zhihong, LOW);
digitalWrite(zhulv, LOW);
digitalWrite(zhihuang, HIGH);
digitalWrite(zhuhuang, HIGH);
delay(2000);
}
#include <IRremote.h>
const int RECV_PIN = 12;
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup() {
Serial.begin(9600);
irrecv.enableIRIn(); //启动红外接收
pinMode(11, OUTPUT);
pinMode(13, OUTPUT);
}
int zuangtai = 0;
int kaishishan = 0;
void loop() {
if (irrecv.decode(&results)) {
if (results.value == 0xFF41BE) {
zuangtai++;
if(zuangtai == 1) {
digitalWrite(11, HIGH);
digitalWrite(13, LOW);
}
if(zuangtai == 2) {
digitalWrite(11, LOW);
digitalWrite(13, HIGH);
}
if(zuangtai == 3 ) {
digitalWrite(11, HIGH);
digitalWrite(13, HIGH);
}
if(zuangtai == 4) {
kaishishan = 1;
}
if(zuangtai == 5 ) {
digitalWrite(11, LOW);
digitalWrite(13, LOW);
zuangtai = 0;
kaishishan = 0;
}
}
Serial.println(results.value, HEX);
irrecv.resume(); // 准备接收下一信号
}
if (kaishishan == 1) {
digitalWrite(11,HIGH);
digitalWrite(13,HIGH);
delay(100);
digitalWrite(11,LOW);
digitalWrite(13,LOW);
delay(100);
}
}
Arduino c语言基本知识7
1.超声波测距原理
用数字引脚给超声波的Trig引脚10μs的高电平信号,可触发超声波模块测距功能。如有信号返回, Echo 引脚会输出高电平,高电平持续的时间就是超声波从发射到返回的时间。使用pulseIn()函数获取高电平持续的us时间,声速约340m/s=0.034cm/us,由于信号往返,所以
距离≈时间×0.034÷2≈时间÷58 cm
2.超声波测距代码:
int fasongT =12,jieshouE=13;
void setup() {
Serial.begin(9600);
pinMode(fasongT, OUTPUT);
pinMode(jieshouE, INPUT);
}
void loop() {
digitalWrite(fasongT, HIGH);
delayMicroseconds(10);
digitalWrite(fasongT, LOW);
Serial.print(pulseIn(jieshouE, HIGH)/58);
Serial.println("cm");
}
3.舵机控制原理
舵机使用pwm脉冲信号控制,通过改变占空比实现,虽然analogWrite()也能产生pwm脉冲信号,但是由于频率不同,使用analogWrite()控制舵机不可行。
题目会给舵机类库的参考资料:
头文件: Servo.h
类库对象:Servo
成员函数:attach(Pin) //指定引脚的关联引脚
write(angle) //功能是让舵机转动到指定的角度
4.舵机控制代码:
#include <Servo.h>
Servo myServo; // 创建一个Servo对象
void setup() {
myServo.attach(9); // 将舵机连接到数字引脚9
}
void loop() {
myServo.write(90); // 将舵机移动到90度位置
delay(1000); // 等待1秒
myServo.write(0); // 将舵机移动到0度位置
delay(1000); // 等待1秒
}
Arduino c语言基本知识8
1.基于状态机的编程,使用按键时的注意事项示例
#include <Servo.h>//导入舵机控制库
Servo servo; //创建名为servo的舵机对象
int zhuangtai = 0;//初始化状态机的值
void setup() {
servo.attach(12);//舵机servo对象的attach连接口属性
pinMode(8,INPUT);
pinMode(13, OUTPUT);
} // 注意不要把12再设置成OUTPUT,否则不转了
void loop() {
if (digitalRead(8) == HIGH) {
zhuangtai++; //按下后状态更新
if (zhuangtai == 3) {
zhuangtai = 0; //状态不能超过2,等到3则回归
}
while (digitalRead(8) == HIGH) {} //等松开
}
//开始判断状态
if (zhuangtai == 0) { //状态0,灯闪烁
digitalWrite(13, !digitalRead(13));
delay(100);
}
if (zhuangtai == 1) { //状态1,快摆
servo.write(30);
delay(300);
servo.write(90);
delay(300);
}
if (zhuangtai == 2) {//状态2,慢摆
servo.write(30);
delay(600);
servo.write(90);
delay(600);
}
} /////注意,这个程序要一直按足够长时间才会生效
2.电机控制
三线控制 二线控制第一种 二线控制第二种
一条pwm调速,另两条10正转,01反转,11刹车 不用调速则所有io口都可用,需要正反向调速则INA和INB两条线至少1条支持模拟输出(3 5 6 9 10 11)。
比如INA接3,INB接4,
以50%的功率正转:
analogWrite(3,128); digitalWrite(4,LOW);
以50%的功率反转:
analogWrite(3,128); digitalWrite(4,HIGH), 不用调速则所有io口都可用,需要正反向调速则INA和INB两条线都要支持模拟输出(3 5 6 9 10 11)。
比如INA接3,INB接5,
以50%的功率正转:
analogWrite(3,128); analoglWrite(5,0);
以50%的功率反转:
analogWrite(3,0); analogWrite(4,128),
3.电机控制参考程序
二线控制第一种:至少1条支持模拟输出
const int inA = 5; // PWM引脚
const int inB = 4; // 数字引脚
void setup() {
pinMode(inA, OUTPUT);
pinMode(inB, OUTPUT);
}
void loop() {
// 电机正转且速度为50%
digitalWrite(inB, LOW); // 保持INB为低电平
analogWrite(inA, 128); // 在INA上应用50%的PWM信号
delay(2000); // 保持电机正转2秒
// 停止电机
digitalWrite(inA, LOW);
digitalWrite(inB, LOW);
delay(1000); // 停止1秒
// 电机反转且速度为75%
digitalWrite(inB, HIGH); // INB为高电平
analogWrite(inA, 192); // 在INA上应用75%的PWM信号
delay(2000); // 保持电机反转2秒
// 停止电机
digitalWrite(inA, LOW);
digitalWrite(inB, LOW);
delay(1000); // 停止1秒
}
二线控制第二种:两条线都要支持模拟输出
const int inA = 10; // PWM引脚
const int inB = 9; // PWM引脚
void setup() {
pinMode(inA, OUTPUT);
pinMode(inB, OUTPUT);
}
void loop() {
// 电机正转且速度为50%
analogWrite(inA, 128); // INA为50%的PWM信号
analogWrite(inB, 0); // INB为0(低电平)
delay(2000); // 保持电机正转2秒
// 停止电机
analogWrite(inA, 0);
analogWrite(inB, 0);
delay(1000); // 停止1秒
// 电机反转且速度为75%
analogWrite(inA, 0); // INA为0(低电平)
analogWrite(inB, 192); // INB为75%的PWM信号
delay(2000); // 保持电机反转2秒
// 停止电机
analogWrite(inA, 0);
analogWrite(inB, 0);
delay(1000); // 停止1秒
}