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

📄 main.c

📁 Avr Atmeg128汽车行驶记录仪 带有USB驱动 c语言
💻 C
📖 第 1 页 / 共 4 页
字号:
							 Status1=131;
							 j=j-250;
							 Staut0|=(1<<3);
							}   
							 send_data();

							break;
					case 131:
							if((Staut0&0x08)!=0x08)
							  Status1=132;
                            break;
					case 132:
							if(j==0)
							  Status1=Status2;
							else
							 { if(j<=250)
								{	get_send(j);
							 		Status1=Status2;
							 		j=0; 
							 	}
			     		       else
								{	get_send(250);
							 		Status1=131;
							 		j=j-250;
							 		Staut0|=(1<<3);
								}   
							    send_data();
							 }
							break;
					case 0xc2:						// 
				   			break; 
					case 0xc3:						// 
				   			break;
					default:						//无此命令
							break;
				  }
		  }	 
	}
}

SIGNAL(SIG_UART0_RECV)								//串行口0接收数据中断
{ uchar i;
 i=UCSR0A;
  if( ( i &= 0X04 )==0)
    { 	Receive0[Receive0_lp]=UDR0;
  		Receive0_lp++;
 		if(Receive0_lp==2)
   		   if((Receive0[0]!=0xaa)||(Receive0[1]!=0x75))
		    { Receive0_lp=1;
			  Receive0[0]=Receive0[1];
             }
        if(Receive0_lp==5)
   		   Receive0_num=Receive0[3]*256+Receive0[4];
        if((Receive0_lp>=7)&&(Receive0_lp==Receive0_num+7))
		  { Staut0|=(1<<0);
		    UCSR0B =0X00;
		   } 
		else
		{ UCSR0B =0X90;
	      Staut0&=~(1<<0);
		}     	 
     }
   else
     {Staut0&=~(1<<0);
	  UCSR0B =0X48;
	  Send0[0]=0x05;
	  Send0[1]=0x55;
	  Send0[2]=0x7a;
	  Send0[3]=0xfa;
	  Send0[4]=0x00;
	  Send0[5]=0xd5;
	  Send0_lp=2;
	  UDR0=Send0[1];
	 }
}


SIGNAL(SIG_INPUT_CAPTURE1)							//捕捉输入1中断
{ uint i; 
  TCCR1B=0X80;
   if(speed_cap==1)
    {tmp=(UINT32)ICR1;
	 tmp+=speed_cn*65536;
	 tmp=tmp*tzxs;
	 i=(UINT16)(Total_t/(UINT64)tmp);
	 speed=(UINT8)(i/10);
	// speed_dot=(UINT16)(Total_t*10/(UINT64)tmp);
    speed_dot=(UINT8)(i%10);
	}
 TCNT1=0x0000;
 TCCR1B=0X81;
 speed_cap=1;
 speed_cn=0;
 TCCR1A=0;
 
 TCCR1C=0;
 TIMSK=0X24;
 ETIMSK=0X00;
 TIFR=0X00;
 ETIFR=0X00;
 
}

SIGNAL(SIG_OVERFLOW1)								//定时器1中断
{ 
  if(speed_cn<175)
  	speed_cn++;
  else
  	{speed=0;
	 speed_cap=0;}
}

SIGNAL(SIG_UART0_TRANS)								//串行口0发送数据中断
{//uchar *p1;
 //uint i;
// if(Status2==0)
  if(Send0_lp<=Send0[0])
   		{  UDR0=Send0[Send0_lp];
      		Send0_lp++;
    	}
  	else
    	{	UCSR0B =0X90;
	 		Receive0_lp=0;
	 		Staut0&=~(1<<0);
			Staut0&=~(1<<3);
		}
  
}

