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

📄 host.c

📁 U盘实时记录温度
💻 C
📖 第 1 页 / 共 2 页
字号:
P8563的初始化-----外部调用
********************************************/
void P8563_init()
{
 unsigned char i;
// if((ReadData(0x02)&0x7f)==0x8) /* 检查是否第一次启动,是则初始化时间,检查对象为秒(0x02)最高位为1则初始化*/
 {
  for(i=0;i<=6;i++) g8563_Store[i]=c8563_Store[i]; /*初始化时间*/
  P8563_settime();
 }
}

/********************************************
把时间数据形式转库十进制
***********************************************/
unsigned char convert_time(unsigned char x)
{
 return (x>>4)*10+(x&0x0f);
}

/*----------------------------------------------------
 函数名:ftoa()
 功能  :将一个浮点数转为一个精度为jd的字符串,存于s中
------------------------------------------------------*/
char * ftoa(float dat,char *s,unsigned char jd)
{
 int len,temp,flag=dat<0?dat=-dat,1:0,i;
 char t[10];
 temp=(int)dat;
 for(len=0;temp>0;temp/=10,len++)
 t[len]=temp%10+48;
 for(i=0;i<=len;i++)
 s[len-i-1]=t[i];
 s[len++]=jd?'.':0;
 for(i=0,temp=(int)((dat-(int)dat)*pow(10,jd));temp>0;temp/=10,i++)
 t[i]=temp%10+48;
 for(i=0;i<jd;i++)
 s[len++]=t[jd-i-1];
 s[len]=0;
 return s;
}

void time2string()
{
 unsigned int temprature;
 //mCmdParam.ByteWrite.mByteBuffer[0]='2';
 //mCmdParam.ByteWrite.mByteBuffer[1]='0';
 mCmdParam.ByteWrite.mByteBuffer[0]=2+0x30;
 mCmdParam.ByteWrite.mByteBuffer[1]=0+0x30; 
 mCmdParam.ByteWrite.mByteBuffer[2]=(convert_time(g8563_Store[6]))/10+0x30;
 mCmdParam.ByteWrite.mByteBuffer[3]=(convert_time(g8563_Store[6]))%10+0x30; 
 mCmdParam.ByteWrite.mByteBuffer[4]="年"[0];
 mCmdParam.ByteWrite.mByteBuffer[5]="年"[1];
 mCmdParam.ByteWrite.mByteCount=6;
 CH375ByteWrite();

 mCmdParam.ByteWrite.mByteBuffer[0]=(convert_time(g8563_Store[5]))/10+0x30;
 mCmdParam.ByteWrite.mByteBuffer[1]=(convert_time(g8563_Store[5]))%10+0x30; 
 mCmdParam.ByteWrite.mByteBuffer[2]="月"[0];
 mCmdParam.ByteWrite.mByteBuffer[3]="月"[1];
 mCmdParam.ByteWrite.mByteCount=4;
 CH375ByteWrite();

 mCmdParam.ByteWrite.mByteBuffer[0]=(convert_time(g8563_Store[3]))/10+0x30;
 mCmdParam.ByteWrite.mByteBuffer[1]=(convert_time(g8563_Store[3]))%10+0x30; 
 mCmdParam.ByteWrite.mByteBuffer[2]="日"[0];
 mCmdParam.ByteWrite.mByteBuffer[3]="日"[1];
 mCmdParam.ByteWrite.mByteCount=4;
 CH375ByteWrite();

 mCmdParam.ByteWrite.mByteBuffer[0]=(convert_time(g8563_Store[2]))/10+0x30;
 mCmdParam.ByteWrite.mByteBuffer[1]=(convert_time(g8563_Store[2]))%10+0x30; 
 mCmdParam.ByteWrite.mByteBuffer[2]="时"[0];
 mCmdParam.ByteWrite.mByteBuffer[3]="时"[1];
 mCmdParam.ByteWrite.mByteCount=4;
 CH375ByteWrite();

 mCmdParam.ByteWrite.mByteBuffer[0]=(convert_time(g8563_Store[1]))/10+0x30;
 mCmdParam.ByteWrite.mByteBuffer[1]=(convert_time(g8563_Store[1]))%10+0x30; 
 mCmdParam.ByteWrite.mByteBuffer[2]="分"[0];
 mCmdParam.ByteWrite.mByteBuffer[3]="分"[1];
 mCmdParam.ByteWrite.mByteCount=4;
 CH375ByteWrite();

 mCmdParam.ByteWrite.mByteBuffer[0]=(convert_time(g8563_Store[0]))/10+0x30;
 mCmdParam.ByteWrite.mByteBuffer[1]=(convert_time(g8563_Store[0]))%10+0x30; 
 mCmdParam.ByteWrite.mByteBuffer[2]="秒"[0];
 mCmdParam.ByteWrite.mByteBuffer[3]="秒"[1];
 mCmdParam.ByteWrite.mByteBuffer[4]=':';
 mCmdParam.ByteWrite.mByteBuffer[5]=' ';
 mCmdParam.ByteWrite.mByteCount=6;
 CH375ByteWrite();

 temprature=ReadTemperature();
 mCmdParam.ByteWrite.mByteBuffer[0]=temprature/1000+0x30;
 mCmdParam.ByteWrite.mByteBuffer[1]=(temprature/100)%10+0x30; 
 mCmdParam.ByteWrite.mByteBuffer[2]='.'; 
 mCmdParam.ByteWrite.mByteBuffer[3]=(temprature/10)%10+0x30; 
 mCmdParam.ByteWrite.mByteBuffer[4]=(temprature)%10+0x30;
 mCmdParam.ByteWrite.mByteBuffer[5]=0x0d;
 mCmdParam.ByteWrite.mByteBuffer[6]=0x0a;
 mCmdParam.ByteWrite.mByteCount=7;
 CH375ByteWrite();
}

