1. 請問如何用51單片機做U盤,
根本不要那麼費勁,有現成的USB介面晶元,用51控制通信就可以。
2. 如何用51單片機讀取u盤
51單片機沒有這個功能
3. 如何用51單片機通過模擬SPI匯流排協議讀寫U盤或者其他的協議也可以,只要能後操作U盤
/*-----------------------------------------------
------------------------------------------------*/
#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
#include<9325TP.h>
//=============================================================
//定義SD卡需要的4根信號線
sbit SD_CLK = P1^1;
sbit SD_DI = P1^2;
sbit SD_DO = P1^0;
sbit SD_CS = P1^3;
//===========================================================
//定義按鍵埠
sbit KEY = P3^2;
//===========================================================
//定義512位元組緩沖區,注意需要使用 xdata關鍵字
unsigned char xdata DATA[75]={0};
unsigned char xdata DATA1[75]={0};
//===========================================================
//寫一位元組到SD卡,模擬SPI匯流排方式
void SdWrite(unsigned char n)
{
unsigned char i;
for(i=8;i;i--)
{
SD_CLK=0;
SD_DI=(n&0x80);
n<<=1;
SD_CLK=1;
}
SD_DI=1;
}
//===========================================================
//從SD卡讀一位元組,模擬SPI匯流排方式
unsigned char SdRead()
{
unsigned char n,i;
for(i=8;i;i--)
{
SD_CLK=0;
SD_CLK=1;
n<<=1;
if(SD_DO) n|=1;
}
return n;
}
//============================================================
//檢測SD卡的響應
unsigned char SdResponse()
{
unsigned char i=0,response;
while(i<=8)
{
response = SdRead();
if(response==0x00)
break;
if(response==0x01)
break;
i++;
}
return response;
}
//================================================================
//發命令到SD卡
void SdCommand(unsigned char command, unsigned long argument, unsigned char CRC)
{
SdWrite(command|0x40);
SdWrite(((unsigned char *)&argument)[0]);
SdWrite(((unsigned char *)&argument)[1]);
SdWrite(((unsigned char *)&argument)[2]);
SdWrite(((unsigned char *)&argument)[3]);
SdWrite(CRC);
}
//================================================================
//初始化SD卡
unsigned char SdInit(void)
{
int delay=0, trials=0;
unsigned char i;
unsigned char response=0x01;
SD_CS=1;
for(i=0;i<=9;i++)
SdWrite(0xff);
SD_CS=0;
//Send Command 0 to put MMC in SPI mode
SdCommand(0x00,0,0x95);
response=SdResponse();
if(response!=0x01)
{
return 0;
}
while(response==0x01)
{
SD_CS=1;
SdWrite(0xff);
SD_CS=0;
SdCommand(0x01,0x00ffc000,0xff);
response=SdResponse();
}
SD_CS=1;
SdWrite(0xff);
return 1;
}
//================================================================
//往SD卡指定地址寫數據,一次最多512位元組
unsigned char SdWriteBlock(unsigned char *Block, unsigned long address,int len)
{
unsigned int count;
unsigned char dataResp;
//Block size is 512 bytes exactly
//First Lower SS
SD_CS=0;
//Then send write command
SdCommand(0x18,address,0xff);
if(SdResponse()==00)
{
SdWrite(0xff);
SdWrite(0xff);
SdWrite(0xff);
//command was a success - now send data
//start with DATA TOKEN = 0xFE
SdWrite(0xfe);
//now send data
for(count=0;count<len;count++) SdWrite(*Block++);
for(;count<512;count++) SdWrite(0);
//data block sent - now send checksum
SdWrite(0xff); //兩位元組CRC校驗, 為0XFFFF 表示不考慮CRC
SdWrite(0xff);
//Now read in the DATA RESPONSE token
dataResp=SdRead();
//Following the DATA RESPONSE token
//are a number of BUSY bytes
//a zero byte indicates the MMC is busy
while(SdRead()==0);
dataResp=dataResp&0x0f; //mask the high byte of the DATA RESPONSE token
SD_CS=1;
SdWrite(0xff);
if(dataResp==0x0b)
{
//printf("DATA WAS NOT ACCEPTED BY CARD -- CRC ERROR\n");
return 0;
}
if(dataResp==0x05)
return 1;
//printf("Invalid data Response token.\n");
return 0;
}
//printf("Command 0x18 (Write) was not received by the MMC.\n");
return 0;
}
//=======================================================================
//從SD卡指定地址讀取數據,一次最多512位元組
unsigned char SdReadBlock(unsigned char *Block, unsigned long address,int len)
{
unsigned int count;
//Block size is 512 bytes exactly
//First Lower SS
//printf("MMC_read_block\n");
SD_CS=0;
//Then send write command
SdCommand(0x11,address,0xff);
if(SdResponse()==00)
{
//command was a success - now send data
//start with DATA TOKEN = 0xFE
while(SdRead()!=0xfe);
for(count=0;count<len;count++) *Block++=SdRead();
for(;count<512;count++) SdRead();
//data block sent - now send checksum
SdRead();
SdRead();
//Now read in the DATA RESPONSE token
SD_CS=1;
SdRead();
return 1;
}
//printf("Command 0x11 (Read) was not received by the MMC.\n");
return 0;
}
/********************************************************************
* 名稱 : Com_Init()
* 功能 : 初始化串口程序,晶振11.0592, 波特率9600
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void Com_Init(void)
{
TMOD = 0x20;
PCON = 0x00;
SCON = 0x50;
TH1 = 0xFd;
TL1 = 0xFd;
TR1 = 1;
}
//============================================================
//主程序
main()
{
unsigned long AddTemp=262144;//SD卡地址第一個數據物理地址初始值,可以用winhex查看,這里是512扇區,512x512=262144,根據實際SD卡內容更改
unsigned char i;
unsigned char *p;
CS=1;
delayms(5);
RES=0;
delayms(5);
RES=1;
delayms(5);
SdInit(); //SD卡初始化
Com_Init();
for(i=0;i<75;i++)
{
DATA1[i]=i;
}
SdWriteBlock(DATA1, AddTemp, 75);
SdReadBlock(DATA, AddTemp, 75);
p= DATA;
while(1)
for(i=0;i<75;i++)
{
SBUF = *p+48;
while(!TI) //如果發送完畢,硬體會置位TI
{
_nop_();
}
p++;
TI = 0; //TI清零
delayms(500);
}
}
《9325TP.h》
/*-----------------------------------------------
名稱:寫彩屏
公司:上海浩豚電子科技有限公司
網站:www.doflye.net
編寫:師訪
日期:2009.12
修改:無
內容:320x240像素、16位BMP圖片的HEX數據,依次寫到屏上,還原圖片
注意事項:
------------------------------------------------*/
#include"reg52.h"
//============================================================
//根據晶元資料定義
#define WINDOW_XADDR_START 0x0050 // Horizontal Start Address Set
#define WINDOW_XADDR_END 0x0051 // Horizontal End Address Set
#define WINDOW_YADDR_START 0x0052 // Vertical Start Address Set
#define WINDOW_YADDR_END 0x0053 // Vertical End Address Set
#define GRAM_XADDR 0x0020 // GRAM Horizontal Address Set
#define GRAM_YADDR 0x0021 // GRAM Vertical Address Set
#define GRAMWR 0x0022 // memory write
//=============================================================
//定義液晶屏介面
sbit CS=P2^2; //片選
sbit RES=P2^1; //復位
sbit RS=P2^4; //數據/命令選擇
sbit RW=P2^5;
//數據口使用P0
//====================================================//
//函數聲明
void ILI9325_Initial(void);
void Write_Cmd_Data(unsigned char x, unsigned int y);
void Write_Cmd(unsigned char DH,unsigned char DL);
void Write_Data(unsigned char DH,unsigned char DL);
void delayms(unsigned int tt);
void Write_Data_U16(unsigned int y);
static void LCD_SetPos(unsigned int x0,unsigned int x1,unsigned int y0,unsigned int y1);
void ClearScreen(unsigned int bColor);
//===============================================================
//清屏
void ClearScreen(unsigned int bColor)
{
unsigned int i,j;
LCD_SetPos(0,240,0,320);//320x240
for (i=0;i<320;i++)
{
for (j=0;j<240;j++)
Write_Data_U16(bColor);
}
}
//===============================================================
//寫命令數據
void Write_Cmd_Data (unsigned char x,unsigned int y)
{
unsigned char m,n;
m=y>>8;
n=y;
Write_Cmd(0x00,x);
Write_Data(m,n);
}
//==============================================================
//寫16位數據
void Write_Data_U16(unsigned int y)
{
unsigned char m,n;
m=y>>8;
n=y;
Write_Data(m,n);
}
//=============================================================
//寫命令
void Write_Cmd(unsigned char DH,unsigned char DL)
{
CS=0;
RS=0;
P0=DH;
RW=0;
RW=1;
P0=DL;
RW=0;
RW=1;
CS=1;
}
//===================================================================
//寫數據
void Write_Data(unsigned char DH,unsigned char DL)
{
CS=0;
RS=1;
P0=DH;
RW=0;
RW=1;
P0=DL;
RW=0;
RW=1;
CS=1;
}
//============================================================
//延時程序
void delayms(unsigned int count)
{
int i,j;
for(i=0;i<count;i++)
{
for(j=0;j<260;j++);
}
}
//=============================================================
//液晶初始化
void ILI9325_Initial(void)
{
delayms(50); //根據不同晶振速度可以調整延時,保障穩定顯示
Write_Cmd_Data(0x0001,0x0100);
Write_Cmd_Data(0x0002,0x0700);
Write_Cmd_Data(0x0003,0x1030);
Write_Cmd_Data(0x0004,0x0000);
Write_Cmd_Data(0x0008,0x0207);
Write_Cmd_Data(0x0009,0x0000);
Write_Cmd_Data(0x000A,0x0000);
Write_Cmd_Data(0x000C,0x0000);
Write_Cmd_Data(0x000D,0x0000);
Write_Cmd_Data(0x000F,0x0000);
//power on sequence VGHVGL
Write_Cmd_Data(0x0010,0x0000);
Write_Cmd_Data(0x0011,0x0007);
Write_Cmd_Data(0x0012,0x0000);
Write_Cmd_Data(0x0013,0x0000);
//vgh
Write_Cmd_Data(0x0010,0x1290);
Write_Cmd_Data(0x0011,0x0227);
//delayms(100);
//vregiout
Write_Cmd_Data(0x0012,0x001d); //0x001b
//delayms(100);
//vom amplitude
Write_Cmd_Data(0x0013,0x1500);
//delayms(100);
//vom H
Write_Cmd_Data(0x0029,0x0018);
Write_Cmd_Data(0x002B,0x000D);
//gamma
Write_Cmd_Data(0x0030,0x0004);
Write_Cmd_Data(0x0031,0x0307);
Write_Cmd_Data(0x0032,0x0002);// 0006
Write_Cmd_Data(0x0035,0x0206);
Write_Cmd_Data(0x0036,0x0408);
Write_Cmd_Data(0x0037,0x0507);
Write_Cmd_Data(0x0038,0x0204);//0200
Write_Cmd_Data(0x0039,0x0707);
Write_Cmd_Data(0x003C,0x0405);// 0504
Write_Cmd_Data(0x003D,0x0F02);
//ram
Write_Cmd_Data(0x0050,0x0000);
Write_Cmd_Data(0x0051,0x00EF);
Write_Cmd_Data(0x0052,0x0000);
Write_Cmd_Data(0x0053,0x013F);
Write_Cmd_Data(0x0060,0xA700);
Write_Cmd_Data(0x0061,0x0001);
Write_Cmd_Data(0x006A,0x0000);
//
Write_Cmd_Data(0x0080,0x0000);
Write_Cmd_Data(0x0081,0x0000);
Write_Cmd_Data(0x0082,0x0000);
Write_Cmd_Data(0x0083,0x0000);
Write_Cmd_Data(0x0084,0x0000);
Write_Cmd_Data(0x0085,0x0000);
//
Write_Cmd_Data(0x0090,0x0010);
Write_Cmd_Data(0x0092,0x0600);
Write_Cmd_Data(0x0093,0x0003);
Write_Cmd_Data(0x0095,0x0110);
Write_Cmd_Data(0x0097,0x0000);
Write_Cmd_Data(0x0098,0x0000);
Write_Cmd_Data(0x0007,0x0133);
// Write_Cmd_Data(0x0022);//
}
//===============================================================
//定義坐標
static void LCD_SetPos(unsigned int x0,unsigned int x1,unsigned int y0,unsigned int y1)
{
Write_Cmd_Data(WINDOW_XADDR_START,x0);
Write_Cmd_Data(WINDOW_XADDR_END,x1);
Write_Cmd_Data(WINDOW_YADDR_START,y0);
Write_Cmd_Data(WINDOW_YADDR_END,y1);
Write_Cmd_Data(GRAM_XADDR,x0);
Write_Cmd_Data(GRAM_YADDR,y0);
Write_Cmd (0x00,0x22);//LCD_WriteCMD(GRAMWR);
}
4. 我想用51單片機播放u盤里的音樂,但不知道涉及哪些知識。是不是虛要了解usb的通信協議呢還有文件格式
要懂單片機的使用,USB協議,U盤的文件結構,
FAT16和FAT32為磁碟文件系統的格式。
5. 求助51單片機+CH375B讀寫U盤測試程序的問題
CH375是一個國產USB轉接晶元,集成了U盤操作固件,可以直接把U盤當做一個一個的扇區來讀寫,加上一個文件系統,你就可以在U盤上拷貝,粘貼,新建等Windos下具備的文件操作功能了。
另外其還支持從機模式,可以讓單片機或DSP通過它連接到電腦上實現一個自製的USB滑鼠/鍵盤或U盤等。其兼容USB2.0協議,最大傳輸速度為USB1.1的12Mbps。對於一般的嵌入式應用來說,速度已經能滿足需求。
更可貴的是,這時一片民族晶元,意味著你面對將是中文PDF和一個完善的網路技術支持氛圍。使用CH375將讓你學習USB協議不再枯燥,不再是紙上談兵。下面具體闡述一下這兩天自己恢復調試該晶元的「艱辛」,其實該晶元並不脆弱,我焊了又拆,拆了又焊上,還是可以用。主要是製造這個晶元南京那家公司技術支持資料太豐富了,太詳細了,以至於讓我在做電路時也是小心翼翼,最後反而吃了大虧。
一、CH375分為A和B兩個系列,A系列支持5V供電,B系列不僅支持5V還支持3.3V。
二、B系列中,如果使用5V供電,則V3引腳通過0.01uF電容接地,如果是3.3V,則V3接3.3V,這點很重要;
三、CH375資料上說對於電源VCC引腳端應該接0.01uF的電容到地,該電容功能為退耦電容,同時,晶振必須為12MHZ,晶振引腳和電容引腳盡量*近CH375的Xi和Xo引腳。如果硬體連接正確,上電時,在Xo端應該可以檢測到12MHZ的波形,在沒有示波器的情況下,可以用萬用表檢測Xi和Xo引腳是否為電源電壓的一半,即如果是5V供電,此時兩個引腳的電壓應該接近2.5V,我在自己製作的腐蝕板中變遇到了晶振無法起振的情況,開始懷疑是引腳離得有點遠,於是改變了電容的放置位置,使之更*近ch375兩個引腳,也沒有起振。然後懷疑是CH375壞了,前後一共換了3片還是沒有起振,最後在反復檢測電路後,換了一顆晶振,我把所有的懷疑都用完後,最後目光聚焦在了兩個0603封裝的22P電容上,當然開始我還不是懷疑電容有問題,而是ch375應用資料上給的電容是15p的,但手上又沒有這個容值的電容,電容都焊下來了,因為太小,掉哪去也不知道,於是重新換了兩個22p的,結果卻「奇跡般」的起振了。
難道困擾了我兩天的竟然是兩顆壞了的晶振電容?因為那兩個小東西也不知道躲哪去了,我不能再揪出來拷問,那就認為是人品問題吧,遇到了兩個壞了電容,或者是自己焊接的時候不小心焊壞了,罪過。。。後來我還原了電路,一層一層驗證,取下了VCC的退耦電容,可以工作;再把兩個電容移回原來離CH375較遠的位置,還是可以起振。僅以此調試經驗警醒自己,我懷疑的邏輯,相信大多數人也是這樣,越大的,越復雜的,越脆弱,呵呵,這種邏輯有問題么?調試是一個痛苦的過程,調試又是一個快樂的過程,恭喜你,嵌入式工程師,嘗盡人間苦樂!
四、當上電後CH375能起振了,這時還可以測一下25和26腳的電平,26為高,25為低,說明硬體復位時成功的,否則你就要看下RST連接的一個到VCC的0.47uF電容那是否有問題了。另外就是,在晶振沒有起振的情況下,往CH375寫數據,那個指示燈會不停的閃,寫一此,閃一次,這是不正常德。
五、當硬體能起振了,復位也完成了,請將8位數據口接到你的微控制器(單片機或DSP等),然後你還要接A0,WR,RD,INT,最後保證在軟體操作晶元的時候CS為低。如此,通過往CH375寫命令CMD_CHECK_EXIST(0x06),接著寫一個任意8位數據,稍微延時幾個毫秒,CH375會返回你一個數據,這個數據是你寫的數據的取反,如果你收到了這樣一個取反的數據,恭喜你,你的硬體和底層軟體讀寫操作成功了,接下了便可以開始自己的USB協議解析之旅。如果你收到的數據不是正確的取反數據,那麼請仔細檢查在沒有任何線連接的情況下,晶振是否起振,復位是否成功,如果晶振已經起振,你已經成功了一大半,至於讀寫的時序,網上到處都是,51的,AVR的,找一個可以用的,稍作移植便可以使用。底層操作成功,是後續分析和學習USB協議的關鍵。
6. 51單片機的優缺點
一、51單片機
應用最廣泛的8位單片機當然也是初學者們最容易上手學習的單片機,最早由Intel推出,由於其典型的結構和完善的匯流排專用寄存器的集中管理,眾多的邏輯位操作功能及面向控制的豐富的指令系統,堪稱為一代「經典」,為以後的其它單片機的發展奠定了基礎。
51單片機之所以成為經典,成為易上手的單片機主要有以下特點:
特性
1、從內部的硬體到軟體有一套完整的按位操作系統,稱作位處理器,處理對象不是字或位元組而是位。不但能對片內某些特殊功能寄存器的某位進行處理,如傳送、置位、清零、測試等,還能進行位的邏輯運算,其功能十分完備,使用起來得心應手。
2、同時在片內RAM區間還特別開辟了一個雙重功能的地址區間,使用極為靈活,這一功能無疑給使用者提供了極大的方便。
3、乘法和除法指令,這給編程也帶來了便利。很多的八位單片機都不具備乘**能,作乘法時還得編上一段子程序調用,十分不便。
缺點
(雖然是經典但是缺點還是很明顯的)
1、AD、EEPROM等功能需要靠擴展,增加了硬體和軟體負擔
2、雖然I/O腳使用簡單,但高電平時無輸出能力,這也是51系列單片機的最大軟肋
3、運行速度過慢,特別是雙數據指針,如能改進能給編程帶來很大的便利
4、51單片機保護能力很差,很容易燒壞晶元
應用范圍:目前在教學場合和對性能要求不高的場合大量被採用。
使用最多的器件:8051、80C51
7. 單片機和sd卡或U盤通信的問題
SD卡是SPI匯流排的,所以單片機讀取SD卡的內容,需要通過SPI匯流排介面去驅動,網上已有很多例子可參考,如果你單片機內置SPI控制器,那就直接用該控制器去訪問SD卡即可,要是沒有,則需要模擬SPI匯流排的時序,去控制SD卡。
上面所提到的所謂控制,其實是讀寫SD卡內部的寄存器,包括控制的,狀態的,還有存放數據的等等。
而U盤是在完成任意讀寫SD卡的基礎上,再學習USB通信協議中的海量存儲類而實現的,對於初學者來說,難度較大,如果你只是兩選一,那你選擇做SD卡的吧,不過此種單純的SD卡讀寫,是不帶文件系統的,其上面的數據無法為windows等操作系統所識別。
可以用AT89C51或52或者AT89S51/52等51系列的單片機,模擬時序去控制SD卡,因為普通的51單片機沒有內置SPI匯流排控制器。
8. 51單片機用SL811讀寫u盤
您可以看看西安達泰電子的USB118AD提供TTL串口和SPI口。可以對U盤進行讀寫操作。
9. 51單片機讀寫U盤
您可以看看西安達泰電子的USB118AD 提供TTL串口和SPI口。可以對U盤進行讀寫操作。
10. 如何用51單片機和U盤直接讀寫文件
推薦用PB375A,單晶元的,我用在數據採集上。根本就沒去了解過USB HOST底層協議和文件系統這些東西,這顆晶元裡面都集成了。只需要單片機通過spi或者uart來發命令創建讀寫U盤中的文件就可以了。而且價格相當便宜!