⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 SD卡上对FAT16文件操作系统的读
💻 C
字号:

#include	<iom8v.h>
#include	<macros.h>
#define 	uchar unsigned 	char
#define 	uint unsigned 	int
#define 	ulong unsigned 	long
#include	"init.h"
#include	"SD.h"
#include	"FAT.h"


void send_string(uchar *word,uchar enter)
{ 
	while(*word!=0)
	{
		while(!(UCSRA&0x20));
		UDR=*word;
		word++;
	}
	if(enter)
	{
		while(!(UCSRA&0x20));
		UDR=0x0d;
		while(!(UCSRA&0x20));
		UDR=0x0a;
	}
}
void send_char(uchar dat,uchar enter)
{
	while(!(UCSRA&0x20));
	UDR=dat;
	if(enter)
	{
		while(!(UCSRA&0x20));
		UDR=0x0d;
		while(!(UCSRA&0x20));
		UDR=0x0a;
	}
}


void main(void)
{
	uchar i,sd_buff[512],sub[2],adv[3];
	uint w;
	wait(60000);
	init();
	i=sd_init();
	
	if(i==0)
	{
		i=GetFATInfo(sd_buff);
		if(i==0)
		{
			w=TotalSectors*512/1024/1024;
			send_string("System of FAT16",1);
			send_string("The Size is ",0);
			i=w/1000;
			if(i)send_char(i+0x30,0);
			send_char((w%1000)/100+0x30,0);
			send_char((w%100)/10+0x30,0);
			send_char((w%10)+0x30,0);
			send_char('M',1);
		}
		else if(i==1)
		{
			send_string("It is not FAT16!",1);
		}
	}
	else
	{
		while(!(UCSRA&0x20));
		UDR=i;
	}
	while(1)
	{
		if(RS232>1)
		{
			RStime=0;
			RS232=0;
			if(RsNum==buff232[0])
			{
				if(buff232[1]==0)
				{
					i=sd_read_block(buff232[2],sd_buff);
					if(!i)
					{
						for(w=0;w<512;w++)
						{
							while(!(UCSRA&0x20));
							UDR=sd_buff[w];
						}
					}
					else
					{
						while(!(UCSRA&0x20));
						UDR=i;
					}
				}
				else if(buff232[1]==1)
				{											/* seek file */
					i=SeekFile(sd_buff);
					if(i==0)
					{
						i=PlayMP3(sd_buff);
					}
					else
					{
						send_string("Can't find MP3 files!",1);
					}
				}
				/* seek advert */
				/*
				else if(buff232[1]==2)
				{											
					sub[0]=buff232[2];
					sub[1]=buff232[3];
					adv[0]=buff232[4];
					adv[1]=buff232[5];
					adv[2]=buff232[6];
					i=SeekAdvert(sd_buff,sub,adv);
					if(i==0)
					{
						i=PlayMP3(sd_buff);
					}
					else
					{
						send_string("Can't find advert files!",1);
					}
				}
				*/
			}
		}
	}
}
void init(void)
{
	DDRD |= (BIT(sta)|BIT(TXD));
	DDRD &= ~BIT(RXD);
	PORTD |= (BIT(TXD)|BIT(RXD));
	//
	TCCR1B=2;												/* TMR1:8分频 */
	TIMSK=4;
	UBRRH=0;
	UBRRL=51;												/* 9600bit/s */
	UCSRC=0x8e;
	UCSRB=0x98;												/* 允许发送和接收,其中接收启动中断 */
	SREG=0x80;
}
/*----------------------------------------------------------*/
/* Timer1中断(10ms) */
void Timer1(void)
{
	TCNT1H=0xec;
	TCNT1L=0x78;
/* */
	sec++;
	if(sec>50)
	{
		sec=0;
		PORTD ^= BIT(sta);
	}
	/**/
	if(RStime)
	{														/* 处理232干扰 */
		RStime++;
		if(RStime>2)
		{
			RStime=0;
			RS232=0;
		}
	}
/**/
	TIFR=4;
}
/*----------------------------------------------------------*/
/* 串口子程序 */
void Rece_232(void)
{
	uchar d;
	d=UDR;
	if(d==0x7e)
	{
		if(RS232<2)
		{
			RS232++;
			if(RS232==1)
			{												/* 启动接收 */
				RsNum=0;
				Runsave=0;
			}
		}
	}
	else
	{
		if(RS232==1)
		{													/* 接收数据 */
			if(d==0x1b)
			{
				Runsave=1;
			}
			else
			{
				if(Runsave)
				{
					Runsave=0;
					d=d^0x1b;
				}
				buff232[RsNum]=d;
				RsNum++;
				if(RsNum>59)RsNum=0;
			}
		}
	}
	RStime=1;
}
/*----------------------------------------------------------*/
void wait(uint t)
{
	while(--t);
}
/*----------------------------------------------------------*/
/* 播放MP3 */
/* 播放正常完成返回0,否则返回其它数 */
uchar PlayMP3(uchar *data)
{															/* 播放MP3文件 */
	uchar i,v,d,*p,over;
	uint w;
	over=0;
	while(!over)
	{
		for(i=0;i<SecPerClus;i++)
		{
			d=sd_read_block(DATASectors+((ulong)StartClus-2)*SecPerClus+i,data);
			if(d!=0)return(d);
			w=0;
			p=data;
			while(w<512)
			{												/* 512Byte分为16次给VS1001K */
			 	for(v=0;v<32;v++)
				{
				 	d=*p;
					p++;
					send_char(d,0);
					FileLength--;
					if(FileLength==0)
					{										/* 歌曲结束 */
						over=1;
						break;
					}
				}
				w+=32;
			}
			if(over)break;
		}
		if(!over)
		{													/* 取下一簇 */
			d=sd_read_block(FATSectors+StartClus/256,data);
			if(d!=0)return(d);
			p=data;
			p=p+(StartClus%256)*2;
			StartClus=*p++;
			StartClus+=((uint)*p)<<8;
			if(StartClus==0xffff)over=1;
		}
	}
	return(0);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -