arduino学习笔记18---SD卡读写实验教程文件
第十八课Arduino教程Arduino数学库

double fmin (double __x, double __y)
fmin()函数返回两个值x和y中较小的一个。如果一个参数是NaN,则返回另一个参数。如果两个参数都是NaN,则返回NaN。
17
double fmod (double __x, double__y)
fmod()函数返回x / y的余数。
返回
四舍五入的长整数值。如果x不是有限数字或者溢出,则此实现返回LONG_MIN值(0x80000000)。
27
long lround (double __x)
lround()将函数将x四舍五入到最近的整数,但中间情况不舍入到0(不是到最近的偶数整数)。这个函数类似于round()函数,但是它的返回值的类型是不同的,并且有可能溢出。
22
int isnan (double __x)
如果参数x表示“非数字”(NaN)对象,则函数isnan()返回1,否则返回0。
23
double ldexp (double __x, int __exp )
ldexp()函数将浮点数乘以2的整数次幂。它返回x乘以2的exp次幂的值。
24
double log (double __x)
3
double atan (double __x)
atan()函数计算x的反正切的主值。返回值在[-pi/2, pi/2]弧度的范围内。
4
double atan2 (double __y, double __x)
atan2()函数计算y/x的反正切的主值,使用两个参数的符号来确定返回值的象限。返回值在[-pi, +pi]弧度的范围内。
5
double cbrt (double __x)
sd卡数据读写流程

SD卡数据读写流程引言SD卡(Secure Digital Card)是一种常用的存储设备,通常用于移动设备、相机等电子产品中。
在使用SD卡时,数据的读写是一个非常重要的过程。
本文将详细介绍SD卡的数据读写流程,包括初始化、文件操作和数据传输等环节。
初始化SD卡初始化SD卡是数据读写的第一步,确保SD卡可以被正确地识别和使用。
下面是SD卡数据读写的初始化流程:1.插入SD卡:将SD卡插入目标设备的SD卡插槽中。
2.电源供给:为SD卡提供稳定的电源,通常通过连接电源线或使用内置电池来实现。
3.延时等待:等待SD卡稳定,一般为几毫秒的时间。
4.发送命令:通过SPI或SDIO等接口向SD卡发送特定的命令,以初始化SD卡。
5.接收响应:SD卡将返回初始化成功与否的响应,如果初始化成功,则可以进行后续的数据读写操作。
SD卡文件系统在进行数据读写之前,需要先设置SD卡的文件系统。
常用的文件系统包括FAT16、FAT32和exFAT等。
下面是SD卡文件系统的设置流程:1.格式化SD卡:使用格式化工具对SD卡进行格式化,以清除原有的文件系统和数据。
2.创建分区:根据需求,可以将SD卡分为一个或多个分区,并设置每个分区的大小。
3.创建文件系统:选择合适的文件系统类型,在分区上创建文件系统,并分配文件系统的容量。
4.分配文件表:文件系统会维护一个文件表,记录文件的位置、大小等信息。
在创建文件系统时,会分配一块空间来存储文件表。
5.设置文件权限:根据需要,可以设置文件的读写、执行权限,以保证文件的安全性。
SD卡数据读写操作SD卡的数据读写操作包括文件的创建、打开、读取、写入和关闭等。
下面是SD卡数据读写操作的详细流程:1.创建文件:通过文件系统接口,调用相关函数创建一个新的文件,并指定文件的名称和路径。
2.打开文件:使用文件系统的函数打开已经存在的文件,以便后续的读取和写入操作。
3.读取文件:通过文件系统提供的函数,在已经打开的文件中进行读取操作。
arduino学习笔记18---SD卡读写实验教程文件

a r d u i n o学习笔记18---S D卡读写实验本次实验使用arduino驱动SD卡,在SD卡中进行文件读写。
需要说明的是arduino的SD库文件,目前对2G以上的卡支持不是很好,所以推荐大家使用2G包含2G以下的,文件格式使用FAT格式。
这次我是用的是kingmax2G的MicroSD卡。
先看一下硬件连接图把下面代码下载进arduino控制板/*此例子展示如果记录三个模拟引脚数值到SD卡,使用SD库。
电路部分* 模拟引脚使用模拟口0,1,2大家可以根据情况接入模拟传感器,如果没有,也可以完成此实验,只不过数值是不停跳动的干扰源。
* SD卡与arduino控制板使用SPI总线连接** MOSI - pin 11** MISO - pin 12** CLK - pin 13** CS - pin 4*/#include <SD.h>// CS引脚为pin4,这里也沿用官方默认设置const int chipSelect = 4; //设定CS接口void setup(){Serial.begin(9600); //设置串口通信波特率为9600Serial.print("Initializing SD card..."); //串口输出数据Initializing SD card...pinMode(10, OUTPUT);if (!SD.begin(chipSelect)) { //如果从CS口与SD卡通信失败,串口输出信息Card failed, or not presentSerial.println("Card failed, or not present");return;}Serial.println("card initialized."); //与SD卡通信成功,串口输出信息card initialized.}void loop(){// 定义数组String dataString = "";// 读取三个传感器值,写入数组for (int analogPin = 0; analogPin < 3; analogPin++) {int sensor = analogRead(analogPin);dataString += String(sensor);if (analogPin < 2) {dataString += ",";}}// 打开文件,注意在同一时间只能有一个文件被打开// 如果你要打开另一个文件,就需要先关闭前一个File dataFile = SD.open("datalog.txt", FILE_WRITE);// 打开datalog.txt文件,读写状态,位置在文件末尾。
SD卡读写

SD卡读写(1)系统硬件文件系统只是数据的组织格式的统称,不涉及到硬件,所以系统的硬件与上篇日志中相同,不作修改。
(2)文件系统结构和读写原理带有文件系统的SD卡的内部结构一般如下表:256MSD卡的文件系统结构文件系统结构说明扇区起始号占用扇区数 Partiton Boot Sector 分区记录扇区 0 1 Reserved Sectors 保留扇区 0 4 FAT1 文件分配表1 4 242 FAT2 文件分配表2 246 242 DIR(FDT) 文件根目录区 488 32 User Data 数据区 520 493560 SD卡的保留扇区中一般不要写入数据,否则可能破坏其文件系统结构,导致操作系统不能识别。
在FAT文件系统中,BPB(Bios ParameterBlock)是一个很重要的参数表,该表通常位于0扇区(保留扇区中的第一个扇区)中的12-36字节,它记录了分区中的一些重要数据如总扇区数、每扇区的字节数、每簇的扇区数、保留扇区数、FAT表占用扇区数等,我这里的256M的SD卡中的BPB表如下:名称占用字节数内容说明BPB_BytesPerSec 2 0x0200 扇区大小为512字节 BPB_SecPerChus 1 0x08 每簇有8个扇区 BPB_RsvdSecCnt 2 0x0004 有4个保留扇区 BPB_NumFATs 1 0x02 有2个FAT表BPB_RootEntCnt 2 0x0200 根目录中可有512个登记项 BPB_TotSec16 20x0000 为0表示总扇区数大于65536BPB_MediaType 1 0xF8 磁盘介质为硬盘 BPB_FATSize16 2 0x00F2 每个FAT表占242个扇区 BPB_SecPerTrk 2 0x3F 每个磁道有63个扇区 BPB_NumHeads 2 0x00FF 磁头数为255BPB_HiddSec 4 0x00000000 有0个隐藏扇区 BPB_TotSec32 4 0x00078A00 共有494080个扇区保留扇区之后是文件分配表,FAT16文件系统有两份文件分配表(FAT),FAT的大小可以在BPB中查到。
(完整word版)ARDUINO入门及其简单实验(7例)

