小玩意,单片AT89C2051 + SD卡 + 3310LCD = 音乐播放器

2020-01-12 17:09发布

这个小玩意,采用 ATMEL 的传统51MCU作主控制芯片,加上SD卡和显示屏,就可以作简单的音乐播放器了,虽然音质不怎么样,不过作为DIY还是蛮有乐趣,希望大家喜欢。
没有采用FAT文件系统,只是按扇区读取SD卡,由于2051资源有限,改为4051有望可以操作FAT,但目前程序还在不断完善中。
128byte怎样读取512byte的扇区数据?可以采用边读边播放的方式,就能解决。音乐文件是32KHz取样率的WAV文件,所以和HIFI就沾不上边了。
程序是用C来编写,以方便交流,资料整理中,完善后再上传。


(原文件名:0001.jpg)


(原文件名:0002.jpg)


(原文件名:0003.jpg)


(原文件名:0004.jpg)


(原文件名:SD_player.PNG)

下面是测试用的HEX文件,由于部分显示数据在SD卡中,所以SD卡需要存入一个特别的文件,然后把格式为32KHZ,8bit,单声的WAV文件存入即可。
点击此处下载 ourdev_609987T97WV4.rar(文件大小:2K) (原文件名:sdcard.rar)

还是有就视频文件,顺便听听音质。
点击此处下载 ourdev_609986DT65P1.avi视频文件大小:5.82M) (原文件名:SD_player.wmv.avi)

程序已更新于80楼
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
100条回答
cowboy
2020-01-22 06:48
这是3310 LCD 部分


#include <reg51.h>
#include <INTRINS.H>

sbit SDIN = P3^2; //P3^2
sbit SCLK = P3^4;
sbit D_C  = P3^5;
sbit SCE  = P3^7;

code unsigned char Font[70] =
{
   0x3E, 0x51, 0x49, 0x45, 0x3E ,  // 0
   0x00, 0x42, 0x7F, 0x40, 0x00 ,  // 1
   0x42, 0x61, 0x51, 0x49, 0x46 ,  // 2
   0x21, 0x41, 0x45, 0x4B, 0x31 ,  // 3
   0x18, 0x14, 0x12, 0x7F, 0x10 ,  // 4
   0x27, 0x45, 0x45, 0x45, 0x39 ,  // 5
   0x3C, 0x4A, 0x49, 0x49, 0x30 ,  // 6
   0x01, 0x71, 0x09, 0x05, 0x03 ,  // 7
   0x36, 0x49, 0x49, 0x49, 0x36 ,  // 8
   0x06, 0x49, 0x49, 0x29, 0x1E ,  // 9
   0x00, 0x00, 0x36, 0x36, 0x00 ,  // :
   0x7f, 0x3e, 0x1c, 0x08, 0x00 ,  // >
   0x3e, 0x3e, 0x00, 0x3e, 0x3e ,  // ||
   0x00, 0x00, 0x00, 0x00, 0x00 ,  //" "
};   

code unsigned char Level[8] = {0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff,};

extern void delay(unsigned int i);

void LCD3310_write_cmd(unsigned char cmd)
{
    D_C  = 0;
    SCLK = 0;
    SCE  = 0;
    delay(3);
        SDIN = cmd & 0x80;
        SCLK = 1;
        SDIN = cmd & 0x40;
        SCLK = 0;
        SCLK = 1;
        SDIN = cmd & 0x20;
        SCLK = 0;
        SCLK = 1;
        SDIN = cmd & 0x10;
        SCLK = 0;
        SCLK = 1;
        SDIN = cmd & 0x08;
        SCLK = 0;
        SCLK = 1;
        SDIN = cmd & 0x04;
        SCLK = 0;
        SCLK = 1;
        SDIN = cmd & 0x02;
        SCLK = 0;
        SCLK = 1;
        SDIN = cmd & 0x01;
        SCLK = 0;
        SCLK = 1;
    D_C  = 1;
    SDIN = 1;
    SCE  = 1;
}

void LCD3310_write_dat(unsigned char dat)
{
//    D_C  = 1;
    SCLK = 0;
    SCE  = 0;
    delay(3);
        SDIN = dat & 0x80;
        SCLK = 1;
        SDIN = dat & 0x40;
        SCLK = 0;
        SCLK = 1;
        SDIN = dat & 0x20;
        SCLK = 0;
        SCLK = 1;
        SDIN = dat & 0x10;
        SCLK = 0;
        SCLK = 1;
        SDIN = dat & 0x08;
        SCLK = 0;
        SCLK = 1;
        SDIN = dat & 0x04;
        SCLK = 0;
        SCLK = 1;
        SDIN = dat & 0x02;
        SCLK = 0;
        SCLK = 1;
        SDIN = dat & 0x01;
        SCLK = 0;
        SCLK = 1;
    D_C  = 1;
    SDIN = 1;
    SCE  = 1;
}

void LCD3310_init(void)
{
    LCD3310_write_cmd(0x21);
    LCD3310_write_cmd(0xd7);
    LCD3310_write_cmd(0x06);
    LCD3310_write_cmd(0x20);
    LCD3310_write_cmd(0x0c);
}

void LCD3310_set_XY(unsigned char x,unsigned char y)
{
    if (x >= 84) return;
    if (y >= 6)  return;
    LCD3310_write_cmd(0x80 | x);
    LCD3310_write_cmd(0x40 | y);
}

void LCD3310_print(unsigned char n)
{
    n = (n << 2) + n;
    LCD3310_write_dat(Font[n]);
    LCD3310_write_dat(Font[++n]);
    LCD3310_write_dat(Font[++n]);
    LCD3310_write_dat(Font[++n]);
    LCD3310_write_dat(Font[++n]);
}

一周热门 更多>