SIGNAL (SIG_INTERRUPT6)								//INT6中断SIGNAL
/*{ uchar i;
	i=PIND&0XE0;
 sei();
 FM_CS;
 CLOCK_RTIME();
 DelayMs(30);
 PORTD=PORTD&0X1F;
 PORTD!=i;
}*/
{	uchar	*p1,*p2,*p4;
//	uint  *p5;
	uchar i,i1;
	uint j;
	i1=PORTD;		//   PIND&0XE0;
	sei();
 	jsq1++;
	jsq2++;
	FM_CS;
	if(jsq1==4)
		{jsq1=0;
		// p3=;
		// p1=;
		 if(rt_index_buf1==0)
		 	{ CLOCK_RTIME();
		      p4=&SYS_Time[0];
//			  j=;
		      p2=Now_Buf+rt_index_buf*24;//
		 	  for(i=0;i<6;i++)
		    	{	*p2=*p4;
		      		p2++;
		      		p4++;}
			}
         p2= Now_Buf+6+rt_index_buf*24+rt_index_buf1*2;
//		 j=+j;
//		 pk=pk+j;
		 *p2=speed;
		 *(p2+1)=io_v;
		 rt_index_buf1++;
		 if(rt_index_buf1>=8)
		   rt_index_buf1=0;
	     }
	if(jsq2==32)
		{	jsq2=0;
		 // 	p1=rt_index_buf;
		 	p2=Now_Buf+rt_index_buf*24+22;
		 	*p2=acc_x;
		 	*(p2+1)=acc_y;
		 	rt_index_buf++;
		 	if(rt_index_buf>=20)
		 		rt_index_buf=0;
         	//p5=;
		 	minmileage+=speed;
			if(speed>3)
			 {Status_run|=0x01;						//置目前运行状态=1
			 }
            else
			 {Status_run&=0xfe;						//清目前运行状态=0
			 }
			if((Status_run&0x03)==0x01)				//汽车刚起步
			  {if(startmon==0x01)
			    {if(((Status_run&0x04)==0x04)||(judgestoptime() == 0x01))	//驾驶员改变或停车时间超过20分钟
			     {if (judgedrvtime() == 0x01)     	//若行车超过3小时
                        {
                            storecondrvdata();
                        }
				  startmon=0x01;
				  Status_run&=0xfb;
				  p1=Begin_time;
				  p2=&SYS_Time[0];	
				  for (i=0; i<5; i++)
                        {
                            *p1=*p2;
							p1++;
							p2++;
                        }
                  }
                 }
				else
				 {startmon=0x01;
				  p1=Begin_time;
				  p2=&SYS_Time[0];	
				  for (i=0; i<5; i++)
                        {
                            *p1=*p2;
							p1++;
							p2++;
                        }
				 }
				 
				 
			  }
			else if((Status_run&0x03)==0x02)		//汽车刚停车
			  {	storestopdata();  
			  	p1=Stop_time;
				p2=&SYS_Time[0];	
				for (i=0; i<5; i++)
                        {
                            *p1=*p2;
							p1++;
							p2++;
                        }          
			  }
         if((Status_run&0x01)==0x01)
		    Status_run|=0x02;
         else
		    Status_run&=0xfd;
         if(SYS_Time[5]==0x59)
			{ minspeed = minmileage / 60;
              minmileage = minmileage / 360;
			  p1 = D360_Buf1 + d360_index_buf1 * 25;
			  p2=Driver_now__Buf + 1;
			  for(i=0;i<3;i++)
	  			{*p1 = *p2;
	    		 p1++;
				 p2++;
	  			}
			  p2=&SYS_Time[0];
			  for (i=0; i<5; i++)
                        {
                            *p1=*p2;
							p1++;
							p2++;
                        }
			  *p1=minspeed;
			  *(p1+1)=minmileage;
			  *(p1+2)=io_v;
			  *(p1+3)=acc_x;
			  *(p1+4)=acc_y; 
			  p2=&GPS_I[0];
			  p1=p1+5;
			  for (i=0; i<8; i++)
                        {
                            *p1=*p2;
							p1++;
							p2++;
                        } 
			  d360_index_buf1++;
			  if(d360_index_buf1>=20)  
			    {d360_index_buf1=0;
				 d360_save_flag1= NEEDSAVE;
				 minproc(); 
				  minmileage = 0;  
				}
                      //每分钟数据处理,里程时速刷新
           //   if (fmileageacc == TRUE)
                // {
             //        denmileage += minmileage;      //计算累加里程,单位0.1km
               //   }
              minmileage = 0;
			}
		 }
  // PORTD=PORTD&0X1F;
   PORTD=i1;

}