ARDUINO入门及其简单实验(7例) (2)1. Arduino硬件开发平台简介 (2)1.1 Arduino的主要特色 (3)1.2 Arduino的硬件接口功能描述 (3)1.3 Arduino的技术性能参数 (4)1.4 电路原理图 (4)2. Arduino软件开发平台简介 (5)2.1 菜单栏 (6)2.2 工具栏 (6)2.3 Arduino 语言简介 (7)3. Arduino开发实例中所用部分器件 (9)1. LED简介 (9)2. 光敏电阻简介 (10)3. 直流电机简介 (10)4. 电位器简介 (10)4. Arduino平台应用开发实例 (11)4.1【实作项目一】利用LED作光敏电阻采样实验 (11)4.2【实作项目二】利用PWM信号控制LED亮度 (13)4.3【实作项目三】单键控制一只LED的亮灭 (15)4.4【实作项目四】利用PWM控制直流电机转速 (17)4.5【实作项目五】利用电位器手控LED亮度 (20)4.6【实作项目六】控制LED明暗交替 (22)4.7【实作项目七】利用光敏电阻控制LED的亮灭 (24)ARDUINO入门及其简单实验(7例)1. Arduino硬件开发平台简介Arduino硬件是一块带有USB的I/O接口板(其中包括13条数字I/O引脚,6通道模拟输出,6通道模拟输入),并且具有类似于Java、C语言的集成开发环境。
Arduino既可以扩展一些外接的电子元器件,例如开关、传感器、LED、直流马达、步进马达或其他输入、输出装置;Arduino也可以独立运行,成为一个可以跟交互软件沟通的接口装置,例如:Flash、Processing、Max/MSP、VVVV或其他互动软件。
Arduino开发环境IDE全部开放源代码,可以供大家免费下载、利用,还可以开发出更多激发人们制作欲望的互动作品。
如图1和图2所示,分别为Arduino硬件平台的实物图和电路布局图。
单片机读写SD卡教程

郑重声明:本实验并不是对所有SD卡都能成功运行第一步:打开win hex软件,用读卡器读SD卡,在win hex中查看SD卡FPrlrj 旧nmg *御日・曲日尺 立件(日轄:号iifllPI 讥吵:当Tfllll 春罰;〔I SW (£)旨口凹帶此|;也S X电a► O C3 * -0 畫・■€■*电bld! IbiljUA ] 初1 悶「1|馆口曲佃 AgraaSBJLXsta InAEiqptetEJ' 03839535 16BH(*J-): 0曲* ?;第詞 EKt £i2f UrEiib&d MT 1 SOB 66.5 K0 1.2 MB Famof 跆hl 色 TipHium 1 Offset 0 1 2 3 4 5 6 7 3 9 A B c n E F /1 ModSfA'v wC Cans Ae^defDOOOOOD Ec 00 00 OD 00 00 DO aa 00 00 00 00 DO ao DO oo fc 1j uFirmwlrf Atv.. 1.D0 OCIIDOOOI 00 00 00 00 oo 00 00 OiO 00 no 00 00 GO no no 00..DUS : USB D000002D 00 00 00 00 00 00 DO 00 :ir 00 00 00 DO 00 DO ao I! ■DerauitEdnDD00003D 00 00 00 00 00 ao DO aa 00 00 00 00 DO a)a DO aa ■i ■ j 4Sl5te: original oomoQQin 00 00 00 00 00 on on OQ 00 no 00 00 00 Qi Q 00 00. .Undo lewef: 0 00000050 oa 00 00 00 00 00 DO OQ 00 00 00 00 m 00 DO QO r i ■, f Undo rsverses: Ma D000006D 00 OD 00 00 00 ao DO aa 00 00 00 ao DO o)a DO aa -・ --oonoau70 on 00 00 OQ 00 00 DO oa oa OQ 00 QO 00 ao DO 00. ■1.^7,1126.576 诩跆 DOOaOOBD oa 00 00 00 00 00 DO OQ 00 00 00 00 m 00 DO 00 r ・ ■■ 1D000009D 00 OD 00 00 00 ao DO aa 00 00 00 ao DO a)a DO oaii i J 4 Siapkis seclorfi 创 entE51 3 DOOQOaM) 00 00 00 OQ 00 00 no a>a 00 00 00 00 do00 DO-”4 4OOOOOOB oa 00 00 00 00 00 DO OU 00 00 00 00 DO 00 DO 00 r i■1 f Psritllfln: -:1 DOOOOOC D 00 00 00 aa 00 ao DO aa 00 00 00 ao DO a)o DO oa h ij 4R C ISW B S-BCbO r Ho Na OOOOOOD 00 QO m 00 00 00 00 no 00 00 GO 00 DO 00 00 ao MDC J B : hiBoodewnalOOOOOOE D 00 00 00 00 00 00 DO ao 00 00 00 00 00 00 DO 00, ,Cuaiader 虻I ANSI ASCIIoooaaoFD 00 OD 0000 DO ao DO aa 00 00 00 00 DO a)a DO aoOR 曲: hexadecwnaloomoaioo 00 00 00OQ oo 00 no aa 00 OQ 00 00 lOO Qi O 00 DOoooaoiiD 00 00 00 00 00 00 DO □ Q 00 00 00 00 m00DO 00 r ilnllnuiiw *. 1No ofwIridcrBVK' ID000012D 00 OD 00 00 00 ao DO aa 00 00 00 ao DO a)a DO oa ii iJ 4D000013Q oo 00 oo00 oo 00 oo ao oo no do Qfl oo oo 00 so加 Aab 用 00000140 DU 00 00 00 00 00 DO QO 00 00 00 00 DO ao DO 00 ,, ,.TEMPltilifer 1.2GBffee D000015D 00 OD 00 OQ 00 ao DO aa 00 00 00 ao DO a)a DO aa B1J 4 ^D MINI -IIL OC AL S'1 打 amp QOOOQ1B O 00 QO 00 QO oo 00 DO aa 00 00 00 00 lOO Qi O 00 DO..tJ 00000170 00 00 0000 00 00 DO 00 00 00 00 00 uo 00DO 00 r i■1 1J4D00001BD 00 00 00OQ 00 aoDO aa0000 00ao DO a)o DO oa “.J-SedamoT 胡4■加轴 0tT9«l:a=D Blatk-^ParHion 1Siad BecWrsUnp3it(jon^b*5 阿苗点击查找(ctrl+F ) Find Text 3 3 J J J J J J J J 3 ] ] ] ] ]The folouing text string wil be searched: FAT| caseASCII/Code page vUse this as a wildcardI I Whole wo(d^ odjjSearch:□ Cond.: offset mod =I_ Search in plgk only]Search in dll open windows |—| List search hits, 14)to 1Cancel输入FAT (找到 DBR 处)发现DBR 起始于0x11200扇区地址,它必是512整数倍,因为一个扇区含 512BYTE ,所以 在程序中读一个扇区时一定要是 512整数倍,否则会出错。
sd卡读写程序(SD card read and write program)

