資源簡介
SD卡的protues仿真
keil 與protues聯機仿真
at89c52單片機

代碼片段和文件信息
#include?
#define?uchar?unsigned?char
#define?uint?unsigned?int
#define?ulong?unsigned?long
/**************定義管腳*************/
sbit?scl=P1^0;//同步時鐘?入
sbit?si=P1^1;?//同步數據?入
sbit?cs=P1^2;?//片選?
sbit?so=P1^3;?//數據出
/**********************************/
bit?is_init;
uchar??pbuf[12];
/*關于錯誤碼的定義****************/
#define?INIT_CMD0_ERROR?0X01
#define?INIT_CMD1_ERROR?0X02;
#define?READ_BLOCK_ERROR?0X03;
#define?WRITE_BLOCK_ERROR?0X04;
/*********************************/
void?delay(uchar?i)
{
while(i--);
}
/*寫入一個字節*******************/
void?spi_write(uchar?x)
{
uchar?i;
for(i=0;i<8;i++)
{
si=((x< scl=0;//low?is?cs
if(is_init)?delay(8);//for?the?v
scl=1;
if(is_init)?delay(8);
}
}
/*********************************/
/*read?a?byte***********************/
uchar?spi_read(void)
{
uchar?temp=0i;
so=1;
for(i=0;i<8;i++)
{
scl=0;
if(is_init)?delay(8);
if(so)?temp=(0x80>>i);
scl=1;
if(is_init)?delay(8);
}
return(temp);
}
/**************************************/
/***********????????write?cmd??**********/
uchar?write_cmd(uchar?*pcmd)
{
uchar?temptime=0i;
for(i=0;i<6;i++) ???//一條命令都是6個字節,形參用指針,
{ ???//指向6個字節命令,
spi_write(pcmd[i]);
}
do?//看看寫進去沒有通過so管腳
{
temp=spi_read();
time++;
}
while((temp==0xff)&&(time<<100));//一直到讀到的不是0xff或超時,退出去
return(temp);
}
/****************************************/
/*/以上為基本的命令或函數,下面的是具體的函數?*/
/***************??sd?card?reset?goto?spi?use?cmd0?**********/
uchar?sd_reset(void)
{
uchar?timetempi;
uchar?code?pcmd[6]={0x400x000x000x000x000x95};
is_init=1;//下面需要慢點,須=1,快點時=0,即可
cs=1;
for(i=0;i<0x0f;i++) //復位時,至少要72個時鐘周期,
{ //現在是,15*8=120個clk
spi_write(0xff);
}
cs=0;time=0;
do
{
temp=write_cmd(pcmd);
time++;
if(time==100)
{
return(INIT_CMD0_ERROR);
}
}?while(temp!=0x01);?//校驗碼是0x01,是0x01時,表示寫入成功
???cs=1;
???spi_write(0xff);//時序上要求補8個clk
???return(0);//返回0,寫入成功
}
/*****************************************/
/*初始化,用1號命令*********************/
uchar?sd_init(void)
{
uchar?timetemp;
uchar?code?pcmd[6]={0x410x000x000x000x000xff};
cs=0;
time=0;
do
{
temp=write_cmd(pcmd);
time++;
if(time==100)
{
return?INIT_CMD1_ERROR;
}
}
?while(temp!=0x00);
is_init=0;
cs=1;
spi_write(0xff);
return(0);
}
/************************************************/
/*************??sd?card?扇區的讀寫?????????????????************/
uchar?sd_write_sector(ulong?addruchar?*buffer)
{
uchar?temptime;
uint?i;
uchar?pcmd[]={0x580x000x000x000x000xff};
addr<<=9;//等同于??addr=addr*512一扇區有512字節,將扇區地址轉換成字節地址
pcmd[1]=((addr&0xff000000)>>24);//拋棄后24位
pcmd[2]=((addr&0x00ff0000)>>16);
pcmd[3]=((addr&0x0000ff00)>>8);
cs=0;time=0;
do
{
temp=write_cmd(pcmd);
time++;
if(time==100)
{
return(temp);
}
}?while(temp!=0x00);
for(i=0;i<100;i++)
{
spi_read();
}
spi_write(0xfe);
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件??????19215??2009-04-30?20:23??sd.DSN
?????文件??????10232??2009-04-30?20:22??sd.LST
?????文件??????11606??2009-04-30?20:22??sd.OBJ
?????文件????????316??2009-04-30?20:23??sd.PWI
?????文件??????10554??2009-04-30?20:22??sdcard
?????文件???????3557??2009-04-30?20:22??sdcard.hex
?????文件?????????41??2009-04-30?20:22??sdcard.lnp
?????文件??????16024??2009-04-30?20:22??sdcard.M51
?????文件???????1025??2009-04-30?20:23??sdcard.Opt
?????文件???????2371??2009-04-30?20:22??sdcard.plg
?????文件???????2155??2009-04-30?20:23??sdcard.Uv2
????.......??????1024??2009-04-30?17:29??sdcard_Opt.Bak
????.......??????2155??2009-04-30?17:29??sdcard_Uv2.Bak
?????文件?????????58??2009-04-30?16:47??sd管腳.txt
?????文件???????6376??2005-03-22?15:22??STARTUP.A51
?????文件??????14048??2009-04-30?16:52??STARTUP.LST
?????文件????????749??2009-04-30?16:52??STARTUP.OBJ
?????文件??????17453??2009-04-30?20:21??Last?Loaded?sd.DBK
?????文件?????????32??2009-04-30?20:22??sd.__i
?????文件???????4329??2009-04-30?20:22??sd.c
-----------?---------??----------?-----??----
???????????????123320????????????????????20
- 上一篇:c51單片機跑馬燈單鍵控制
- 下一篇:天貓淘寶數據爬取源碼可直接使用.zip
評論
共有 條評論