電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>電子資料>在Proteus中模擬SD卡模塊

在Proteus中模擬SD卡模塊

2022-11-08 | zip | 0.20 MB | 次下載 | 2積分

資料介紹

描述

在本主題中,我們將討論如何開(kāi)始使用 ArduinoSD 卡(microSD 卡)的簡(jiǎn)單 proteus 模擬。

我將在本主題的后面部分解釋如何閱讀有關(guān) SD 卡的信息,以使您熟悉該概念。在本例中,我們將學(xué)習(xí)如何使用winimage軟件創(chuàng)建映像文件,并使用winimageSD 庫(kù)選擇某些參數(shù),如卷類型、可用空間和其他信息,并通過(guò)串行端口發(fā)送。然后我們將模仿 proteus 中的示例,以達(dá)到類似于實(shí)際實(shí)驗(yàn)的最佳所需結(jié)果。

Arduino 的 SD 卡庫(kù)非常出色,它使與 SD 卡的交互非常簡(jiǎn)單。使用 Arduino SD 庫(kù)可以讀取和寫(xiě)入 SD 卡。它基于 William Greiman 的 sdfatlib。在普通 SD 和 SDHC 卡上,該庫(kù)支持 FAT16 和 FAT32 文件系統(tǒng)。對(duì)于文件名,它使用 8.3 短名稱。

SPI 用于在微控制器和 SD 卡之間進(jìn)行通信,它位于數(shù)字引腳 11、12 和 13(在大多數(shù) Arduino 板上)或 50、51 和 52(在某些 Arduino 板上)(Arduino Mega)。還需要第二個(gè)引腳來(lái)選擇 SD 卡。可以使用硬件 SS 引腳(大多數(shù) Arduino 板上的引腳 10 或 Mega 上的引腳 53)或 SD.begin() 調(diào)用中指定的另一個(gè)引腳。

所需組件

硬件

  • Arduino板
  • 具有 FAT16 或 FAT32 文件系統(tǒng)的 SD 卡
  • LM35
  • 虛擬終端(作為串行監(jiān)視器)
  • PCF8574 I2C液晶接口模塊
  • LM016L (LCD) 顯示器
  • R1 & R2 = 10k 歐姆

軟件

  • 變形蟲(chóng)
  • Arduino IDE
  • Winimage

1.先決條件練習(xí)

在我們開(kāi)始進(jìn)行實(shí)際零件仿真之前,我們將通過(guò)簡(jiǎn)單的下載、安裝和設(shè)置 Arduino IDE 和 Proteus 庫(kù)的練習(xí)來(lái)熱身。

一世。安裝 Winimage

我們的第一步是從 Internet 下載 winimage 并將下載路徑設(shè)置為便于以后訪問(wèn)。根據(jù)系統(tǒng)要求,從官網(wǎng)選擇相應(yīng)的 latest.exe 文件。

poYBAGNon32ASPl_AAQfWB94l4E871.png
?

?

一世。在 IDE 中添加 SD 卡庫(kù)

現(xiàn)在我們將從 IDE 下載 SD 庫(kù)。請(qǐng)按照下圖所示的步驟了解有關(guān)如何下載適用于 Arduino IDE 的 SD 庫(kù)的更多信息。我們將使用這個(gè)庫(kù)來(lái)為 Arduino 編程 SD 卡模塊以存儲(chǔ)和檢索數(shù)據(jù)。

第 1 步:打開(kāi) Arduino IDE

poYBAGNon4CAXqmbAADSUJ_owNU450.png
?

?

第 2 步:轉(zhuǎn)到“草圖”>>“包含庫(kù)”>>“管理庫(kù)”

pYYBAGNon4OAWIXfAAFdmFWjzJA966.png
?

?

第 3 步:在搜索欄中搜索“SD”并從那里“安裝”

poYBAGNon4iAZCFCAAHo11lVQwY115.png
?

?

ii. 創(chuàng)建 Winimage 映像文件

下一步是使用 winimge.exe 軟件創(chuàng)建圖像文件。在這里,我們將從下載的文件夾中打開(kāi)它,并將創(chuàng)建 2 MB 大小的文件。該文件將用于將 SD 卡模塊中的數(shù)據(jù)存儲(chǔ)為 .txt 格式。