sd卡读写程序(SD card read and write program)SD card read and write programObjective: To study the SD card / / operationDesign / software1, using SPI communication / / SD card2, go to SD / / in order to 0-255 a total of 256 data, and then read back LCD1602 display/ / hardware requirements:S11 ON / / dial switchJumper J18 / / all connected#include <p30f6014.h> //dsPIC30F6014 standard header file_FOSC (CSW_FSCM_OFF & XT_PLL4); //4 doubler crystal oscillator, Failsafe clock closed_FWDT (WDT_OFF); / / close the watchdog timer_FBORPOR (PBOR_OFF & MCLR_EN); / / reset prohibited MCLR reset enable._FGS (CODE_PROT_OFF); / / code protection against#define CS PORTGbits.RG9 / / SD card selection pin definition#define RS TB4 / / definition LCD control bits (note here can only register with LATB, you cannot directly use the PORTB register)#define RW TB5#define e TB6Unsigned char __attribute__ ((address (0x900)))lcd[3]={0,0,0};Void (spi_init); / / declaration system initial functionVoid (spi_low); / / that produces low baud rate (using the SD card initialization function)Void (spi_high); / / that produce high baud rate function (SD card initialization after use)Unsigned char (sd_reset); / / that the SD card initialization functionUnsigned char SD_SendCommand (unsigned char CMD unsigned, long ARG); / / write SD card command function statementUnsigned char SPI_WriteByte (unsigned char VAL); / / write a byte function statementUnsigned char SPI_ReadByte (void); / / that receive a byte functionUnsigned char SD_WriteSingleBlock (unsigned long sector); / / that single BLOCK data write SD card functionUnsigned char SD_ReadSingleBlock (unsigned long sector); / / read SD card data function single BLOCK statementVoid (lcd_display); / / state results display functionVoid (delay); / / state delay function (shown by)/ / system initialization functionVoid spi_init (){TRISG=0x00d0; / / set the SDI output, C output port for the otherTRISB=0X0000; / / set for the output port BTRISD=0X0000; / / set for the output port DSPI2CON=0x0278; / / idle bus is high, fosc/64SPI2STAT=0x8000; / / the end of sampling the output data of input data, the rising edge of data transmission}Write a LCD program ****************************************//*************************/ / write a byte of data functionAfter changing the level / / on the need to insert a delay time, otherwise the LCD react.Void write (unsigned char x){PORTD=x; / / PORTD port to send data to be displayedDelay ();Rs=1; / / the byte data, rather than commandDelay ();Rw=0; / / the operation for writing,Instead of readingDelay ();E=0; / / low enable signal(delay); / / keep the enable signal is low for a period of timeE=1; / / pull high enable signal needed by the rising edge of the LCD operationDelay ();}//********************LCD display settings function**************************************After changing the level / / on the need to insert a delay time, otherwise the LCD react.Void lcd_enable (){Delay ();Rs=0; / / the byte data for the command, rather than the dataDelay ();Rw=0; / / the operation for writing, instead of readingDelay ();E=0; / / low enable signal(delay); / / keep the enable signal is low for a period of timeE=1; / / pull high enable signal needed by the rising edge of the LCD operationDelay ();}//*********************LCD initialization function**************************************Void lcd_init (){PORTD=0X1; / / displayLcd_enable ();PORTD=0X38; //8 bit 2 row 5*7 dot matrixLcd_enable ();PORTD=0X0e; / / display, cursor, flashingLcd_enable ();PORTD=0X06; / / the text does not move the cursor to the right. Lcd_enable ();PORTD=0X86; / / time display.Lcd_enable ();}//***********************LCD display function************************************Void lcd_display (){Unsigned char I, j;Lcd_init ();For (i=0; i<3; / / i++) a total of 3 bytes of data{Write (lcd[i]); / / look-up table for data and call to write a byte of data to the LCD display functionFor (j=0; j<5; / / j++) for a period of time (mainly in order to control the display speed){delay ();}}}//**************** write a byte ***************************functionUnsigned char SPI_WriteByte (unsigned char VAL){SPI2BUF = Val; / / to be sent to the transmitting register data loadingWhile (IFS1bits.SPI2IF!); / / wait for sentIFS1bits.SPI2IF=0; / / clear to send complete flagReturn SPI2BUF; / / read receive register (even invalid data is empty)}//**************** receive a byte ************************** functionUnsigned char SPI_ReadByte (void){SPI2BUF = 0xff; / / send register loading data, receiving data to startWhile (IFS1bits.SPI2IF!); / / wait for the completion of receivingIFS1bits.SPI2IF=0; / / clear receive complete flagReturn SPI2BUF; / / read the received data}//***************** send command function****************************Unsigned char SD_SendCommand (unsigned char CMD, unsigned long ARG){Unsigned char r1;Unsigned char retry1=0; / / the number of repeat operationCs=0; / / the chip select signalSPI_WriteByte (CMD 0x40 |); / / write command respectively.SPI_WriteByte (arg>>24); / / fourth byte data segmentSPI_WriteByte (arg>>16); / / third byte data segmentSPI_WriteByte (arg>>8); / / second byte data segmentSPI_WriteByte (ARG); / / first byte data segmentSPI_WriteByte (0x95); //CRC checksumWhile ((R1 = SPI_WriteByte (0xff)) = = 0xff) / / wait for a responseIf break (retry1++ > 200); / / exit timeoutCs=1; / / early chip select signalReturn R1; / / return status}//*******************SD initialization function**************************Unsigned char sd_reset (){Unsigned char I, tmp;Unsigned char retry; / / repeatUnsigned char r1=0;Retry=0;Delay ();Delay ();{For (i=0; i<100; i++) SPI_WriteByte (0xff);R1 = SD_SendCommand (0,0); / / idle commandRetry++;If (retry>20) return 1; / / exit timeout} while (R1! = 0x01); / / wait for the command to return IDLE Retry = 0;Cs=0;Do{For (i=0; i<100; i++) SPI_WriteByte (0xff);R1 = SD_SendCommand (1, 0); / / Active commandRetry++;If (retry>254) return 1; / / exit timeout} while (R1);For (i=0; i<100; i++) SPI_WriteByte (0xff);R1 = SD_SendCommand (59, 0); / / CRCIf (R1 return 1); / / return is not correct, exit initialization For (i=0; i<100; i++) SPI_WriteByte (0xff);R1 = SD_SendCommand (16, 512); / / set the sector size 512If (R1 =0 return 1!); / / return is not correct, exit initializationReturn 0; / / return to normal}//******************** write a sector**************************Unsigned char SD_WriteSingleBlock (unsigned long sector) {Unsigned char r1;Unsigned int i;Unsigned char retry=0;{For (i=0; i<100; i++) SPI_WriteByte (0xff);R1 = SD_SendCommand (24, sector<<9); / / write command Retry++;If (retry>10) return 1; / / exit timeout} while (R1 = = 0x00);Cs=0;SPI_WriteByte (0xff);SPI_WriteByte (0xff);SPI_WriteByte (0xff);SPI_WriteByte (0xff);SPI_WriteByte (0xff);SPI_WriteByte (0xff);SPI_WriteByte (0xFE); / / the start symbolFor (i=0; i<512; / / i++) to send 512 bytes of data{If (i<255) SPI_WriteByte (I); / / send 0--255Else SPI_WriteByte (512-i); / / send 255--0}SPI_WriteByte (0x95);SPI_WriteByte (0x95); //16-bits CRCR1 = SPI_WriteByte (0xff); / / read a responseIf (retry++ >10) return 1;Timeout / exitWhile (! ((r1&0x0f) ==5)); / / wait for data receive information(while! (SPI_WriteByte (0xff))); / / wait for the internal SD card programmingReturn 0;}//****************** SD card reading a sector************************Unsigned char SD_ReadSingleBlock (unsigned long sector){Unsigned char R1, temp;Unsigned int i, j;Unsigned char retry=0;Do{R1 = SD_SendCommand (17, sector<<9); / / read commandRetry++;If (retry>10) return 1; / / exit timeout} while (R1 = = 0x00);Cs=0;While (SPI_WriteByte (0xff)! = 0xFE) / / wait for receiving a start byte{If (retry++ >100) return 1; / / exit timeout}For (i=0; i<512; i++) / / read 512 data{Temp = SPI_WriteByte (0xff); / / read the received data Lcd[0]= (temp/100) +48;Lcd[1]= ((temp%100) /10) +48;Lcd[2]= ((temp%100)%10) +48;(lcd_display); / / read data sent to the displayFor (j=0; j<500; j++) {delay ();}}SPI_WriteByte (0xff); / / pseudo 16-bits CRCSPI_WriteByte (0xff);Cs=1;Return 0;}//*********************** delay procedures*************************Void (delay) / delay procedure{Int i; / / define integer variableFor (i=0x100; i--;); / / delay}The main function of ************************** //************************Int main (void){Unsigned char loop, res;Delay ();Delay ();Delay ();Loop=1;Cs=1;While (loop){(spi_init); / / call system initialization functionRes= (sd_reset); / / call the SD card initialization functionIf (RES break); / / SD card initialization is normal, not normal, not out of the loop executes the read and write operationsSD_WriteSingleBlock (1); / / call and write SD card single BLOCK function, the sector is 1If (RES) break;SD_ReadSingleBlock (1); / / call read SD card single BLOCK function, the sector number is 1If (RES) break;Loop=0;While (1);}While (1);}。
SD卡读写操作详细说明

