#include <C8051F236.h>
#include <intrins.h>
#include "SPI.h"
#define SYSCLK 24000000 // 系统工作频率
#define BAUDRATE 9600 // 串口工作波特率
unsigned char bdata SR0_L;
unsigned char bdata SR0_H;
unsigned char bdata SR1;
unsigned char ID,APCL=0,APCH=0;
unsigned char Uart_Temp;
unsigned char KEY_Value;
sbit HandUp=P1^7;
unsigned char Need_to_Send=0;
unsigned char Uart_Coun=0;
unsigned char Uart_Flag=0;
unsigned char serial_rx_buff[8];
unsigned char serial_tx_buff[8];
/**************************************************************************
函数初始化
**************************************************************************/
void SYSCLK_Init(void);
void PORT_Init();
void UART_Init();
void Timer0_Init(void);
void Timer1_Init(void);
void Interupt_Init(void);
void delay_ms(unsigned int);
void ISD_Init(void) ;
//void ISD_CHK_MEM(void);
void ISD_PU(void);
void ISD_Stop(void);
void ISD_Reset(void);
void ISD_PD(void);
unsigned char ISD_SendData(unsigned char);
//void SendChar(unsigned char);// 调试用的串口发送数据
void SendString (unsigned char *str, unsigned char strlen);
void RdStatus(void);
void ISD_Play();
void ISD_FWD();
void ClrInt(void);
//void ISD_WR_NVCFG(void);
void ISD_WR_APC2(unsigned char);
void main()
{
//int i;
WDTCN = 0XDE; // 此条及下条 禁止看门狗
WDTCN = 0XAD;
SYSCLK_Init();
PORT_Init();
UART_Init(); // 串口初始化
Timer0_Init();
Timer1_Init();
Interupt_Init();
ISD_Init();
HandUp=0;
KEY_Value=0;
while(1)
{
if (TL0>50)
{
TL0=0;
}
}
_nop_();
}
/**************************************************************************
* 函数原型: void ISD_Init(void);
* 功 能: 初始化
**************************************************************************/
void ISD_Init(void)
{
ISD_Reset();
ClrInt();
ISD_PU();
//SendChar(0xcc); //发送标志位!!!!!!!!!!!!1111
ClrInt();
ISD_WR_APC2(0xa8); //初始化之前的指令都不影响状态,且上电后为RDY=1
}
/**************************************************************************
* 函数原型: void ISD_PU(void);
* 功 能: 上电
**************************************************************************/
void ISD_PU(void)
{
do
{
// SendChar(0xdd); //发送标志位!!!!!!!!!!!!1111
ISD_SendData(PU);
ISD_SendData(0x00);
SS=1;
RdStatus();
// }while((SR0_L&0x04)&&(SR1&0x01)); //等待RDY=1且PU=1
}while(SR0_L&0x01); //等待CMD_ERR=0,则正确
delay_ms(100);
}
/**************************************************************************
* 函数原型: void RdStatus(void);
* 功 能: 读取状态 任何情况都可以进行 且执行后不影响状态
**************************************************************************/
void RdStatus(void)
{
ISD_SendData(RD_STATUS);
SR0_L =ISD_SendData(RD_STATUS);
ISD_SendData(0x00);
SR0_H =ISD_SendData(0x00);
ISD_SendData(0x00);
SR1 =ISD_SendData(0x00);
SS=1;
delay_ms(10);
//下面的几条语句放在了上面交叉
// SR0_L =ISD_SendData(RD_STATUS);
// SR0_H =ISD_SendData(0x00);
// SR1 =ISD_SendData(0x00);
// SS=1;
// SendChar(SR0_L);
// SendChar(SR0_H);
// SendChar(SR1);
// delay_ms(10);
}
/**************************************************************************
* 函数原型: void ISD_Play();
* 功 能: 播放 前:idle 后:idle
**************************************************************************/
void ISD_Play()
{
do{
ISD_SendData(0x50);
ISD_SendData(0x00);
SS=1;
delay_ms(10); //延迟10ms
//SendChar(0xdd);
RdStatus();
}while(SR0_L&0x01); //if(SR0_L^0==1){system Err}<CMD_Err==1>
//SendChar(0xee);
do
{
RdStatus();
}while(SR1&0x04); //FWD之前一定要是idle 空闲状态
// while(!(SR1&0x01)); //当RDY=0等待,变为1后执行STOP,停止当前操作
//SendChar(0xEF);
delay_ms(1000); //延迟10ms
// ISD_Stop(); //撤到下面快进里面
// ClrInt();
}
/**************************************************************************
* 函数原型: void ISD_FWD(void);
* 功 能: 掉电 前:idle 后:idle
**************************************************************************/
void ISD_FWD(void)
{
ISD_Stop();
ClrInt();
// do
// { SendChar(0xff);
// RdStatus();
// }while(SR1&0x01); //FWD之前一定要是idle 空闲状态
// do
// {
// SendChar(0xff);
ISD_SendData(FWD);
ISD_SendData(0x00);
SS=1;
// RdStatus();
// }while(SR0_L&0x01);
//SendChar(0xf1);
}
//-----------------------------------------------------------------------------
// 系统时钟初始化 SYSCLK_Init()
//-----------------------------------------------------------------------------
void SYSCLK_Init (void)
{
int i; /*延时计数器*/
OSCXCN = 0x67; /*打开外部晶体振荡器形式,并设为与24M匹配的模式*/
for (i=0; i < 256; i++) ; /*延时等待时钟稳定*/
while (!(OSCXCN & 0x80)) ; /*查询外部晶体是否稳定起振*/
OSCICN = 0x88; /*正式使用外部晶体作为系统时钟,并使能时钟丢失检测*/
}
//-----------------------------------------------------------------------------
// 端口初始化 PORT_Init() CLK/MOSI/MISO/SS P3.6担当片选功能,SS无用
//-----------------------------------------------------------------------------
void PORT_Init(void)
{
PRT3CF |= 0xC0; //P3.6推挽输出 控制片选,因为SPI一直在主方式,SS没有用
//不要下面的三行是因为模拟SPI
// PRT2MX |= 0X01; //SPI0OEN使能位,即SCK、MISO、MOSI、NSS分别连接到P2.0、P2.1、P2.2和P2.3
// PRT2CF |= 0X0F; //P2.0-P2.3推挽输出
// P2MODE |= 0X0F; //P2.0-P2.3数字输入
//下面为串口配置
//PRT0MX |= 0x41; //UARTEN=1,T2E=1,即P0.0-TX ,P0.1-RX ,T2-P0.6相连
PRT0MX |= 0x3D;
//P0MODE |= 0x03; // 配置P0.0和P0.1为数字输入
//PRT0CF |= 0x03; // 使能 RX, TX 为推挽输出
PRT0CF |= 0x01;
PRT1CF |= 0x80;
PRT3CF &= 0xf0;
P3MODE |= 0x0f;
}
//-----------------------------------------------------------------------------
// 串口初始化 UART_Init() T2初始化16位自动重装波特率可调
//-----------------------------------------------------------------------------
void UART_Init(void)
{
unsigned int temp;//计算得到的捕捉寄存器RCAP2H,RCAP2L定时初值
SCON = 0x50;//方式1:8位UART,波特率可调,无停止位,“0X50则是接收使能”
T2CON = 0x30; //TX和RX接受时钟都为T2
temp =(unsigned int)(65536 - SYSCLK/BAUDRATE/32);
RCAP2L =(unsigned char)(temp&0x00FF);
RCAP2H =(unsigned char)((temp>>8)&0x00FF);
TR2 = 1;
}
void Timer0_Init(void)
{
TMOD |=0x05;
TCON |=0x11;
TH0=0;
TL0=0;
}
void Timer1_Init(void)
{
TMOD |=0x50;
TCON |=0x44;
TH1=0;
TL1=0;
}
void Interupt_Init(void)
{
EX0 = 1;
//EX1 = 1;
ES = 1; //开串口中断允许
EA = 1; //中断总允许/禁止位
}
/*
void SendChar(unsigned char temp)
{
SBUF = temp;
while(!TI);
TI=0;
}
*/
void SendString (unsigned char *str, unsigned char strlen)
{
unsigned char m = 0;
do
{
SBUF = *(str + m);
while(!TI);
TI = 0;
m ++;
}
while (m < strlen);
}
//-----------------------------------------------------------------------------
// 串口中断服务 UATR_ISR() interrupt 4 串口中断
//-----------------------------------------------------------------------------
void UATR0_ISR(void) interrupt 4
{
if(RI)
{
RI = 0;
Uart_Temp =SBUF;
if