使用 WinImage,您可以在硬盤(pán)驅(qū)動(dòng)器或其他媒體上重新創(chuàng)建磁盤(pán)映像、查看其內(nèi)容、提取基于映像的文件、添加新文件和目錄、更改格式以及對(duì)映像進(jìn)行碎片整理。

按照下面的圖像來(lái)了解我們?nèi)绾蝿?chuàng)建圖像文件。

保持 FAT 12/16 和其他參數(shù)不受影響,除了圖像大小。

對(duì)于這個(gè)例子,我們將使用 2 MB 的圖像文件,因此創(chuàng)建了相同的圖像,如下圖所示。我們?yōu)閳D像文件命名為“Venuuu.IMG”

注意:保存文件時(shí)不要更改任何擴(kuò)展名 (*.IMG)。

第一步:打開(kāi)“winimage.exe”文件

poYBAGNon4uAGjP3AAFxQm8_vo0074.png
?

?

第 2 步:?jiǎn)螕簟按_定”并繼續(xù)

poYBAGNon46ASdWpAAHDDrrIrUI948.png
?

?

第 3 步:轉(zhuǎn)到左上角的“文件”

poYBAGNon5GAI9BIAAF-bPAl7ro321.png
?

?

第四步:點(diǎn)擊“新建”

poYBAGNon5eACBqOAAHXGtlaODI744.png
?

?

第 5 步:點(diǎn)擊“選擇自定義圖像格式”

poYBAGNon5mAKd0YAAHEuMAIFjI559.png
?

?

第 6 步:從下拉列表中選擇“4 (2048)”

pYYBAGNon52AADW7AANs2zxYQRI850.png
?

?

第7步:保持一切原樣,然后單擊“確定”

poYBAGNon6CAaDgxAANna8gfgKI204.png
?

?

第8步:現(xiàn)在點(diǎn)擊“文件”保存文件

pYYBAGNon6WAH0CbAANmgerBoO0556.png
?

?

第 9 步:現(xiàn)在將文件“另存為”到目標(biāo)文件夾

poYBAGNon6qAV8oKAAMacKdl6kQ396.png
?

?

pYYBAGNon66AfytPAANvNls7bS4272.png
?

?

pYYBAGNon7KAYIlTAAN4CWSag0o534.png
?

?

1. 模擬與編碼

在成功設(shè)置了模擬所需的所有先決條件后,現(xiàn)在我們將深入研究在 proteus 中模擬 SD 卡模塊的實(shí)際部分。現(xiàn)在在 proteus 中打開(kāi)新文件,然后從軟件列表中拖放所需的組件(參考下圖),因?yàn)槲覀冊(cè)谏厦嫣岬搅怂薪M件的名稱。

在這里,我們使用 I2C (PCF8574) 將 LCD 連接到 Arduino,這允許使用較少數(shù)量的板上引腳。

在下一部分中,如下圖所示分配 SD 卡模塊中圖像文件的文件路徑,并選擇文件大小為 2 MB。

poYBAGNon7WAUfIzAATUDKyvYcg865.png
?

?

poYBAGNon7mAN_B5AAPYoiuo6e4404.png
?

在這個(gè)階段,我們將在 proteus 模擬中的 SD 卡模塊中設(shè)置卡映像文件路徑(下圖相同)。

注意:請(qǐng)選擇與您創(chuàng)建的圖像文件相同的媒體大小(MB)。您可以根據(jù)需要?jiǎng)?chuàng)建任何大小的圖像文件。

pYYBAGNon76AFy21AAM0CxacMSA332.png
?

?

pYYBAGNon8GACD2TAAMxnceHLQI600.png
?

?

pYYBAGNon8SAJczCAAMyRiVay00150.png
?

?

2. 檢查 SD 卡的狀態(tài)

現(xiàn)在我們?cè)?Arduino 中添加下面的草圖來(lái)了解 SD 卡模塊的狀態(tài)。

下面的草圖用于了解我們的 SD 卡是否正確連接到 Arduino。如果沒(méi)有找出原因并調(diào)試它。

上傳下面的草圖作為成功運(yùn)行模擬的主要步驟。如果一切順利,如下圖所示,那么您就在正確的軌道上獲得最終結(jié)果。