51单片机实现对SD卡的读写SD卡SPI模式下与单片机的连接图:22.23.//获得16位的回应24. Read_Byte_SD(); //read the first byte,ignore it.25.do26. { //读取后8位27. tmp = Read_Byte_SD();28. retry++;29. }30.while((tmp==0xff)&&(retry<100));31.return(tmp);32.}2)初始化SD卡的初始化是非常重要的,只有进行了正确的初始化,才能进行后面的各项操作。
在初始化过程中,SPI的时钟不能太快,否则会造初始化失败。
在初始化成功后,应尽量提高SPI的速率。
在刚开始要先发送至少74个时钟信号,这是必须的。
在很多读者的实验中,很多是因为疏忽了这一点,而使初始化不成功。
随后就是写入两个命令CMD0与CMD1,使SD卡进入SPI模式初始化时序图:初始化例程:1.//--------------------------------------------------------------------------2.初始化SD卡到SPI模式3.//--------------------------------------------------------------------------4.unsigned char SD_Init()5.{6.unsigned char retry,temp;7.unsigned char i;8.unsigned char CMD[] = {0x40,0x00,0x00,0x00,0x00,0x95};9. SD_Port_Init(); //初始化驱动端口10.11. Init_Flag=1; //将初始化标志置112.13.for (i=0;i<0x0f;i++)14. {15. Write_Byte_SD(0xff); //发送至少74个时钟信号16. }17.18.//向SD卡发送CMD019. retry=0;20.do21. { //为了能够成功写入CMD0,在这里写200次22. temp=Write_Command_SD(CMD);23. retry++;24.if(retry==200)25. { //超过200次26.return(INIT_CMD0_ERROR);//CMD0 Error!27. }28. }29.while(temp!=1); //回应01h,停止写入30.31.//发送CMD1到SD卡32. CMD[0] = 0x41; //CMD133. CMD[5] = 0xFF;34. retry=0;35.do36. { //为了能成功写入CMD1,写100次37. temp=Write_Command_SD(CMD);38. retry++;39.if(retry==100)40. { //超过100次41.return(INIT_CMD1_ERROR);//CMD1 Error!4.unsigned char Read_CSD_SD(unsigned char *Buffer)5.{6.//读取CSD寄存器的命令7.unsigned char CMD[] = {0x49,0x00,0x00,0x00,0x00,0xFF};8.unsigned char temp;9. temp=SD_Read_Block(CMD,Buffer,16); //read 16 bytes10.return(temp);11.}4)读取SD卡信息综合上面对CID与CSD寄存器的读取,可以知道很多关于SD卡的信息,以下程序可以获取这些信息。
存储器读写实验实验总结

存储器读写实验实验总结
存储器读写实验是一种常见的电子实验,通过这个实验,我们可以了解存储器的读写原理以及存储器的工作方式。
本次实验中,我们使用了Arduino UNO开发板和24C02 EEPROM存储器芯片,下面对实验进行总结。
实验目的:
本次实验的目的是了解存储器的读写原理、存储器芯片的类型、接口方式、存储器操作等基本概念,并通过实验掌握使用Arduino控制EEPROM存储器读写操作的方法。
实验步骤:
1. 准备材料,包括Arduino UNO开发板、24C02 EEPROM存储器芯片、杜邦线等。
2. 将EEPROM存储器芯片与Arduino开发板连接,具体连接方式可以参考实验指导书。
3. 编写程序,在程序中定义存储器读写操作所需的引脚和操作函数。
4. 将程序烧录到Arduino开发板中。
5. 运行程序,进行存储器读写操作。
实验结果:
我们通过实验成功地实现了对EEPROM存储器芯片的读写操作,确认了存储器
芯片的工作状态和数据存储情况。
通过查看串口输出信息,我们可以看到读取的数据和写入的数据以及相应的内存地址信息。
实验体会:
本次实验让我们更加深入地了解了存储器的读写原理和存储器芯片的类型、接口方式、存储器操作等基本概念。
同时,我们通过实验也掌握了使用Arduino控制EEPROM存储器读写操作的方法,对我们今后的学习和工作都将有很大帮助。
总之,存储器读写实验是一项非常有意义的实验,通过实验的学习,我们可以更好地理解存储器的工作原理,为今后的学习和工作打下坚实的基础。
Arduino读写SD卡

Arduino读写SD卡的例子清单15-1 项目42的代码//项目42//sdfatlib的例子,Bill Greiman写的SD读写实例#include <SdFat.h>#include <SdFatUtil.h>Sd2Card card;SdVolume volume;SdFile root;SdFile file;//在Flash存储器中存储错误字符串,节省RAM空间#define error(s) error_P(PSTR(s))void error_P(const char* str) {PgmPrint("error: ");SerialPrintln_P(str);if (card.errorCode()) {PgmPrint("SD error: ");Serial.print(card.errorCode(), HEX);Serial.print(',');Serial.println(card.errorData(), HEX);}while(1);}//向文件写一个回车或换行符号void writeCRLF(SdFile& f) {f.write((uint8_t*)"\r\n", 2);}//写一个无符号数到文件void writeNumber(SdFile& f, uint32_t n) {uint8_t buf[10];uint8_t i = 0;do {i++;buf[sizeof(buf) - i] = n%10 + '0';n /= 10;} while (n);f.write(&buf[sizeof(buf) - i], i);}//写字符串到文件void writeString(SdFile& f, char *str) {uint8_t n;for (n = 0; str[n]; n++);f.write((uint8_t *)str, n);}void setup() {Serial.begin(9600);Serial.println();Serial.println("Type any character to start");while (!Serial.available());//初始化SD卡在一半的通信速度避免使用面包板造成总线错误//如果你的卡可以使用全速执行if (!card.init(SPI_HALF_SPEED)) error("card.init failed");//初始化FAT卷标if (!volume.init(&card)) error("volume.init failed");//打开根目录if (!root.openRoot(&volume)) error("openRoot failed");//生成一个新文件char name[] = "TESTFILE.TXT";file.open(&root, name, O_CREAT | O_EXCL | O_WRITE);//在这里放当天的日期时间file.timestamp(2, 2010, 12, 25, 12, 34, 56);//写10行数据到文件for (uint8_t i = 0; i < 10; i++) {writeString(file, "Line: ");writeNumber(file, i);writeString(file, " Write test.");writeCRLF(file);}//关闭文件并强制写所有数据到SD卡file.close();Serial.println("File Created");//打开文件if (file.open(&root, name, O_READ)) {Serial.println(name);}else{error("file.open failed");}Serial.println();int16_t character;while ((character = file.read()) > 0) Serial.print((char)character);Serial.println("\nDone");}void loop() { }米多(68173331) 19:16:34《Arduino从基础到实践》中的一个例子米多(68173331) 19:17:57Arduino接互联网的例子输入清单17-1中的代码。
Arduino技术及应用--第21章SD卡的类库使用