void Usb_Read()
{
	uchar i,j;
	uchar *DP;
	uint TotalCount;
	DP = Driver_now__Buf;
	Usb_InitZX();
	i = CH375LibInit( );  /* 初始化CH375程序库和CH375芯片,操作成功返回0 */
	mStopIfError( i );
	while (1){
	//------------------------------------------------
	//	if ( CH375DiskStatus != DISK_CONNECT ) 
	//	{
	//		Disp_pwm();
	//		LCD_INT();
	//		CLEAR();
	//		DelayMs(2000);
	//		Dis_Pin = 52;
	//		Xs();
	//	}
	//	Usb_InitZX();
	//	i = CH375LibInit( ); 
		while ( CH375DiskStatus < DISK_CONNECT ) {  /* 查询CH375中断并更新中断状态,等待U盘插入 */
			if ( CH375DiskConnect( ) == ERR_SUCCESS ) break;  /* 有设备连接则返回成功,CH375DiskConnect同时会更新全局变量CH375DiskStatus */
			mDelaymS(5);//100 );
		}	
		mDelaymS(10); //200 );  /* 延时,可选操作,有的USB存储器需要几十毫秒的延时 */
//		for ( i = 0; i < 10; i ++ ) {  /* 有的U盘总是返回未准备好,不过可以被忽略 */
//			mDelaymS(5); //100 );
//			printf( "Ready ?\n" );
//			if ( CH375DiskReady( ) == ERR_SUCCESS ) break;  /* 查询磁盘是否准备好 */
//		}
		strcpy( (char *)mCmdParam.Open.mPathName, "\\C51\\CH375HFT.C" );  /* 文件名,该文件在C51子目录下 */
		i = CH375FileOpen( );  /* 打开文件 */
		if ( i == ERR_MISS_DIR || i == ERR_MISS_FILE ) {  /* 没有找到文件 */
/* 列出文件 */
			if ( i == ERR_MISS_DIR ) pCodeStr = (UINT8 *)"/*";  /* C51子目录不存在则列出根目录下的文件 */
			else pCodeStr = (UINT8 *)"/C51/CH375*";  /* CH375HFT.C文件不存在则列出\C51子目录下的以CH375开头的文件 */
//			printf( "List file %s\n", pCodeStr );
			for ( c = 0; c < 254; c ++ ) {  /* 最多搜索前254个文件 */
				strcpy( (char *)mCmdParam.Open.mPathName, (char *)pCodeStr );  /* 搜索文件名,*为通配符,适用于所有文件或者子目录 */
				i = strlen( (char *)mCmdParam.Open.mPathName );  /* 计算文件名长度,以处理文件名结束符 */
				mCmdParam.Open.mPathName[ i ] = c;  /* 根据字符串长度将结束符替换为搜索的序号,从0到255 */
				i = CH375FileOpen( );  /* 打开文件,如果文件名中含有通配符*,则为搜索文件而不打开 */
				if ( i == ERR_MISS_FILE ) break;  /* 再也搜索不到匹配的文件,已经没有匹配的文件名 */
				if ( i == ERR_FOUND_NAME ) {  /* 搜索到与通配符相匹配的文件名,文件名及其完整路径在命令缓冲区中 */
//					printf( "  match file %03d#: %s\n", (unsigned int)c, mCmdParam.Open.mPathName );  /* 显示序号和搜索到的匹配文件名或者子目录名 */
					continue;  /* 继续搜索下一个匹配的文件名,下次搜索时序号会加1 */
				}
				else {  /* 出错 */
					mStopIfError( i );
					break;
				}
			}
		}
		else 
		{  /* 找到文件或者出错 */
			mStopIfError( i );
			TotalCount = 100;  /* 准备读取总长度 */
			while ( TotalCount ) 
			{  /* 如果文件比较大,一次读不完,可以再调用CH375ByteRead继续读取,文件指针自动向后移动 */
				if ( TotalCount > MAX_BYTE_IO ) c = MAX_BYTE_IO;  /* 剩余数据较多,限制单次读写的长度不能超过 sizeof( mCmdParam.ByteRead.mByteBuffer ) */
				else c = TotalCount;  /* 最后剩余的字节数 */
				mCmdParam.ByteRead.mByteCount = c;  /* 请求读出几十字节数据 */
				i = CH375ByteRead( );  /* 以字节为单位读取数据块,单次读写的长度不能超过MAX_BYTE_IO,第二次调用时接着刚才的向后读 */
				mStopIfError( i );
				TotalCount -= mCmdParam.ByteRead.mByteCount;  /* 计数,减去当前实际已经读出的字符数 */
				for ( i=0; i!=mCmdParam.ByteRead.mByteCount; i++ )
				{
					 //FIRST[i] = mCmdParam.ByteRead.mByteBuffer[i];
					 FM_CS;
					 *(DP+i) = mCmdParam.ByteRead.mByteBuffer[i];
				}
				if ( mCmdParam.ByteRead.mByteCount < c ) {  /* 实际读出的字符数少于要求读出的字符数,说明已经到文件的结尾 */
//					printf( "\n" );
//					printf( "文件已经结束\n" );
					break;
				}
			}
			i = CH375FileClose( );  /* 关闭文件 */
			mStopIfError( i );
			j = i;
		}
		if(j == 0)break;
	}
}
//---------------------------------------------
void Usb_Write()
{
	uchar i,j,c,flg;
	uint a,b,sum = 2;//1080	;
	Usb_InitZX();
	i = CH375LibInit( );  /* 初始化CH375程序库和CH375芯片,操作成功返回0 */	
	//------------------------------------------------
//		while ( CH375DiskStatus != DISK_CONNECT ) 
//		{
//			Dis_Pin = 52;
//			Xs();
//		}
		while ( CH375DiskStatus < DISK_CONNECT ) {  /* 查询CH375中断并更新中断状态,等待U盘插入 */
			if ( CH375DiskConnect( ) == ERR_SUCCESS ) break;  /* 有设备连接则返回成功,CH375DiskConnect同时会更新全局变量CH375DiskStatus */
			mDelaymS(5);//100 );
		}	
		mDelaymS(10); //200 );  /* 延时,可选操作,有的USB存储器需要几十毫秒的延时 */
		for ( i = 0; i < 10; i ++ ) {  /* 有的U盘总是返回未准备好,不过可以被忽略 */
			mDelaymS(5); //100 );
			if ( CH375DiskReady( ) == ERR_SUCCESS ) break;  /* 查询磁盘是否准备好 */
		}
	//--------------------------------------------------------------------
		strcpy( (char *)mCmdParam.Create.mPathName, "\\SUZHOU.TXT" );  /* 新文件名,在根目录下,中文文件名 */
		i = CH375FileCreate( );  /* 新建文件并打开,如果文件已经存在则先删除后再新建 */
		mStopIfError( i );
		pCodeStr = com1subbuf;//(UINT8 *)"Note: \xd\xa这个程序是以字节为单位进行U盘文件读写,单片机只需要有600字节的RAM\xd\xa";
		while( 1 ) {  /* 分多次写入文件数据 */
			for(a = 0;a<sum;a++)
			{
				pCodeStr = com1subbuf;
				FM_CS;
				LoadPage(a,pCodeStr,500);				
				for(b = 0;b<10;b++)	
				{
					for ( i=0; i<50; i++ ) 
					{						
						c = *pCodeStr;
						mCmdParam.ByteWrite.mByteBuffer[i] = c;
						pCodeStr++;
					}
					Usb_InitZX();
					mCmdParam.ByteWrite.mByteCount = 50;//i;  /* 写入数据的字符数,单次读写的长度不能超过MAX_BYTE_IO,第二次调用时接着刚才的向后写 */
					flg = CH375ByteWrite( );  /* 向文件写入数据 */
					mStopIfError( flg );
				}
			}
			break;
		}
		mCmdParam.Close.mUpdateLen = 1;  /* 自动计算文件长度,以字节为单位写文件,建议让程序库关闭文件以便自动更新文件长度 */
		i = CH375FileClose( );
		mStopIfError( i );
//		while ( CH375DiskStatus != DISK_DISCONNECT ) xQueryInterrupt( );  /* 查询CH375中断并更新中断状态,等待U盘拔出 */
		while ( CH375DiskStatus >= DISK_CONNECT ) 
		{  /* 查询CH375中断并更新中断状态,等待U盘拔出 */
			Dis_Pin = 53;
			Xs();
			if ( CH375DiskConnect( ) != ERR_SUCCESS ) break;
			mDelaymS( 100 );
		}
		mDelaymS( 200 );
/*		i = FILE_DATA_BUF[0];  因为是以字节为单位读写文件,未用到文件数据缓冲区,为了防止编译器优化掉该缓冲区而用一下缓冲区 */
}



⌨️ 快捷键说明

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