#ifdef	NO_DEFAULT_CH375_INT			/* 自行编写中断处理程序,加上了超时处理,并且在等待中断的过程中可以做其它事 */
void xQueryInterrupt( void )			/* 查询CH375中断并更新中断状态,该程序基本框架可以参考CH375HF?.H文件 */
{
	UINT16	i;
	for ( i = 65535; i != 0; i -- ) {  /* 正常情况下该过程为几毫秒到几十毫秒,偶尔也会达到几百毫秒 */
		if ( CH375_INT_WIRE == 0 ) break;  /* 如果CH375的中断引脚输出低电平则说明CH375操作完成 */
/*		if ( ( CH375_CMD_PORT & 0x80 ) == 0 ) break;  对于CH375B芯片,也查询CH375B的命令端口的位7为0说明中断引脚输出低电平 */
		在等待CH375中断的过程中,可以做些需要及时处理的事情
	}
	if ( i == 0 ) CH375超时,通常是硬件问题;
	CH375_CMD_PORT = CMD_GET_STATUS;  /* 获取当前中断状态 */
	mDelay2uS( );  /* 操作无意义,用于至少延时2uS,可以用多个NOP空操作指令实现 */
	CH375IntStatus = CH375_DAT_PORT;  /* 获取中断状态 */
	if ( CH375IntStatus == USB_INT_DISCONNECT ) CH375DiskStatus = DISK_DISCONNECT;  /* 检测到USB设备断开事件 */
	else if ( CH375IntStatus == USB_INT_CONNECT ) CH375DiskStatus = DISK_CONNECT;  /* 检测到USB设备连接事件 */
}
#endif

/* 以毫秒为单位延时,不精确,适用于24MHz时钟 */
void	mDelaymS( UINT8 delay )
{
	unsigned char	i, j, c;
	for ( i = delay; i != 0; i -- ) {
		for ( j = 200; j != 0; j -- ) c += 3;  /* 在24MHz时钟下延时500uS */
		for ( j = 200; j != 0; j -- ) c += 3;  /* 在24MHz时钟下延时500uS */
	}
}

/* 将程序空间的字符串复制到内部RAM中,返回字符串长度 */
UINT8	mCopyCodeStringToIRAM( UINT8 idata *iDestination, UINT8 code *iSource )
{
	UINT8	i = 0;
	while ( *iDestination = *iSource ) {
		iDestination ++;
		iSource ++;
		i ++;
	}
	return( i );
}

/* 检查操作状态,如果错误则显示错误代码并停机 */
void	mStopIfError( UINT8 iError )
{
	if ( iError == ERR_SUCCESS ) return;  /* 操作成功 */
	printf( "Error: %02X\n", (UINT16)iError );  /* 显示错误 */
	while ( 1 ) {
		LED_UDISK_IN( );  /* LED闪烁 */
		mDelaymS( 100 );
		LED_UDISK_OUT( );
		mDelaymS( 100 );
	}
}