21.2 SD卡类库成员函数
SDClass 类
(6) rmdir( ) 功能:移除文件夹。被移除的文件夹必须是空的。 语法:SD. rmdir(filename) 参数:filename,需要移除的文件夹名。其中可以包含路径,路径用 “/”分隔。 返回值:boolean型值,为true表示移除成功;为false表示移除失败。
21.2 SD卡类库成员函数
SDClass 类
(3) open( ) 参数: filename,需要打开的文件名。其中可以包含路径,路径用“/”分隔。 mode(可选),打开文件的方式,默认使用只读方式打开。也可以使用以 下两种方式打开文件:
FILE_READ,只读方式打开文件; FILE_WRITE,写入方式打开文件。 返回值:返回被打开文件对应的对象;如果文件不能打开,则返回false。
21.2 SD卡类库成员函数
SDClass 类
(1) begin( ) 功能:初始化SD卡库和SD卡。 语法: SD. begin( ) SD. begin (cspin) 当使用SD. begin( )时,默认将Arduino SPI的SS引脚连接到SD卡的CS使能 选择端;也可以使用begin(cspin)指定一个引脚连接到SD卡的CS使能选择端, 但仍需保证SPI的SS引脚为输出模式,否则SD卡库将无法运行。 参数:cspin,连接到SD卡CS端的Arduino引脚。 返回值:boolean型值,为true表示初始化成功;为false表示初始化失败。
21.2 SD卡类库成员函数
SDClass 类
(5) mkdir( ) 功能:创建文件夹。 语法:SD. mkdir(filename) 参数:filename,需要创建的文件夹名。其中可以包含路径,路径用 “/”分隔。 返回值:boolean型值,为true表示创建成功;为false表示创建失败。
Arduino教程

Arduino教程Arduino LWZ 教程V1.0目录一、Arduino编程语言 (4)1、数据类型: (4)2、常量: (4)3、基本语句: (4)(1)if语句 (4)(2)if...else...语句 (5)(3)for语句 (5)(4)break和continue (6)(5)switch case语句 (6)(6)while语句和do...while语句 (7)(7)return语句 (8)(8)运算符 (8)(9)函数 (8)4、结构函数: (8)5、功能函数: (9)(1)数字I/O函数 (9)(2)模拟I/O函数 (9)(3)时间函数 (9)(4)数学函数 (10)(5)数据类型转换函数 (10)(6)三角函数 (10)(7)随机数函数 (10)(8)外部中断函数 (11)(9)中断使能函数 (11)(10)串口收发函数 (11)6、官方库文件: (11)二、Sabertooth电机驱动模块应用实例 (13)1、工作模式 (13)(1)Mode1: Analog Input (13)(2)Mode2:R/C Input (14)(3)Mode3:Simplified serial (14)(4)Mode4:Packetized serial (15)2、应用实例 (17)(1)硬件连接 (17)(2)小车停止函数 (18)(3)小车前进函数 (19)(4)小车后退函数 (19)(5)小车右转函数 (20)(6)小车左转函数 (21)(7)电子积木编程思路 (22)(8)PC软件的编程思路 (25)(1)硬件连接 (25)(2)电子积木运动和初始化函数 (25)(3)电子积木编程思路 (26)4、通过无线模块控制小车 (28)(1)无线通信模块 (28)(2)硬件连接 (28)(3)电子积木编程思路 (28)5、下载程序串口COM和无线数模串口COM2同时控制小车 (30)(1)硬件连接 (31)(2)电子积木编程思路 (31)三、TN901_TEST非接触测温模块应用实例 (34)1、TN901工作原理 (34)2、应用实例 (36)(1)硬件连接 (36)(2)读取温度函数 (36)(3)初始化函数 (38)(4)电子积木编程思路 (38)3、多个TN模块的应用实例 (39)(1)硬件连接 (39)(2)初始化函数 (39)(3)电子积木编程思想:共享函数 (40)(4)电子积木编程思路:独立函数 (42)四、气体传感器模块应用实例 (46)1、应用实例 (46)(1)硬件连接 (46)(2)电子积木编程思路 (46)2、多个气体传感器的应用实例 (47)(1)硬件连接 (47)(2)电子积木编程思路 (47)五、火焰传感器模块应用实例 (48)1、应用实例 (48)(1)硬件连接 (48)(2)电子积木编程思路 (49)2、多个火焰传感器的应用实例 (49)(1)硬件连接 (49)(2)电子积木编程思路 (50)六、DF-miniLTV3寻线模块应用实例 (50)1、DF-miniLTV3寻线工作原理 (50)2、DF-miniLTV3寻线在单黑线的应用实例 (51)(1)硬件连接 (52)(2)Sabertooth模块函数 (52)(3)初始化函数 (52)(4)电子积木编程思路 (52)(1)硬件连接 (54)(2)电子积木编程思路 (54)(2)PC软件的编程思路 (56)七、舵机模块应用实例 (56)1、舵机工作原理 (56)2、应用实例 (57)(1)硬件连接 (57)(2)电子积木编程思路 (57)3、非库形式的应用实例 (59)(1)硬件连接 (59)(2)双舵机驱动函数 (59)八、综合实例 (63)1、驱动2台舵机和电机的应用实例 (63)(1)硬件连接 (63)(2)电子积木编程思路 (64)2、测3个测温度、驱动电机的应用实例 (64)(1)硬件连接 (64)(2)电子积木编程思路 (64)3、测3个测温度、驱动2台舵机和电机的应用实例 (65)(1)硬件连接 (65)(2)电子积木编程思路 (65)4、测2个气体、2个火焰、3个测温度、驱动2台舵机和电机的应用实例 (65)(1)硬件连接 (65)(2)电子积木编程思路 (65)5、寻线、测2个气体、2个火焰、3个测温度、驱动2台舵机和电机的应用实例 (66)(1)硬件连接 (66)(2)电子积木编程思路 (66)一、Arduino编程语言Arduino语言是建立在C/C++基础上的。
单片机读写SD卡教程