// Interfacing Arduino with SD card example (get SD card info)
// include the SD library:
#include 
#include 
// set up variables using the SD utility library functions:
Sd2Card card;
SdVolume volume;
SdFile root;
void setup() {
// Open serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
Serial.print("\nInitializing SD card...");
// we'll use the initialization code from the utility libraries
// since we're just testing if the card is working!
if (!card.init()) {
Serial.println("initialization failed. Things to check:");
Serial.println("* is a card inserted?");
Serial.println("* is your wiring correct?");
Serial.println("* did you change the chipSelect pin to match your shield or module?");
while (1);
} else {
Serial.println("Wiring is correct and a card is present.");
}
// print the type of card
Serial.println();
Serial.print("Card type:         ");
switch (card.type()) {
case SD_CARD_TYPE_SD1:
Serial.println("SD1");
break;
case SD_CARD_TYPE_SD2:
Serial.println("SD2");
break;
case SD_CARD_TYPE_SDHC:
Serial.println("SDHC");
break;
default:
Serial.println("Unknown");
}
// Now we will try to open the 'volume'/'partition' - it should be FAT16 or FAT32
if (!volume.init(card)) {
Serial.println("Could not find FAT16/FAT32 partition.\nMake sure you've formatted the card");
while (1);
}
Serial.print("Clusters:          ");
Serial.println(volume.clusterCount());
Serial.print("Blocks x Cluster:  ");
Serial.println(volume.blocksPerCluster());
Serial.print("Total Blocks:      ");
Serial.println(volume.blocksPerCluster() * volume.clusterCount());
Serial.println();
// print the type and size of the first FAT-type volume
uint32_t volumesize;
Serial.print("Volume type is:    FAT");
Serial.println(volume.fatType(), DEC);
volumesize = volume.blocksPerCluster();    // clusters are collections of blocks
volumesize *= volume.clusterCount();       // we'll have a lot of clusters
volumesize /= 2;                           // SD card blocks are always 512 bytes (2 blocks are 1KB)
Serial.print("Volume size (Kb):  ");
Serial.println(volumesize);
Serial.print("Volume size (Mb):  ");
volumesize /= 1024;
Serial.println(volumesize);
Serial.print("Volume size (Gb):  ");
Serial.println((float)volumesize / 1024.0);
Serial.println("\nFiles found on the card (name, date and size in bytes): ");
root.openRoot(volume);
// list all files in the card with date and size
root.ls(LS_R | LS_DATE | LS_SIZE);
}
void loop(void) {
}

?

3. 串行監(jiān)視器輸出

一旦我們?cè)?Arduino 中上傳程序,我們將在串行監(jiān)視器中看到以下任何狀態(tài)。

1.如果沒(méi)有卡或Arduino無(wú)法連接到它,串口監(jiān)視器將顯示以下消息:

poYBAGNon8aATj4rAACNKbG7jdc780.png
?

2.如果我們用 FAT16 文件系統(tǒng)放置一個(gè) 2 MB 的圖像文件,我得到的結(jié)果如下所示:

poYBAGNon8iAEeD1AABbWfCaK3M217.png
?

4. 編程、上傳和存儲(chǔ)

現(xiàn)在我們將生成代碼并將其上傳到 Arduino,以從 LM35 傳感器獲取溫度值。帶有日期和時(shí)間的溫度值使用 winimage 存儲(chǔ)在 .txt 文件中。我們?cè)谶@里使用 LCD 為用戶顯示溫度,而無(wú)需每次打開(kāi)圖像中的 .txt 文件。

將程序保存在所需位置并上傳。作為參考,請(qǐng)使用下面的代碼了解更多信息。

上傳后運(yùn)行模擬并等待一段時(shí)間在 SD 卡中存儲(chǔ) 10-20 個(gè)讀數(shù)。

pYYBAGNon82AEVomAADvHF2RNK0711.png
?

以下是要上傳到 Arduino 板的最終草圖。參考以下代碼并將其保存在目標(biāo)文件夾中。

pYYBAGNon9CAWNadAAG_D3CVwm0890.png
?

?

