找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 562|回复: 0
收起左侧

STM32F030+SD2405+24C08+SD卡

[复制链接]
ID:35191 发表于 2023-7-20 20:51 | 显示全部楼层 |阅读模式
  1. #include "my.h"
  2. #include "24C08.h"
  3. #include "SD2405.h"
  4. #include "led.h"

  5. FRESULT write_TF(FIL fsr,char *namebuf,uint8_t *databuf,uint32_t len,uint16_t lseek,uint8_t location)
  6. {
  7.                   
  8.         FRESULT res1;
  9.   UINT bw;       
  10.        
  11.         res1=f_open(&fsr,namebuf,FA_OPEN_ALWAYS | FA_WRITE);
  12.         switch (location)
  13.         {                               
  14.                 case 0 ://指定位置
  15.                         res1=f_lseek(&fsr,lseek);
  16.                         break;
  17.                 case 1 :        //从头
  18.                   break;
  19.                 case 2 :        //至尾
  20.                         res1=f_lseek(&fsr,fsr.fsize);
  21.                   break;
  22.     default:
  23.                   break;
  24.         }
  25.         res1 = f_write(&fsr,databuf,len,&bw);
  26.   res1 = f_close(&fsr);

  27.         return res1;
  28. }

  29. uint32_t FileSize;
  30. FRESULT read_TF(FIL fsr,char *namebuf,uint8_t *databuf,uint32_t len,uint16_t lseek,uint8_t location)
  31. {
  32.           
  33.         uint32_t Datalen;
  34.         FRESULT res1;
  35.   UINT br;       
  36.        
  37.         res1=f_open(&fsr,namebuf,FA_READ);
  38.         FileSize=f_size(&fsr);
  39.         switch (location)
  40.         {                               
  41.                 case 0 :        //指定位置
  42.                         res1=f_lseek(&fsr,lseek);
  43.                         break;
  44.                 case 1 :        //从头
  45.                   break;
  46.                 case 2 :          //至尾
  47.                         res1=f_lseek(&fsr,fsr.fsize);
  48.                   break;
  49.     default:
  50.                   break;
  51.         }
  52.         if(len==0)
  53.     Datalen=FileSize;       
  54.         else
  55.                 Datalen=len;
  56.        
  57.         res1 = f_read(&fsr,databuf,Datalen,&br);
  58.   res1 = f_close(&fsr);

  59.         return res1;
  60. }


  61. ///////////////////////////////////////////////////////////////
  62. //channel=0:串口1,time15定时时间
  63. //channel=1:串口2,time16定时时间
  64. //channel=2:深度数据,浅-米
  65. //channel=3:深度数据,深-米

  66. extern uint32_t Time_PT[2];
  67. extern uint32_t Work_Time[4];
  68. uint16_t usart_readtime(uint8_t channel,uint8_t *buf)
  69. {
  70.         uint8_t i;
  71.         uint16_t data;
  72.         uint32_t sum;
  73.         uint16_t temp;
  74.        
  75.         if(channel<2)       
  76.         {       
  77.                 sum=(buf[4*channel+0]*60*60+buf[4*channel+1]*60+buf[4*channel+2])*1000+buf[4*channel+3]*10;
  78.                 if(sum>10)
  79.                 {       
  80.                         Time_PT[channel]=sum/10;
  81.                         data=10;               
  82.                 }
  83.                 else
  84.                 {       
  85.                         data=sum;
  86.                 }       
  87.         }
  88.         else if(2<=channel && channel<=3)
  89.         {
  90.                 temp=(buf[2*(channel-2)+8]<<8) + buf[2*(channel-2)+9];                               
  91.                 data=temp;
  92.         }
  93.         else if(channel>3)
  94.         {
  95.                 channel=4;
  96.                 for(i=0;i<2;i++)
  97.                 {
  98.                         Work_Time[2*(channel+i-4)]=buf[4*(channel+i-1)]*100+buf[4*(channel+i-1)+1]; //12,13   16,17
  99.                         Work_Time[2*(channel+i-4)+1]=buf[4*(channel+i-1)+2]*100+buf[4*(channel+i-1)+3];//14,15   18,19
  100.                 }
  101.                 data=0;
  102.         }       
  103.         return data;                               
  104. }



  105. extern int32_t depth_data; //厘米的深度数据,除以100是米,除以10000是mpa。       
  106. extern int16_t depth_temp; //水温数据,3位小数点,单位℃。


  107. //出口:depth_temp  = 水温数据
  108. //      depth_data  = 压力数据       
  109. void temper_dep(uint8_t *databuf)
  110. {
  111.   uint8_t state2;
  112.         uint8_t c2;
  113.         uint8_t buf[8];
  114.        
  115.         signed long L32;
  116.        
  117.   
  118.         //2-18的数字取出并累加
  119.         state2=0;
  120.         for(c2=2;c2<USART1_RX_MAX-3;c2++)
  121.         {
  122.                 state2 = state2 + (databuf[c2]-48);//0x30
  123.         }
  124.        
  125.         //接收的累加和
  126.         buf[0]= databuf[USART1_RX_MAX-3]-48;//百位
  127.         buf[1]= databuf[USART1_RX_MAX-2]-48;//十位
  128.         buf[2]= databuf[USART1_RX_MAX-1]-48;//个位
  129.         c2=(buf[0]*100)+(buf[1]*10)+buf[2];

  130.         if(state2==c2)
  131.         {
  132.                 //与接收的ASCII累加和相等
  133.                 //取出地址
  134.                 buf[0]= databuf[2]-48;//地址十位
  135.                 buf[1]= databuf[3]-48;//地址个位
  136.                 buf[2]= buf[0]*10+buf[1];
  137.                 if(buf[2]==DEPTH_TEMP_ADD)//地址=1
  138.                 {
  139.                         //取出压力值和标志
  140.                         state2 = databuf[4]-48;//取出压力正负标志
  141.                        
  142.                         buf[0]=databuf[5]-48;//压力千位
  143.                         buf[1]=databuf[6]-48;//压力百位
  144.                         buf[2]=databuf[7]-48;//压力十位
  145.                         buf[3]=databuf[8]-48;//压力个位
  146.                         buf[4]=databuf[9]-48; //小数1位
  147.                         buf[5]=databuf[10]-48;//小数2位
  148.                         buf[6]=databuf[11]-48;//小数3位
  149.                         buf[7]=databuf[12]-48;//小数4位
  150.                        
  151.                         L32 = (long)((buf[0]*10000000)+(buf[1]*1000000)+(buf[2]*100000)
  152.                                 +(buf[3]*10000)+(buf[4]*1000)+(buf[5]*100)+(buf[6]*10)+buf[7]);
  153.                        
  154.                                
  155.                         depth_data=L32;         //压力数据       
  156.                         if(state2==1)//压力正负标志,00=正数,01=负数       
  157.                         {
  158.                                 depth_data = ~depth_data+1;//转换为负数
  159.                         }

  160.                         //取出温度值和标志
  161.                         state2 = databuf[13]-48;//取出温度正负标志
  162.                                                        
  163.                         buf[0]=databuf[14]-48;//温度十位
  164.                         buf[1]=databuf[15]-48;//温度个位
  165.                         buf[2]=databuf[16]-48;//温度小数1
  166.                         buf[3]=databuf[17]-48;//温度小数2
  167.                         buf[4]=databuf[18]-48;//温度小数3
  168.                        
  169.                         L32 = (long)((buf[0]*10000)+(buf[1]*1000)+(buf[2]*100)+(buf[3]*10)+buf[4]);
  170.                        
  171.                         depth_temp = L32;
  172.                         if(state2==1)//水温度正负标志,00=正数,01=负数       
  173.                         {
  174.                                 depth_temp = ~depth_temp+1;//转换为负数
  175.                         }               
  176.                 }       
  177.         }
  178. }



  179. FRESULT storage(FIL fsr,Time_Def *timebuf,uint8_t channel)
  180. {
  181.         FRESULT res1;
  182.         uint8_t databuf[12];
  183.         char filebuf[13];
  184.        
  185.   //RTC_GetRTCTime(timebuf);
  186.         RTC_ReadDate(timebuf);

  187.         if(channel==0)
  188.         {
  189.                 filebuf[0]=timebuf->Year/16+48;
  190.                 filebuf[1]=timebuf->Year%16+48;
  191.                 filebuf[2]=timebuf->Month/16+48;
  192.                 filebuf[3]=timebuf->Month%16+48;
  193.                 filebuf[4]=timebuf->Day/16+48;
  194.                 filebuf[5]=timebuf->Day%16+48;
  195.                 filebuf[6]=timebuf->Hour/16+48;
  196.                 filebuf[7]=timebuf->Hour%16+48;
  197.                 filebuf[8]='.';
  198.                 filebuf[9]='t';
  199.                 filebuf[10]='x';
  200.                 filebuf[11]='t';
  201.                 filebuf[12]='\0';
  202.                
  203.                 databuf[0]=0Xff;
  204.                 databuf[1]=0Xfa;
  205.                 databuf[2]=timebuf->Minute;
  206.                 databuf[3]=timebuf->Second;
  207.                
  208.                 databuf[4]=depth_data >> 24;
  209.                 databuf[5]=depth_data >> 16;
  210.                 databuf[6]=depth_data>> 8;
  211.                 databuf[7]=depth_data;
  212.                 databuf[8]=depth_temp>> 8;
  213.                 databuf[9]=depth_temp;

  214.                 databuf[10]=0Xfa;
  215.                 databuf[11]=0Xff;
  216.                        
  217.                 res1=write_TF(fsr,filebuf,databuf,12,0,2);
  218.         }
  219.         if(channel==1)
  220.         {
  221.         }       
  222.         return res1;
  223. }


  224. extern uint8_t Wrong_buf[5];
  225. void Modbus_0X10_EEPROM(uint8_t *buf,uint16_t len)
  226. {
  227.         uint8_t i;
  228.         uint8_t databuf1[20];
  229.         uint8_t databuf2[20];
  230.        
  231.         for(i=0;i<6;i++)
  232.                 databuf2[i]=buf[i];
  233.         CrcCheck(databuf2,6);       
  234.        
  235.         if(buf[2]==0)               
  236.         {       
  237.                 for(i=0;i<buf[6];i++)
  238.                  databuf1[i]=buf[i+7];
  239.                
  240.                 EEPROM_Write(buf[3],databuf1,buf[6]);       
  241.                 USART_SendBuffDat(USART4,databuf2,8);        
  242.         }
  243.         else
  244.         {
  245.                 if(buf[5]==3 && buf[6]==6)
  246.                 {
  247.                         time_init.Year=buf[7];
  248.                         time_init.Month=buf[8];
  249.                         time_init.Day=buf[9];
  250.                         time_init.Week=0x01;
  251.                         time_init.Hour=buf[10];
  252.                         time_init.Minute=buf[11];
  253.                         time_init.Second=buf[12];
  254.                        
  255.                         RTC_WriteDate(&time_init);
  256.                        
  257.                         USART_SendBuffDat(USART4,databuf2,8);                        
  258.                 }
  259.                 else
  260.                 {  
  261.                         USART_SendBuffDat(USART4,Wrong_buf,sizeof(Wrong_buf));   
  262.                 }
  263.         }       
  264. }

  265. void Modbus_0X03_EEPROM(uint8_t *buf,uint16_t len)
  266. {
  267.         uint8_t i;
  268.         uint8_t databuf1[20];
  269.         uint8_t databuf2[20];
  270.        
  271.         databuf2[0]=buf[0];
  272.         databuf2[1]=buf[1];
  273.         databuf2[2]=buf[5]*2;
  274.        
  275.         if(buf[2]==0)               
  276.         {       
  277.                 EEPROM_Read(buf[3],databuf1,buf[5]*2);
  278.                 //delay_ms(10);       
  279.           for(i=0;i<buf[5]*2;i++)
  280.                         databuf2[3+i]=databuf1[i];
  281.                
  282.                 CrcCheck(databuf2,buf[5]*2+3);               
  283.           USART_SendBuffDat(USART4,databuf2,buf[5]*2+5);                 
  284.         }       
  285.         else
  286.         {
  287.     if(buf[5]*2==6)
  288.                 {       
  289.                         RTC_ReadDate(&sysTime);

  290.                         databuf1[0]=sysTime.Year;
  291.                         databuf1[1]=sysTime.Month;
  292.                         databuf1[2]=sysTime.Day;
  293.                         databuf1[3]=sysTime.Hour;
  294.                         databuf1[4]=sysTime.Minute;
  295.                         databuf1[5]=sysTime.Second;
  296.                        
  297.                         for(i=0;i<buf[5]*2;i++)
  298.                           databuf2[3+i]=databuf1[i];
  299.                        
  300.                   CrcCheck(databuf2,buf[5]*2+3);                       
  301.             USART_SendBuffDat(USART4,databuf2,buf[5]*2+5);                 
  302.                 }
  303.                 else
  304.                 {
  305.                         USART_SendBuffDat(USART4,Wrong_buf,sizeof(Wrong_buf));   
  306.                 }       

  307.         }                 
  308. }

  309. extern uint8_t BD_SendBuf[UART_BUFF_MAX_SIZE];
  310. extern uint8_t Right_buf[5];
  311. extern uint8_t Wrong_buf[5];
  312. uint8_t BD_Return(char *buf,uint16_t len)
  313. {
  314.        
  315.         uint8_t i;       
  316.        
  317.         if(buf[0]=='


  318. 仅供参考: 代码.7z (664 KB, 下载次数: 8)
  319. && buf[59]=='\r' && buf[60]=='\n')//$DWXX,21/12/09,04:59:29,121.532003,E,31.079860,N,24,8,0.00\r\n
  320.         {
  321.                
  322.                 time_init.Year=(buf[6]-48)*16+(buf[7]-48);
  323.                 time_init.Month=(buf[9]-48)*16+(buf[10]-48);
  324.                 time_init.Day=(buf[12]-48)*16+(buf[13]-48);
  325.                 time_init.Week=0x01;
  326.                 time_init.Hour=(buf[15]-48)*16+(buf[16]-48);
  327.                 time_init.Minute=(buf[18]-48)*16+(buf[19]-48);
  328.                 time_init.Second=(buf[21]-48)*16+(buf[22]-48);               
  329.                 RTC_WriteDate(&time_init);
  330.        
  331.                 BD_SendBuf[8]=0x22;
  332.                 for(i=0;i<len-6;i++)
  333.                   BD_SendBuf[9+i]=buf[i];
  334.                
  335.                 BD_SendBuf[9+len-6]=0x22;
  336.                 BD_SendBuf[9+len-5]=0x0D;
  337.                 BD_SendBuf[9+len-4]=0x0A;
  338.                 delay_ms(50);
  339.                 USART_SendBuffDat(USART2,BD_SendBuf,len+12-6);  //AT+SEND="$DWXX,21/12/09,04:59:29,121.532003,E,31.079860,N,24,8,0.00"\r\n       
  340.                 USART_SendBuffDat(USART4,Right_buf,sizeof(Right_buf));               
  341.                 return 0;       
  342.         }
  343.        
  344.         else if(!strncmp(buf,"NO EFFECTIVE LOCATION INFORMATION",len))
  345.         {
  346.                 USART_SendBuffDat(USART4,Wrong_buf,sizeof(Wrong_buf));                
  347.     return 1;
  348.         }               
  349.         else if(!strncmp(buf,"OK",len))
  350.         {
  351.                 USART_SendBuffDat(USART4,Right_buf,sizeof(Right_buf));
  352.           return 2;       
  353.         }
  354.         else
  355.         {
  356.                 USART_SendBuffDat(USART4,Wrong_buf,sizeof(Wrong_buf));                
  357.                 return 3;       
  358.         }
  359. }


  360. extern uint32_t Time_PT[2];
  361. extern uint32_t Time15_tag;
  362. extern uint32_t Time16_tag;
  363. extern uint8_t BD_Work_Flag;

  364. void Sensor_BD_Power(uint32_t *buf)
  365. {
  366.         if(Time_PT[0]>(buf[0]+buf[1]))
  367.         {
  368.                 if(Time15_tag>(Time_PT[0]-buf[0]) || Time15_tag<buf[1])
  369.       SENSOR_ON;
  370.                 else
  371.                         SENSOR_OFF;
  372.         }
  373.         else
  374.             SENSOR_ON;       

  375.        
  376.         if(BD_Work_Flag)
  377.                 if(Time_PT[1]>(buf[2]+buf[3]))
  378.                 {
  379.                         if(Time16_tag>(Time_PT[1]-buf[2]) || Time16_tag<buf[3])
  380.                                 BD_ON;
  381.                         else
  382.                                 BD_OFF;
  383.                 }
  384.                 else
  385.                          BD_ON;       
  386.    else
  387.                         BD_OFF;               
  388. }

  389. extern uint8_t tebuf[LOAD_LEN_MAX];
  390. void Data_load(FIL fsr,uint8_t *buf,uint32_t len)
  391. {
  392.         uint8_t NoData_buf[8]={0xBB,0xAA,0x23,0x04,0x23,0x13,0xDD,0xCC};
  393.         uint8_t load_buf[LOAD_LEN_MAX];
  394.         FRESULT res1;
  395.         char filebuf[13];
  396.         uint8_t hour;
  397.         uint8_t temp;
  398.         uint32_t i,j;
  399.        
  400.         hour=buf[6]/16*10+buf[6]%16;
  401.         temp=hour;
  402.         for(i=0;i<len-2;i++)
  403.                 tebuf[i]=buf[i];
  404.        
  405.         for(i=0;i<24-temp;i++)
  406.         {       
  407.           
  408.                 filebuf[0]=buf[3]/16+48;//年
  409.                 filebuf[1]=buf[3]%16+48;
  410.                 filebuf[2]=buf[4]/16+48;//月
  411.                 filebuf[3]=buf[4]%16+48;
  412.                 filebuf[4]=buf[5]/16+48;//日
  413.                 filebuf[5]=buf[5]%16+48;
  414.                 filebuf[6]= hour/10+48;//时
  415.                 filebuf[7]= hour%10+48;
  416.                 filebuf[8]='.';
  417.                 filebuf[9]='t';
  418.                 filebuf[10]='x';
  419.                 filebuf[11]='t';
  420.                 filebuf[12]='\0';

  421.                 res1=read_TF(fsr,filebuf,load_buf,0,0,1);
  422.                 tebuf[2]=FileSize+8;
  423.                 tebuf[6]=hour/10*16+hour%10;
  424.                 tebuf[9]=1+i;
  425.                 tebuf[10]=1;
  426.                 for(j=0;j<FileSize;j++)
  427.                         tebuf[11+j]=load_buf[j];
  428.                        
  429.                 tebuf[FileSize+11]=0xCC;
  430.                 tebuf[FileSize+12]=0xDD;
  431.                
  432.                 if(res1==0)
  433.                         USART_SendBuffDat(USART4,tebuf,FileSize+13);
  434.                 else
  435.                 {
  436.                         for(j=0;j<4;j++)
  437.               NoData_buf[2+j]=buf[3+j];
  438.                         NoData_buf[5]=hour/10*16+hour%10;
  439.                         USART_SendBuffDat(USART4,NoData_buf,sizeof(NoData_buf));       

  440.                 }
  441.                  hour++;
  442.         }  
  443.                
  444. }

复制代码



仅供参考:
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表