这个小玩意,采用 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楼
#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]);
}
一周热门 更多>