单片机读写SD卡教程引言:SD卡(Secure Digital Card)是广泛应用于各类数字设备上的一种存储介质。
它小巧轻便,可靠性高,容量大,因此在各种嵌入式系统中都广泛使用。
本教程将介绍如何使用单片机读写SD卡,包括初始化SD卡、读写数据等基本操作。
一、硬件准备在开始之前,我们需要准备以下硬件设备:1.一个支持SPI协议的单片机开发板(例如STC89C51、STM32等);2.一个SD卡插槽,或者是一个带有SD卡插槽的扩展板;3.杜邦线、面包板等连接器。
二、软件准备除了硬件设备,我们还需要准备以下软件工具:1. Keil C51、IAR、Keil MDK等单片机编译工具;2. SD卡相关的库文件,例如FatFs;3.一个用于测试的程序(可以是一个简单的读写数据的程序)。
三、连接SD卡插槽将SD卡插入到对应的插槽中,并将插槽与单片机的硬件SPI接口连接。
根据不同的开发板,连接方式可能有所不同,一般SPI接口包括SCK(时钟线)、MOSI(主机输出从机输入线)、MISO(主机输入从机输出线)和CS(片选线)等。
四、编写读写SD卡的程序在开始编写程序之前,我们需要先了解SD卡的工作原理。
SD卡通过SPI总线与单片机进行通信,通过发送特定的命令和参数实现读写操作。
以下是一个简单的读写SD卡的流程:1.初始化SD卡a.发送CMD0命令,将SD卡设置为SPI模式;b.发送CMD8命令,验证SD卡是否支持高速SPI模式;c.发送ACMD41命令,等待SD卡初始化完成。
2.读写数据a.发送CMD17命令,指定要读取的扇区地址;b.等待SD卡回应,确认读取命令执行成功;c.读取数据;d.发送CMD18命令,继续读取下一个扇区;e.重复步骤c和d,直到读取完所有数据;f.发送CMD12命令,停止读取。
g.发送CMD24命令,指定要写入的扇区地址;h.等待SD卡回应,确认写入命令执行成功;i.写入数据;j.发送CMD25命令,继续写入下一个扇区;k.重复步骤i和j,直到写入完所有数据;l.发送CMD12命令,停止写入。
sd卡数据读写流程

sd卡数据读写流程SD卡是一种常见的存储媒介,它具有轻便、易携带、容量大、存储速度快等优势。
SD卡数据读写流程是指将数据从SD卡中读取出来或将数据写入SD卡中的整个过程。
一、SD卡的物理结构SD卡主要由控制器、记忆芯片和接口组成。
控制器负责管理SD卡的读写操作;记忆芯片是存储数据的核心部件,它采用闪存技术,可存储数据并保持数据不易丢失;接口是SD卡与主控制器进行通信的桥梁,一般采用SPI(串行外设接口)或SDIO(SD输入输出)接口。
二、SD卡读写流程1.初始化SD卡当主控制器接通SD卡电源时,首先要进行初始化操作。
初始化操作主要包括向SD卡发送复位命令、读取SD卡的OCR(操作条件寄存器)以及设置SPI或SDIO接口的工作参数等操作。
2.读取SD卡信息在SD卡初始化成功后,主控制器通过SPI或SDIO接口向SD 卡发送命令,读取SD卡ID信息、SD卡容量、SD卡速度等重要参数。
这些信息将在数据读写时起到重要作用。
3.读取文件SD卡上的文件存储在文件系统中,主控制器需要先读取文件系统,找到要读取的文件所在的位置。
一般情况下,文件系统采用FAT32格式,主控制器需要读取文件系统启动区扇区信息,从而找到文件所在扇区及其起始地址。
4.读取数据在找到文件所在位置后,主控制器就可以根据文件系统的信息,向SD卡发送读操作指令,读取文件数据。
读取数据时,主控制器需要根据SD卡的速度、数据传输模式等参数设置接口波特率、时序等参数。
5.写入数据SD卡写数据流程与读数据基本相同,只是主控制器需要向SD卡发送写操作指令,将数据写入SD卡中。
写入数据时,主控制器需要根据SD卡的容量、速度等参数设置写入数据的起始位置、写入数据的长度、写入数据的校验和等参数。
6.关闭SD卡当读写操作完成后,主控制器需要向SD卡发送停止指令,将SD卡彻底关闭。
关闭SD卡可以避免SD卡数据丢失、损坏等问题。
三、SD卡的数据保护SD卡存储的数据非常重要,因此在SD卡的读写过程中,需要采取一定的措施保护数据。
NodeMCU读写SD卡.上

NodeMCU读写SD卡.上先选择你的型号选择demo该示例显示了如何记录来自三个模拟传感器的数据使用SD库将其复制到SD卡。
电路:模拟输入0、1和2上的模拟传感器SD卡连接到SPI总线的方法如下:** MOSI-引脚11** MISO-针脚12** CLK-针脚13** CS-针脚4这个是UNO的连接图得出一个结论,ESP的demo在瞎鸡儿写。
头打烂给你,在8266上面你找到这些引脚,屁股给你踢歪。
骂归骂,事还得办完。
我们可以知道,一次可以连接上三组spi,如果就看片选的引脚GPIO0是烧写的引脚,需要慎重。
也就是说,两个SPI的传感器,最少5根线~两个片选如果就一个SPI的话,可以少一根线。
因为就它一个设备,就不远选了这个图可以说是十分形象了问了半天,表述很重要。
有人教更重要,当然别的小伙伴了。
不一一道谢了SPI的通信原理很简单,它是全双工主从通信方式,这种模式下通常有一个主设备和一个或者多个从设备(注意,同一时刻,只有一个主设备和一个从设备进行通信),需要至少4根线,特殊情况下(单向传输时)3根线也可以。
SPI的器件工作在SPI规定下的两种基本模式,即SPI主模式和SPI从模式。
在一个SPI设备中,通常有如下表的几个引脚:主设备负责启动通信,负责输出时钟信号以及选择通信的从设备。
当有多个从设备的时候,因为每个从设备上都有一个CS引脚接入到主设备中,当我们主设备和某个从设备通信时将需要将从设备的CS引脚电平设置为低电平或者高电平(根据实际情况而定)。
数据的收发通过MISO和MOSI进行。
NodeMCU的SPI(注意与HSPI区分)引脚(SD0-SD3、CLK、CMD)专门用于与ESP-12E的外接flash芯片进行Quad-SPI通信,因此不能用于SPI应用。
基于ESP8266的NodeMcu具有HSPI,具有4个可用于SPI通信的引脚(GPIO12-GPIO15)。
通过这个SPI接口,我们可以将任何支持SPI的设备与NodeMcu连接起来,并与其进行通信里面的一组SPI已经挂存储芯片了,我们用的硬件只有一个了。
Arduino+ESP32之SD卡读写

Arduino+ESP32之SD卡读写背景知识:有两种使⽤SD卡的⽅法,⼀种是使⽤SPI接⼝访问SD卡,另⼀种是使⽤SDMMC接⼝访问SD卡。
Arduino core for the ESP32中SPI⽅式占⽤4个IO⼝,SDMMC⽅式占⽤6个IO⼝,⼀般来说SDMMC⽅式速度要⽐SPI⽅式快。
1. SDMMC⽅式ESP32虽然有两组SDMMC接⼝,但Arduino core for the ESP32中只⽤到了其中⼀组,IO⼝连接为:DAT2 - IO12、DAT3 - IO13、CMD -IO15、CLK - IO14、DAT0 - IO2、DAT1 - IO4;bool begin(const char * mountpoint="/sdcard", bool mode1bit=false)挂载存储卡,输⼊参数分别为挂载点、是否使⽤⼀线模式;void end()取消挂载;sdcard_type_t cardType() 返回存储卡类型,0、1、2、3、4,分别如下:CARD_NONE 未连接存储卡;CARD_MMC mmc卡;CARD_SD sd卡,最⼤2G;CARD_SDHC sdhc卡,最⼤32G;CARD_UNKNOWN 未知存储卡;uint64_t cardSize() 返回存储卡⼤⼩字节数;uint64_t totalBytes() 返回⽂件系统总字节数;uint64_t usedBytes() 返回⽂件系统已⽤字节数;2. SPI⽅式bool begin(uint8_t ssPin=SS, SPIClass &spi=SPI, uint32_t frequency=4000000, const char * mountpoint="/sd", uint8_t max_files=5)挂载存储卡,输⼊参数分别为SS引脚号、SPI对象、时钟频率、挂载点、⽂件最⼤同时打开数;默认IO⼝连接为:CS - IO5、DI - IO23、SCLK - IO18、DO - IO19;void end()取消挂载;sdcard_type_t cardType() 返回存储卡类型,0、1、2、3、4,分别如下:CARD_NONE 未连接存储卡;CARD_MMC mmc卡;CARD_SD sd卡,最⼤2G;CARD_SDHC sdhc卡,最⼤32G;CARD_UNKNOWN 未知存储卡;uint64_t cardSize() 返回存储卡⼤⼩字节数;uint64_t totalBytes() 返回⽂件系统总字节数;uint64_t usedBytes(); 返回⽂件系统已⽤字节数3. 我的实验我⼿头的ESP32_CAM板⼦的原理图右图可知,我的SD卡接到了ESP32的GPIO12 13 14 15 2 4 这6个脚上,根据前述,这符合SDMMC⽅式的IO连接。
SD卡读写操作详细说明

