|
- #include <reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit p1_7=P1^7;
- sbit CS=P2^0; //片選信號(hào)(低電平有效)
- sbit DATEIN =P2^1;//主-從數(shù)據(jù)輸入
- sbit SCLK=P2^2;//時(shí)鐘信號(hào)
- sbit DATEOUT=P2^3;//從-主數(shù)據(jù)輸出
- uint btime;
- uchar c;
- unsigned char bdata dat;
- sbit dat_0=dat^0;
- sbit dat_1=dat^1;
- sbit dat_2=dat^2;
- sbit dat_3=dat^3;
- sbit dat_4=dat^4;
- sbit dat_5=dat^5;
- sbit dat_6=dat^6;
- sbit dat_7=dat^7;
- bit is_init;//決定是否延時(shí);
- uchar lpp;
- unsigned char fhz;//返回值
- uchar fhz_buff; //讀返回值中間量
- unsigned char xdata tab[512];
- void delay(uint time)
- { while(time)
- time--;
- }
- //**********************************************
- /*讀sd卡子程序,無(wú)返回值,有參函數(shù),參數(shù)為要寫(xiě)入DATEIN數(shù)據(jù)線的字節(jié)*/
- void write(unsigned char wr_)// 寫(xiě)入一個(gè)字節(jié)SD卡
- {
- dat=wr_;
- DATEIN=dat_7;
-
- SCLK=0;
- if(is_init)delay(200);
- if(!is_init)delay(2);
- SCLK=1;
- if(is_init) delay(200);
- if(!is_init)delay(2);
-
- DATEIN=dat_6;
-
- SCLK=0;
- if(!is_init)delay(2);
- if(is_init)delay(200);
- SCLK=1;
- if(is_init) delay(200);
- if(!is_init)delay(2);
- DATEIN=dat_5;
-
- SCLK=0;
- if(is_init)delay(200);
- if(!is_init)delay(2);
- SCLK=1;
- if(is_init) delay(200);
- if(!is_init)delay(2);
- DATEIN=dat_4;
-
- SCLK=0;
- if(is_init)delay(200);
- if(!is_init)delay(2);
- SCLK=1;
- if(is_init) delay(200);
- if(!is_init)delay(2);
- DATEIN=dat_3;
-
- SCLK=0;
- if(is_init)delay(200);
- if(!is_init)delay(2);
- SCLK=1;
- if(is_init) delay(200);
- if(!is_init)delay(2);
- DATEIN=dat_2;
-
- SCLK=0;
- if(is_init)delay(200);
- if(!is_init)delay(2);
- SCLK=1;
- if(is_init) delay(200);
- if(!is_init)delay(2);
- DATEIN=dat_1;
-
- SCLK=0;
- if(is_init)delay(200);
- if(!is_init)delay(2);
- SCLK=1;
- if(is_init) delay(200);
- if(!is_init)delay(2);
- DATEIN=dat_0;
-
- SCLK=0;
- if(is_init)delay(200);
- if(!is_init)delay(2);
- SCLK=1;
- if(is_init) delay(200);
- if(!is_init)delay(2);
- }
- unsigned char read()// 讀取一個(gè)字節(jié)SD卡
- {
- DATEOUT=1;
- SCLK=1;
- if(is_init)delay(200);
- if(!is_init)delay(2);
- SCLK=0;
- if(is_init)delay(200);
- if(!is_init)delay(2);
- dat_7=DATEOUT;
- SCLK=1;
- if(is_init)delay(200);
- if(!is_init)delay(2);
- SCLK=0;
- if(is_init)delay(200);
- if(!is_init)delay(2);
- dat_6=DATEOUT;
- SCLK=1;
- if(is_init)delay(200);
- if(!is_init)delay(2);
- SCLK=0;
- if(is_init)delay(200);
- if(!is_init)delay(2);
- dat_5=DATEOUT;
- SCLK=1;
- if(is_init)delay(200);
- if(!is_init)delay(2);
- SCLK=0;
- if(is_init)delay(200);
- if(!is_init)delay(2);
- dat_4=DATEOUT;
- SCLK=1;
- if(is_init)delay(200);
- if(!is_init)delay(2);
- SCLK=0;
- if(is_init)delay(200);
- if(!is_init)delay(2);
- dat_3=DATEOUT;
- SCLK=1;
- if(is_init)delay(200);
- if(!is_init)delay(2);
- SCLK=0;
- if(is_init)delay(200);
- if(!is_init)delay(2);
- dat_2=DATEOUT;
- SCLK=1;
- if(is_init)delay(200);
- if(!is_init)delay(2);
- SCLK=0;
- if(is_init)delay(200);
- if(!is_init)delay(2);
- dat_1=DATEOUT;
- SCLK=1;
- if(is_init)delay(200);
- if(!is_init)delay(2);
- SCLK=0;
- if(is_init)delay(200);
- if(!is_init)delay(2);
- dat_0=DATEOUT;
- return (dat);
- }
- void restsd()//復(fù)位SD卡
- { uchar i;
- uchar pcmd[6]={0x40,0x00,0x00,0x00,0x00,0x95};
- is_init=1;
-
- CS=1;
- for(i=0;i<15;i++)
- {
- //120時(shí)鐘
- write(0xff);
- }
-
-
- CS=1;
- write(0xff);//據(jù)說(shuō)是提高兼容性
- CS=0;//片選開(kāi)
- write( pcmd[0]);
- write( pcmd[1]);
- write( pcmd[2]);
- write( pcmd[3]);
- write( pcmd[4]);
- write( pcmd[5]);
- fhz=read();
- for(;;)
- {
- fhz=read();
- if(fhz==0x01)break;
-
-
- }
-
- CS=1;
- write(0xff);
- }
-
- void initsd()//初始化
- {
- //
- uchar pcmd[6]={0x41,0x00,0x00,0x00,0x00,0xff};//
- //
-
- CS=1;
- write(0xff);//據(jù)說(shuō)是提高兼容性
- CS=0;//片選開(kāi)
- write( pcmd[0]);
- write( pcmd[1]);
- write( pcmd[2]);
- write( pcmd[3]);
- write( pcmd[4]);
- write( pcmd[5]);
-
-
- fhz=read();
- for(;;)
- {
- fhz=read();
- if(fhz==0x00)break;
-
-
- }
-
- CS=1;
- write(0xff);
-
-
-
- }
- void readsd(unsigned long addstart)//讀SD卡物理扇區(qū)
-
- { unsigned long sdbuff1,sdbuff2,sdbuff3,sdbuff4;
- uint j,n;
- uchar zh1,zh2,zh3,zh4;
- sdbuff1=addstart;
- sdbuff2=addstart;
- sdbuff3=addstart;
- sdbuff4=addstart;
- zh1=(sdbuff1>>24)&0x000000ff;
- zh2=(sdbuff2>>16)&0x000000ff;
- zh3=(sdbuff3>>8)&0x000000ff;
- zh4=sdbuff4&0x000000ff;
- // uchar pcmd[6]={0x51,zh1,zh2,zh3,zh4,0xff};//原來(lái)這里是高地址字節(jié)在前地地址在后啊201012月14日邏輯扇區(qū)在253*512=0X0001fa00
-
-
- CS=1;
- write(0xff);//據(jù)說(shuō)是提高兼容性
- CS=0;//片選開(kāi)
- write( 0x51);
- write( zh1);
- write( zh2);
- write( zh3);
- write( zh4);
- write( 0xff);
- DATEOUT=1;
-
- for(;;)
- {
- fhz=read();
- if(fhz==0x00)break;
-
-
- }
- DATEOUT=1;
- for(;;)
- {
- fhz=read();
- if(fhz==0xfe)break;
-
-
- }
- DATEOUT=1;
- n=0;
- for(j=512;j;j--)
- {
- tab[n]=read();
- n++;
-
- }
- fhz=read();
- fhz=read();
- CS=1;
- write(0xff);
-
-
-
- }
- void InitUART(void)
- {
- TMOD = 0x20;
- SCON = 0x50;
- TH1 = 0xFD;
- TL1 = TH1;
- PCON = 0x00;
- EA = 1;
- ES = 1;
- TR1 = 1;
- }
- void UARTInterrupt(void) interrupt 4
- {
- if(RI)
- {
- RI = 0;
- //add your code here!
- }
- else
- TI = 0;
- }
- void SendOneByte(unsigned char c)
- {
- SBUF = c;
- while(!TI);
- TI = 0;
- }
- void main()
- { unsigned long numb;
- uint f;
- uchar m;
- InitUART(); //串口初始化
- is_init=1;
- restsd();
- initsd();
- is_init=0;//提高始終頻率
- p1_7=0;
- p1_7=1;
- btime=65536;
- while(1)
- {
- SendOneByte(0x88);
- numb=0x00420a00;
- do
- {
- readsd(numb);//讀物理扇區(qū)
-
- for(;;)
- {
- m=tab[f];
- SendOneByte(m);
- f++;
- if(f==512)break;//這里的F一定要定義成UNSIGNED INT行
- }
- SendOneByte(0xcc);
- numb=(numb+0x200);
- }
- while(0x0044620!=numb);
- EA=0;
- ES = 0;
- TR1 = 0;
- while(1);
- }
- }
復(fù)制代碼
|
|