void host( ) {
	UINT32	i;

#if DISK_BASE_BUF_LEN == 0
	pDISK_BASE_BUF = &my_buffer[0];  /* 不在.H文件中定义CH375的专用缓冲区,而是用缓冲区指针指向其它应用程序的缓冲区便于合用以节约RAM */
#endif

	i = CH375LibInit( );  /* 初始化CH375程序库和CH375芯片,操作成功返回0 */
	mStopIfError( i );
	while ( 1 ) {
		printf( "Insert USB disk\n" );
		while ( CH375DiskStatus < DISK_CONNECT ) {  /* 等待U盘插入 */
			if ( IsKeyPress( ) ) {  /* 有键按下 */
				printf( "Exit USB host mode\n" );
				return;
			}
/*			if ( CH375_INT_WIRE == 0 ) xQueryInterrupt( );*/  /* 如果CH375中断,那么查询CH375中断并更新中断状态,可以改成中断方式 */
			mDelaymS( 100 );  /* 没必要频繁查询 */
			if ( CH375DiskConnect( ) == ERR_SUCCESS ) break;	/* 查询方式: 检查磁盘是否连接,返回成功说明连接 */
		}
		LED_UDISK_IN( );  /* LED亮 */
		mDelaymS( 250 );  /* 延时,可选操作,有的USB存储器需要几十毫秒的延时 */

/* 检查U盘是否准备好,但是某些U盘必须要执行这一步才能工作 */
		for ( i = 0; i < 5; i ++ ) {  /* 有的U盘总是返回未准备好,不过可以被忽略 */
			mDelaymS( 100 );
			printf( "Ready ?\n" );
//			if ( CH375DiskReady( ) == ERR_SUCCESS ) break;  /* 查询磁盘是否准备好,不支持CH375S,节约代码空间 */
			if ( CH375sDiskReady( ) == ERR_SUCCESS ) break;  /* 查询磁盘是否准备好,支持CH375S和CH375A,但占用更多的代码空间 */
		}

#if DISK_BASE_BUF_LEN
		if ( DISK_BASE_BUF_LEN < CH375vSectorSize ) {  /* 检查磁盘数据缓冲区是否足够大,CH375vSectorSize是U盘的实际扇区大小 */
			printf( "Too large sector size\n" );
			while ( CH375DiskConnect( ) == ERR_SUCCESS ) mDelaymS( 100 );
			continue;
		}
#endif

#ifdef EN_DISK_WRITE  /* 子程序库支持写操作 */
/* 产生新文件(覆盖原文件数据),关于向原有文件中添加数据的例子请参考EXAM7和EXAM8 */
		LED_WR_NOW( );  /* 写操作 */
		printf( "Create\n" );
		mCopyCodeStringToIRAM( mCmdParam.Create.mPathName, "/TIME.TXT" );  /* 新文件名,在根目录下,中文文件名 */
		i = CH375FileCreate( );  /* 新建文件并打开,如果文件已经存在则先删除后再新建 */
		mStopIfError( i );
		printf( "Write\n" );
        strcpy(mCmdParam.ByteWrite.mByteBuffer,"U盘实时温度记录器 开始记录......\xd\xa");

        mCmdParam.ByteWrite.mByteCount=34;
        CH375ByteWrite();

		while(P1&0x04)
		{
         P8563_Read();
		 time2string();
		 delay(50000);
		 }
        strcpy(mCmdParam.ByteWrite.mByteBuffer,"U盘实时温度记录器 记录完毕!!\xd\xa");

        mCmdParam.ByteWrite.mByteCount=32;
        CH375ByteWrite();       
		printf( "Close\n" );
		mCmdParam.Close.mUpdateLen = 1;  /* 自动计算文件长度,以字节为单位写文件,建议让程序库关闭文件以便自动更新文件长度 */
		i = CH375FileClose( );
		mStopIfError( i );
		LED_NOT_WR( );
#endif

		printf( "Take out USB disk\n" );
//		while ( CH375DiskStatus != DISK_DISCONNECT ) xQueryInterrupt( );  /* 查询CH375中断并更新中断状态,等待U盘拔出 */
		while ( CH375DiskStatus >= DISK_CONNECT ) {  /* 查询CH375中断并更新中断状态,等待U盘拔出 */
			if ( CH375DiskConnect( ) != ERR_SUCCESS ) break;
			mDelaymS( 100 );
		}
		LED_UDISK_OUT( );  /* LED灭 */
		mDelaymS( 100 );
	}
}

⌨️ 快捷键说明

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