找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2917|回复: 0
打印 上一主题 下一主题
收起左侧

单片机串口显示来自SD卡的数据源程序

[复制链接]
跳转到指定楼层
楼主
ID:83710 发表于 2015-6-23 16:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit p1_7=P1^7;
  5. sbit CS=P2^0; //片选信号(低电平有效)
  6. sbit DATEIN =P2^1;//主-从数据输入
  7. sbit SCLK=P2^2;//时钟信号
  8. sbit DATEOUT=P2^3;//从-主数据输出

  9. uint btime;
  10. uchar c;

  11. unsigned char bdata dat;
  12. sbit dat_0=dat^0;
  13. sbit dat_1=dat^1;
  14. sbit dat_2=dat^2;
  15. sbit dat_3=dat^3;
  16. sbit dat_4=dat^4;
  17. sbit dat_5=dat^5;
  18. sbit dat_6=dat^6;
  19. sbit dat_7=dat^7;

  20. bit is_init;//决定是否延时;
  21.   uchar lpp;
  22. unsigned char fhz;//返回值
  23. uchar fhz_buff; //读返回值中间量
  24. unsigned char xdata tab[512];


  25. void delay(uint time)
  26. {  while(time)
  27.   time--;
  28. }

  29. //**********************************************
  30. /*读sd卡子程序,无返回值,有参函数,参数为要写入DATEIN数据线的字节*/
  31. void write(unsigned char wr_)// 写入一个字节SD卡
  32. {
  33.            dat=wr_;
  34.         DATEIN=dat_7;
  35.    
  36.       SCLK=0;
  37.    if(is_init)delay(200);
  38.      if(!is_init)delay(2);
  39.       SCLK=1;
  40.       if(is_init) delay(200);
  41.        if(!is_init)delay(2);
  42.   
  43.       DATEIN=dat_6;
  44.    
  45.       SCLK=0;
  46.      if(!is_init)delay(2);
  47.     if(is_init)delay(200);
  48.       SCLK=1;
  49.       if(is_init) delay(200);
  50.      if(!is_init)delay(2);

  51.       DATEIN=dat_5;
  52.    
  53.       SCLK=0;
  54.     if(is_init)delay(200);
  55.      if(!is_init)delay(2);
  56.       SCLK=1;
  57.       if(is_init) delay(200);
  58.     if(!is_init)delay(2);

  59.       DATEIN=dat_4;
  60.    
  61.       SCLK=0;
  62.     if(is_init)delay(200);
  63.       if(!is_init)delay(2);
  64.       SCLK=1;
  65.       if(is_init) delay(200);
  66.      if(!is_init)delay(2);

  67.      DATEIN=dat_3;
  68.    
  69.       SCLK=0;
  70.     if(is_init)delay(200);
  71.       if(!is_init)delay(2);
  72.       SCLK=1;
  73.       if(is_init) delay(200);
  74.     if(!is_init)delay(2);

  75.      DATEIN=dat_2;
  76.    
  77.       SCLK=0;
  78.     if(is_init)delay(200);
  79.       if(!is_init)delay(2);
  80.       SCLK=1;
  81.       if(is_init) delay(200);
  82.       if(!is_init)delay(2);

  83.     DATEIN=dat_1;
  84.    
  85.       SCLK=0;
  86.     if(is_init)delay(200);
  87.      if(!is_init)delay(2);
  88.       SCLK=1;
  89.       if(is_init) delay(200);
  90.      if(!is_init)delay(2);

  91.     DATEIN=dat_0;
  92.    
  93.       SCLK=0;
  94.     if(is_init)delay(200);
  95.       if(!is_init)delay(2);
  96.       SCLK=1;
  97.       if(is_init) delay(200);
  98.      if(!is_init)delay(2);
  99. }
  100. unsigned char read()// 读取一个字节SD卡
  101. {
  102.           DATEOUT=1;
  103.          SCLK=1;
  104.    if(is_init)delay(200);
  105.      if(!is_init)delay(2);
  106.    SCLK=0;
  107.     if(is_init)delay(200);
  108.    if(!is_init)delay(2);
  109.     dat_7=DATEOUT;

  110.      SCLK=1;
  111.    if(is_init)delay(200);
  112.    if(!is_init)delay(2);
  113.    SCLK=0;
  114.     if(is_init)delay(200);
  115.      if(!is_init)delay(2);
  116.     dat_6=DATEOUT;

  117.     SCLK=1;
  118.    if(is_init)delay(200);
  119.     if(!is_init)delay(2);
  120.    SCLK=0;
  121.     if(is_init)delay(200);
  122.     if(!is_init)delay(2);
  123.     dat_5=DATEOUT;

  124.     SCLK=1;
  125.    if(is_init)delay(200);
  126.      if(!is_init)delay(2);
  127.    SCLK=0;
  128.     if(is_init)delay(200);
  129.    if(!is_init)delay(2);
  130.     dat_4=DATEOUT;

  131.      SCLK=1;
  132.    if(is_init)delay(200);
  133.     if(!is_init)delay(2);
  134.    SCLK=0;
  135.     if(is_init)delay(200);
  136.      if(!is_init)delay(2);
  137.     dat_3=DATEOUT;

  138.     SCLK=1;
  139.    if(is_init)delay(200);
  140.        if(!is_init)delay(2);
  141.    SCLK=0;
  142.     if(is_init)delay(200);
  143.        if(!is_init)delay(2);
  144.     dat_2=DATEOUT;

  145.      SCLK=1;
  146.    if(is_init)delay(200);
  147.         if(!is_init)delay(2);
  148.    SCLK=0;
  149.     if(is_init)delay(200);
  150.        if(!is_init)delay(2);
  151.     dat_1=DATEOUT;


  152.      SCLK=1;
  153.    if(is_init)delay(200);
  154.          if(!is_init)delay(2);
  155.    SCLK=0;
  156.     if(is_init)delay(200);
  157.           if(!is_init)delay(2);
  158.     dat_0=DATEOUT;


  159.    return (dat);

  160. }

  161. void restsd()//复位SD卡
  162. {  uchar i;
  163. uchar pcmd[6]={0x40,0x00,0x00,0x00,0x00,0x95};
  164. is_init=1;

  165. CS=1;
  166. for(i=0;i<15;i++)
  167. {
  168.        //120时钟
  169.    write(0xff);
  170. }


  171.   
  172.   
  173.       CS=1;
  174.    write(0xff);//据说是提高兼容性
  175.    CS=0;//片选开

  176.    write( pcmd[0]);
  177.    write( pcmd[1]);
  178.    write( pcmd[2]);
  179.    write( pcmd[3]);
  180.    write( pcmd[4]);
  181.    write( pcmd[5]);

  182.    fhz=read();
  183. for(;;)
  184. {
  185.    fhz=read();
  186.    if(fhz==0x01)break;


  187. }

  188.   
  189.   CS=1;
  190.   write(0xff);

  191. }




  192. void initsd()//初始化
  193. {
  194. //
  195.    uchar pcmd[6]={0x41,0x00,0x00,0x00,0x00,0xff};//
  196. //

  197.       CS=1;
  198.    write(0xff);//据说是提高兼容性
  199.    CS=0;//片选开

  200.    write( pcmd[0]);
  201.    write( pcmd[1]);
  202.    write( pcmd[2]);
  203.    write( pcmd[3]);
  204.    write( pcmd[4]);
  205.    write( pcmd[5]);

  206.   
  207.    fhz=read();
  208. for(;;)
  209. {
  210.    fhz=read();
  211.    if(fhz==0x00)break;


  212. }

  213.   
  214.   CS=1;
  215.   write(0xff);








  216. }

  217. void readsd(unsigned long addstart)//读SD卡物理扇区
  218.    
  219. {  unsigned long sdbuff1,sdbuff2,sdbuff3,sdbuff4;  
  220.    uint j,n;
  221. uchar zh1,zh2,zh3,zh4;
  222.   sdbuff1=addstart;
  223.   sdbuff2=addstart;
  224.   sdbuff3=addstart;
  225.   sdbuff4=addstart;

  226.      zh1=(sdbuff1>>24)&0x000000ff;
  227.     zh2=(sdbuff2>>16)&0x000000ff;
  228.       zh3=(sdbuff3>>8)&0x000000ff;
  229.      zh4=sdbuff4&0x000000ff;
  230.    // uchar pcmd[6]={0x51,zh1,zh2,zh3,zh4,0xff};//原来这里是高地址字节在前地地址在后啊201012月14日逻辑扇区在253*512=0X0001fa00



  231.    CS=1;
  232.    write(0xff);//据说是提高兼容性
  233.    CS=0;//片选开

  234.    write( 0x51);
  235.    write( zh1);
  236.    write( zh2);
  237.    write( zh3);
  238.    write( zh4);
  239.    write( 0xff);
  240.    DATEOUT=1;
  241.   
  242. for(;;)
  243. {
  244.    fhz=read();
  245.    if(fhz==0x00)break;


  246. }
  247. DATEOUT=1;

  248.    for(;;)
  249. {
  250.    fhz=read();
  251.    if(fhz==0xfe)break;


  252. }

  253.   DATEOUT=1;
  254. n=0;
  255. for(j=512;j;j--)
  256. {  
  257.    tab[n]=read();
  258.     n++;

  259. }
  260. fhz=read();
  261. fhz=read();
  262. CS=1;
  263. write(0xff);








  264. }

  265. void InitUART(void)
  266. {
  267.     TMOD = 0x20;
  268.     SCON = 0x50;
  269.     TH1 = 0xFD;
  270.     TL1 = TH1;
  271.     PCON = 0x00;
  272.     EA = 1;
  273.     ES = 1;
  274.     TR1 = 1;
  275. }
  276. void UARTInterrupt(void) interrupt 4
  277. {
  278.     if(RI)
  279.     {
  280.         RI = 0;
  281. //add your code here!
  282.     }
  283.     else
  284.         TI = 0;
  285. }

  286. void SendOneByte(unsigned char c)
  287. {
  288.     SBUF = c;
  289.     while(!TI);
  290.     TI = 0;
  291. }

  292. void main()

  293. { unsigned long numb;
  294.    uint f;
  295.    uchar m;

  296. InitUART(); //串口初始化
  297. is_init=1;
  298. restsd();
  299. initsd();
  300. is_init=0;//提高始终频率
  301. p1_7=0;


  302. p1_7=1;
  303.    btime=65536;
  304. while(1)
  305. {  
  306. SendOneByte(0x88);
  307.    numb=0x00420a00;
  308.   do
  309.   {
  310. readsd(numb);//读物理扇区


  311. for(;;)
  312.    {

  313.    m=tab[f];
  314. SendOneByte(m);
  315. f++;
  316. if(f==512)break;//这里的F一定要定义成UNSIGNED INT行
  317.        }
  318.    SendOneByte(0xcc);
  319.    numb=(numb+0x200);
  320.   }
  321.    while(0x0044620!=numb);
  322.   EA=0;

  323.     ES = 0;
  324.     TR1 = 0;

  325. while(1);
  326. }
  327. }
复制代码




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表