SD卡读写操作详细说明51单⽚机实现对SD卡的读写SD卡SPI模式下与单⽚机的连接图:22.23.//获得16位的回应24. Read_Byte_SD(); //read the first byte,ignore it.25.do26. { //读取后8位27. tmp = Read_Byte_SD();28. retry++;29. }30.while((tmp==0xff)&&(retry<100));31.return(tmp);32.}2)初始化SD卡的初始化是⾮常重要的,只有进⾏了正确的初始化,才能进⾏后⾯的各项操作。
在初始化过程中,SPI的时钟不能太快,否则会造初始化失败。
在初始化成功后,应尽量提⾼SPI的速率。
在刚开始要先发送⾄少74个时钟信号,这是必须的。
在很多读者的实验中,很多是因为疏忽了这⼀点,⽽使初始化不成功。
随后就是写⼊两个命令CMD0与CMD1,使SD卡进⼊SPI 模式初始化时序图:初始化例程:1.//--------------------------------------------------------------------------2.初始化SD卡到SPI模式3.//--------------------------------------------------------------------------4.unsigned char SD_Init()5.{6.unsigned char retry,temp;7.unsigned char i;8.unsigned char CMD[] = {0x40,0x00,0x00,0x00,0x00,0x95};9. SD_Port_Init(); //初始化驱动端⼝10.11. Init_Flag=1; //将初始化标志置112.13.for (i=0;i<0x0f;i++)14. {15. Write_Byte_SD(0xff); //发送⾄少74个时钟信号16. }17.18.//向SD卡发送CMD019. retry=0;20.do21. { //为了能够成功写⼊CMD0,在这⾥写200次22. temp=Write_Command_SD(CMD);23. retry++;24.if(retry==200)25. { //超过200次26.return(INIT_CMD0_ERROR);//CMD0 Error!27. }28. }29.while(temp!=1); //回应01h,停⽌写⼊30.31.//发送CMD1到SD卡32. CMD[0] = 0x41; //CMD133. CMD[5] = 0xFF;34. retry=0;35.do36. { //为了能成功写⼊CMD1,写100次37. temp=Write_Command_SD(CMD);38. retry++;39.if(retry==100)40. { //超过100次41.return(INIT_CMD1_ERROR);//CMD1 Error!4.unsigned char Read_CSD_SD(unsigned char *Buffer)5.{6.//读取CSD寄存器的命令7.unsigned char CMD[] = {0x49,0x00,0x00,0x00,0x00,0xFF};8.unsigned char temp;9. temp=SD_Read_Block(CMD,Buffer,16); //read 16 bytes10.return(temp);11.}4)读取SD卡信息综合上⾯对CID与CSD寄存器的读取,可以知道很多关于SD卡的信息,以下程序可以获取这些信息。
(最新整理)Arduino参考手册中文版

(完整)Arduino参考手册中文版编辑整理:尊敬的读者朋友们:这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望((完整)Arduino参考手册中文版)的内容能够给您的工作和学习带来便利。
同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。
本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为(完整)Arduino参考手册中文版的全部内容。
Arduino编程参考手册程序结构 (7)控制语句 (8)if (8)if。
..else (9)for (10)switch case (12)while (14)do。
while (14)break (15)continue (15)return (16)goto (17)相关语法 (18)分号 (18)大括号 (18)注释 (20)define (21)include (22)算术运算符 (23)赋值 (23)加,减,乘,除 (23)取模 (24)if(条件) and ==, !=, <,〉(比较运算符) (26)布尔运算符 (27)指针运算符 (29)位运算 (29)位与 (29)位或 (30)位异或 (32)位非 (33)左移、右移 (34)复合运算符 (36)自加++ (36)自减—— (36)复合加+= (37)复合减—= (37)复合乘*= (37)复合除/= (37)复合与&= (37)复合或|= (37)变量 (37)常量 (37)宏定义 (38)整型常量 (39)浮点数常量 (41)void (42)boolean (42)char (43)unsigned char (44)byte (44)int (44)unsigned int (46)word (46)long (47)unsigned long (47)float (48)double (49)string (49)String(c++) (51)array (52)数据类型转换 (54)char() (54)byte() (54)int() (54)word() (55)long() (55)float() (56)变量作用域&修饰符 (56)变量作用域 (56)static (静态变量) (57)volatile (易变变量) (59)const (不可改变变量) (60)辅助工具 (61)sizeof()(sizeof运算符) (61)ASCII码表 (62)基本函数 (63)数字I/O (64)pinMode() (64)digitalWrite() (65)digitalRead() (66)模拟I/O (67)analogReference() (67)analogRead() (67)analogWrite() (68)高级I/O (69)shiftOut() (69)pulseIn() (70)时间 (71)millis() (71)delay(ms) (72)delayMicroseconds(us) (73)数学库 (73)max() (74)abs() (74)constrain() (74)map() (75)pow() (76)sqrt() (76)三角函数 (76)sin(),cos(),tan() (76)随机数 (77)randomSeed() (77)random() (77)位操作 (78)设置中断函数 (79)a (79)achInterrupt() (79)detachInterrupt() (80)interrupts() (80)noInterrupts() (81)串口通讯 (82)begin() (82)available() (82)read() (84)flush() (85)println() (89)write() (89)peak() (90)serialEvent() (90)程序结构(本节直译自Arduino官网最新Reference)在Arduino中,标准的程序入口main函数在内部被定义, 用户只需要关心以下两个函数:setup()当Arduino板起动时setup()函数会被调用。
Arduino技术及应用--第21章SD卡的类库使用

