赞
踩
认识单片机,决定学习单片机是个很偶然的决定。爱好计算机,喜欢编程有很多年了,一直对计算机底层的东西不太了解,尤其是计算机硬件更是知之甚少。一次偶然的机会获得了两个月的静下心来学习的时间(实际是受伤了哪都去不了),学点啥呢?学点单片机吧,于是买了本 郭天祥 的《51单片机C语言教程》,于是开启了单片机的学习之路……从什么是单片机,什么是寄存器,什么是中断,按键防抖,串口通信UART,I2C总线,SPI总线,看门狗等等,杂七杂八学了不少,了解了很多,但还是不系统,学了一段时间,51开发板就放到角落里吃灰了,哎,算是学着玩吧。
有一天看朋友在朋友圈发的用Arduino做的感应垃圾箱的视频,眼前一亮,这不就是单片机吗?这又燃起了我学习Arduino的欲望(好吧,我就是这么喜新厌旧),那就一点一点学吧,以后儿子参加个机器人比赛啥的我也能胡拉两下。
我的引路人:Arduino中文社区
几个好点的学习网站:
1.极客工坊
2.21世纪IC
Arduino就是个单片机,比51牛逼点,它的牛逼之处不是处理器多快,内存多大,而是它对初学者友好,有很多开源库供人调用,能够买到现成的传感器模块和对应的调用库。
Arduino有很多类型的开发板,对应不同的板载cpu和引出管脚,有
Arduino Uno
Arduino Nano
Arduino Nano
Arduino Nano
Arduino LilyPad
Arduino Mega 2560
Arduino Ethernet
Arduino Due
Arduino Leonardo
等等
(1)下载官方IDE
Arduino官方网站(有时打不开) / 百度网盘 提取码 6ust
一般情况下ArduinoIDE安装完成,所需要的驱动就安装好了,USB转串口的驱动也应该安装好了。 这样就可以进行开发了。
可是官方的IDE没有代码提示,界面比较刺眼,不如VScode开发着顺手,下面引用一篇文章https://blog.csdn.net/wowocpp/article/details/81175478,介绍vscode开发环境的搭建。
在进行Arduino开发时,没有像传统C/C++程序使用入口函数main。实际上main函数存在于Arduino核心库中,且仍然是程序的入口。
在Arduino核心库中可见main.cpp文件,其内容如下:
#include <Arduino.h> // Declared weak in Arduino.h to allow user redefinitions. int atexit(void (* /*func*/ )()) { return 0; } // Weak empty variant initialization function. // May be redefined by variant files. void initVariant() __attribute__((weak)); void initVariant() { } void setupUSB() __attribute__((weak)); void setupUSB() { } int main(void) { init(); initVariant(); #if defined(USBCON) USBDevice.attach(); #endif setup(); for (;;) { loop(); if (serialEventRun) serialEventRun(); } return 0; }
通过以上程序可见,Arduino程序中编写的setup和loop函数,都在main函数中调用了。
loop的循环执行,是通过for循环实现的,且每次loop结束后,都会进行串口事件判断,也正是因为这种设计,串口事件不能实时响应。
/* Blink 等待一秒钟,点亮LED,再等待一秒钟,熄灭LED,如此循环 */ // 在大多数Arduino控制板上 13号引脚都连接了一个标有“L”的LED灯 // 给13号引脚连接的设备设置一个别名“led” int led = 13; // 在板子启动或者复位重启后, setup部分的程序只会运行一次 void setup(){ //只运行一次 // 将“led”引脚设置为输出状态 pinMode(led, OUTPUT); } // setup部分程序运行完后,loop部分的程序会不断重复运行 void loop() { digitalWrite(led, HIGH); // 点亮LED delay(1000); // 等待一秒钟 digitalWrite(led, LOW); // 通过将引脚电平拉低,关闭LED delay(1000); // 等待一秒钟 }
pinMode(pin,mode);//pin为引脚,mode为模式(INPUT 输入模式;OUTPUT 输出模式;INPUT_PULLUP 输入上拉模式 )
digitalWrite(pin, value);//value=HIHG或者LOW
digitalRead(pin);//返回值为0或1
analogRead(pin);//读取模拟引脚上的0-5v模拟量,返回值为转换成0-1023的数字量
analogWrite(pin);//value指定的是PWM的脉冲宽度,范围为0~255
//调声函数
tone(pin, frequency);// frequency: 输出的频率,unsigned int型 duration: 方波持续的时间,单位毫秒。
tone(pin, frequency, duration);
noTone(pin);
//检测脉冲信号宽度,超声测距模块用的到
pulseIn(pin, value);//pin:需要读取脉冲的引脚;value:需要读取的脉冲类型,HIGH或LOW;
pulseIn(pin, value, timeout);//timeout:超时时间,单位微秒,数据类型为无符号长整型。
attachInterrupt(interrupt, ISR, mode);//interrupt:中断通道编号;ISR:中断函数名(不带参数,不返回值);
/*mode:中断模式
*LOW 低电平触发
*HIGH 高电平触发
*FALLING 下降沿触发
*RISING 上升沿触发
*/
detachInterrupt(pin);//关中断
millis();//返回Arduino开机/复位到现在的开机时间,单位ms,UNO精度为4us
micros();//开机时间us
delay(unsigned long ms);//延时毫秒数
delayMicroseconds(unsigned int us);//延时微妙数,精度+-0.5us
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。