#include 
#include 
#include 
#include 
#include 
#define TIME_HEADER "T" // Header tag for serial time sync message
#define TIME_REQUEST 7 // ASCII bell character requests a time sync message
File myFile;
// initialize the library by associating any needed LCD interface pin
// with the arduino pin number it is connected to
//const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
//LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
LiquidCrystal_I2C lcd(0x20,16,2);
void digitalClockDisplay(){
// digital clock display of the time
lcd.print("Time ");
lcd.print(hour());
Serial.print(hour());
printDigits(minute());
printDigits(second());
lcd.setCursor(0, 1);
lcd.print("Date ");
lcd.print(day());
lcd.print("/");
lcd.print(month());
lcd.print("/");
lcd.print(year());
Serial.print(" ");
Serial.print(day());
Serial.print(" ");
Serial.print(month());
Serial.print(" ");
Serial.print(year());
Serial.println();
}
int printDigits(int digits){
// utility function for digital clock display: prints preceding colon and leading 0
lcd.print(":");
if(digits < 10)
lcd.print('0');
lcd.print(digits);
return digits;
}
void processSyncMessage() {
unsigned long pctime;
const unsigned long DEFAULT_TIME = 1357041600; // Jan 1 2013
if(Serial.find(TIME_HEADER)) {
pctime = Serial.parseInt();
if( pctime >= DEFAULT_TIME) { // check the integer is a valid time (greater than Jan 1 2013)
setTime(pctime); // Sync Arduino clock to the time received on the serial port
}
}
}
time_t requestSync()
{
Serial.write(TIME_REQUEST);
return 0; // the time will be sent later in response to serial mesg
}
void setup() {
lcd.init();
lcd.init();
lcd.backlight();
Serial.begin(9600);
// set up the LCD's number of columns and rows:
if (!SD.begin(10)) {
Serial.println("initialization failed!");
return;
}
else{
Serial.println("initialization Success!");
}
myFile = SD.open("group.txt", FILE_WRITE);
// if the file opened okay, write to it:
if (myFile) {
myFile.print("Date");
myFile.print(",");
myFile.print("Time");
myFile.print(",");
myFile.println("Temperature");
// close the file:
myFile.close();
}
else {
Serial.print("error");
}
while (!Serial) ; // Needed for Leonardo only
pinMode(13, OUTPUT);
setSyncProvider( requestSync); //set function to call when sync required
Serial.println("Waiting for sync message");
lcd.print("Loading.....");
lcd.clear();
}
void loop() {
if (Serial.available()) {
processSyncMessage();
}
if (timeStatus()!= timeNotSet) {
digitalClockDisplay();
}
if (timeStatus() == timeSet) {
digitalWrite(13, HIGH); // LED on if synced
} else {
digitalWrite(13, LOW); // LED off if needs refresh
}
int lm35_pin = A0;
float temperature = analogRead(lm35_pin);
temperature = (temperature*500)/1023;
File data_file = SD.open("group.txt", FILE_WRITE);
if (data_file) {
data_file.print(day());
data_file.print("/");
data_file.print(month());
data_file.print("/");
data_file.print(year());
data_file.print(",");
data_file.print(hour());
data_file.print(":");
// Serial.print(hour());
int p= printDigits(minute());
data_file.print(p);
data_file.print(":");
int m= printDigits(second());
data_file.print(m);
data_file.print(",");
data_file.println(temperature);
data_file.close();
}
else {
Serial.print("error");
}
delay(800);
lcd.setCursor(0, 0);
}

?

pYYBAGNon9OAXmtoAAQHOJjfArU524.png
?

?

pYYBAGNon9aASU5dAANC9n8E_tc456.png
?

?

5. 導(dǎo)出 SD 卡數(shù)據(jù)

正如我們?cè)谀M部分所做的那樣,現(xiàn)在讓我們看看數(shù)據(jù)是否存儲(chǔ)在圖像文件中。

讓我們打開(kāi)“Venuuu.IMG”文件來(lái)查看圖像文件中的內(nèi)容。

如下圖所示,我們可以看到在圖像文件中創(chuàng)建了名為“group.txt”的.txt文件。現(xiàn)在我們將通過(guò)雙擊它來(lái)導(dǎo)出文件。然后它會(huì)自動(dòng)打開(kāi)文件,我們可以看到里面存儲(chǔ)的溫度數(shù)據(jù)。