21.2 SD卡类库成员函数
File 类
(3) flush( ) 功能:确保数据已经写入SD卡。当文件被关闭时,flush( )会自动运行。 语法:file. flush( ) 参数:file,—个File类型的对象。 返回值:无。
21.2 SD卡类库成员函数
File 类
(4) peek( ) 功能:读取当前所在字节,但并不移动到下一个字节。 语法:file. peek( ) 参数:file,一个File类型的对象。 返回值:下一个字节或者下一个字符。如果没有可读数据,则返回-1。
21.2 SD卡类库成员函数
SDClass 类
(3) open( ) 参数: filename,需要打开的文件名。其中可以包含路径,路径用“/”分隔。 mode(可选),打开文件的方式,默认使用只读方式打开。也可以使用以 下两种方式打开文件:
FILE_READ,只读方式打开文件; FILE_WRITE,写入方式打开文件。 返回值:返回被打开文件对应的对象;如果文件不能打开,则返回false。
21.3 使用SD卡读/写模块
1. Micro SD卡(TF卡)读/写模块 TF卡读/写模块(图21.2)是常用的Arduino外接存储模块。 该模块可连接到Arduino控制器或其他单片机的SPI接口上,通 过编写相应的程序即可实现各种传感器(如温湿度传感器、光 线传感器和GPS等)数据记录的功能,通过读卡器将TF卡数据 读出,便可轻松加以分析和利用。
21.1 格式化SD卡
SD 卡(Secure Digital Memory Card)是一种基于半导体快闪 记忆器的新一代存储设备,它被广泛应用于便携式装置上,例如 数码相机、手机和平板电脑等。
使用SD卡库可以让Arduino读/写SD卡中的数据。由于SD卡库 支持FAT16和FAT32文件系统的SD卡、SDHC卡和TF卡,因此需 要将SD卡以FAT16或者FAT32文件系统进行格式化。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
a r d u i n o学习笔记18---S D卡读写实验本次实验使用arduino驱动SD卡,在SD卡中进行文件读写。
需要说明的是arduino的SD库文件,目前对2G以上的卡支持不是很好,所以推荐大家使用2G包含2G以下的,文件格式使用FAT格式。
这次我是用的是kingmax2G的MicroSD卡。
先看一下硬件连接图把下面代码下载进arduino控制板/*此例子展示如果记录三个模拟引脚数值到SD卡,使用SD库。
电路部分* 模拟引脚使用模拟口0,1,2大家可以根据情况接入模拟传感器,如果没有,也可以完成此实验,只不过数值是不停跳动的干扰源。
* SD卡与arduino控制板使用SPI总线连接** MOSI - pin 11** MISO - pin 12** CLK - pin 13** CS - pin 4*/#include <SD.h>// CS引脚为pin4,这里也沿用官方默认设置const int chipSelect = 4; //设定CS接口void setup(){Serial.begin(9600); //设置串口通信波特率为9600Serial.print("Initializing SD card..."); //串口输出数据Initializing SD card...pinMode(10, OUTPUT);if (!SD.begin(chipSelect)) { //如果从CS口与SD卡通信失败,串口输出信息Card failed, or not presentSerial.println("Card failed, or not present");return;}Serial.println("card initialized."); //与SD卡通信成功,串口输出信息card initialized.}void loop(){// 定义数组String dataString = "";// 读取三个传感器值,写入数组for (int analogPin = 0; analogPin < 3; analogPin++) {int sensor = analogRead(analogPin);dataString += String(sensor);if (analogPin < 2) {dataString += ",";}}// 打开文件,注意在同一时间只能有一个文件被打开// 如果你要打开另一个文件,就需要先关闭前一个File dataFile = SD.open("datalog.txt", FILE_WRITE);// 打开datalog.txt文件,读写状态,位置在文件末尾。
if (dataFile) {dataFile.println(dataString);dataFile.close();// 数组dataString输出到串口Serial.println(dataString);}// 如果无法打开文件,串口输出错误信息error opening datalog.txtelse {Serial.println("error opening datalog.txt");}}复制代码下载完成后,打开串口监视器。
控制板开始工作后会看到如下画面,图中每一行上就是每次记录的三个传感器数值,本次实验并没有接传感器,所以数值是周围干扰源的杂乱信号。
关闭arduino电源后把SD卡取出,接入电脑后,可以看到SD卡中有一个DATALOG.TXT文件,打开后有可以看到,此文件中的信息就是记录下的各个传感器的数值。
第一个代码实验完以后,SD卡中的DATALOG.TXT不要删除,把下面代码下载进arduino中,打开串口监视器,看看效果。
/*这个例子展示如何通过SD库从SD卡中读取一个文件,并且把数据通过串口发送。
* SD卡与arduino控制板使用SPI总线连接** MOSI - pin 11** MISO - pin 12** CLK - pin 13** CS - pin 4*/#include <SD.h>// CS引脚为pin4,这里也沿用官方默认设置const int chipSelect = 4; //设定CS接口void setup(){Serial.begin(9600); //设置串口通信波特率为9600Serial.print("Initializing SD card..."); //串口输出数据Initializing SD card...pinMode(10, OUTPUT);if (!SD.begin(chipSelect)) { //如果从CS口与SD卡通信失败,串口输出信息Card failed, or not presentSerial.println("Card failed, or not present");// don't do anything more:return;}Serial.println("card initialized."); //与SD卡通信成功,串口输出信息card initialized.File dataFile = SD.open("datalog.txt"); //打开datalog.txt文件if (dataFile) {while (dataFile.available()) { //检查是否dataFile是否有数据Serial.write(dataFile.read()); //如果有数据则把数据发送到串口}dataFile.close(); //关闭dataFile}else {Serial.println("error opening datalog.txt"); //如果文件无法打开串口发送信息error opening datalog.txt}}void loop(){}复制代码可以看到,DATALOG.TXT文件中的数据都通过串口发送回了电脑。
效果如下图:再把下面的代码下载进arduino控制板中,打开串口监控器看看效果。
此例子展示如何在SD卡中创建于删除文件* SD卡与arduino控制板使用SPI总线连接** MOSI - pin 11** MISO - pin 12** CLK - pin 13** CS - pin 4*/#include <SD.h>File myFile;void setup(){Serial.begin(9600); //设置串口通信波特率为9600Serial.print("Initializing SD card..."); //串口输出数据Initializing SD card...pinMode(10, OUTPUT);if (!SD.begin(4)) { //如果从CS口与SD卡通信失败,串口输出信息initialization failed!Serial.println("initialization failed!");return;}Serial.println("initialization done."); //CS口与SD卡通信成功,串口输出信息initialization done.if (SD.exists("example.txt")) { //检查example.txt文件是否存在Serial.println("example.txt exists."); //如果存在输出信息example.txt exists.至串口else {Serial.println("example.txt doesn't exist."); //不存在输出信息example.txt doesn't exist.至串口}Serial.println("Creating example.txt...");myFile = SD.open("example.txt", FILE_WRITE); //打开example.txt,如果没有自动创建,写入状态myFile.close(); //关闭文件if (SD.exists("example.txt")) {Serial.println("example.txt exists.");}else {Serial.println("example.txt doesn't exist.");}Serial.println("Removing example.txt...");SD.remove("example.txt"); //删除文件example.txtif (SD.exists("example.txt")){Serial.println("example.txt exists.");}else {Serial.println("example.txt doesn't exist.");}}void loop(){复制代码下面图就是串口监视器显示的结果,显示文件创建于删除的过程。
再把下面的代码传入arduino控制板,看看效果#include <SD.h>File myFile;void setup(){Serial.begin(9600);Serial.print("Initializing SD card...");pinMode(10, OUTPUT);if (!SD.begin(4)) {Serial.println("initialization failed!"); return;}Serial.println("initialization done.");myFile = SD.open("test.txt", FILE_WRITE);if (myFile) {Serial.print("Writing to test.txt..."); myFile.println("testing 1, 2, 3.");myFile.close();Serial.println("done.");} else {Serial.println("error opening test.txt"); }myFile = SD.open("test.txt");if (myFile) {Serial.println("test.txt:");while (myFile.available()) {Serial.write(myFile.read());}myFile.close();} else {Serial.println("error opening test.txt"); }}void loop(){}复制代码串口监视器中可以看到如下画面把SD卡接入电脑,可以在里面找到TEST.TXT文件,里面的内容如下。