按照下圖重新創(chuàng)建實(shí)驗(yàn)。

poYBAGNon9qAH1yoAAGLFGlDjHg844.png
?

?

pYYBAGNon9yAaksqAAFRbvtRtWM465.png
?

?

poYBAGNon9-ATBPXAAFUJibUI6Y195.png
?

?

poYBAGNon-KAbJ1nAAFrZvJ0IDQ929.png
?

?

pYYBAGNon-aAYkhTAAJC_1cNaYI664.png
?

現(xiàn)在我們打開(kāi) excel 將文件轉(zhuǎn)換為 excel 格式,以便根據(jù)數(shù)據(jù)或任何其他我們想要的目的繪制圖形。

打開(kāi) .txt 文件并將分隔符設(shè)置為用逗號(hào)分隔以將數(shù)據(jù)分隔為列,然后根據(jù)需要繼續(xù)分析數(shù)據(jù)。

?

poYBAGNon-mARsvSAAIxiGqz0Hg537.png
?

?

pYYBAGNon-yAd_mZAAKOdt_R4eo299.png
?

?

pYYBAGNon_KALoQZAAJWPT3gODs528.png
?

?

poYBAGNon_SAPAT6AAJgDwPc4fo700.png
?

?

poYBAGNon_eAQevsAALw8ozF8Ls074.png
?

這都是關(guān)于使用 SD 卡模塊在 Proteus 中進(jìn)行的簡(jiǎn)單模擬。

感謝您閱讀本文,祝您有美好的一天!


下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評(píng)論

查看更多

下載排行

本周

  1. 1山景DSP芯片AP8248A2數(shù)據(jù)手冊(cè)
  2. 1.06 MB  |  532次下載  |  免費(fèi)
  3. 2RK3399完整板原理圖(支持平板,盒子VR)
  4. 3.28 MB  |  339次下載  |  免費(fèi)
  5. 3TC358743XBG評(píng)估板參考手冊(cè)
  6. 1.36 MB  |  330次下載  |  免費(fèi)
  7. 4DFM軟件使用教程
  8. 0.84 MB  |  295次下載  |  免費(fèi)
  9. 5元宇宙深度解析—未來(lái)的未來(lái)-風(fēng)口還是泡沫
  10. 6.40 MB  |  227次下載  |  免費(fèi)
  11. 6迪文DGUS開(kāi)發(fā)指南
  12. 31.67 MB  |  194次下載  |  免費(fèi)
  13. 7元宇宙底層硬件系列報(bào)告
  14. 13.42 MB  |  182次下載  |  免費(fèi)
  15. 8FP5207XR-G1中文應(yīng)用手冊(cè)
  16. 1.09 MB  |  178次下載  |  免費(fèi)

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費(fèi)
  3. 2555集成電路應(yīng)用800例(新編版)
  4. 0.00 MB  |  33566次下載  |  免費(fèi)
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費(fèi)
  7. 4開(kāi)關(guān)電源設(shè)計(jì)實(shí)例指南
  8. 未知  |  21549次下載  |  免費(fèi)
  9. 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書(shū))
  10. 0.00 MB  |  15349次下載  |  免費(fèi)
  11. 6數(shù)字電路基礎(chǔ)pdf(下載)
  12. 未知  |  13750次下載  |  免費(fèi)
  13. 7電子制作實(shí)例集錦 下載
  14. 未知  |  8113次下載  |  免費(fèi)
  15. 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德?tīng)栔?/a>
  16. 0.00 MB  |  6656次下載  |  免費(fèi)

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費(fèi)
  3. 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
  4. 78.1 MB  |  537798次下載  |  免費(fèi)
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420027次下載  |  免費(fèi)
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費(fèi)
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費(fèi)
  11. 6電路仿真軟件multisim 10.0免費(fèi)下載
  12. 340992  |  191187次下載  |  免費(fèi)
  13. 7十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
  14. 158M  |  183279次下載  |  免費(fèi)
  15. 8proe5.0野火版下載(中文版免費(fèi)下載)
  16. 未知  |  138040次下載  |  免費(fèi)