STM32F407内存卡存储DS18B20温度数据

3 篇文章 1 订阅

https://download.csdn.net/download/qq_36958104/12880973

工程文件

 



//挂载FLASH.	
	if(res==0X0D)//FLASH磁盘,FAT文件系统错误,重新格式化FLASH
	{
		LCD_ShowString(30,150,200,16,16,"Flash Disk Formatting...");	//格式化FLASH
		res=f_mkfs("1:",1,4096);//格式化FLASH,1,盘符;1,不需要引导区,8个扇区为1个簇
		if(res==0)
		{
			f_setlabel((const TCHAR *)"1:ALIENTEK");	//设置Flash磁盘的名字为:ALIENTEK
			LCD_ShowString(30,150,200,16,16,"Flash Disk Format Finish");	//格式化完成
		}else LCD_ShowString(30,150,200,16,16,"Flash Disk Format Error ");	//格式化失败
		delay_ms(1000);
	}													    
	LCD_Fill(30,150,240,150+16,WHITE);		//清除显示			  
	while(exf_getfree("0",&total,&free))	//得到SD卡的总容量和剩余容量
	{
		LCD_ShowString(30,150,200,16,16,"SD Card Fatfs Error!");
		delay_ms(200);
		LCD_Fill(30,150,240,150+16,WHITE);	//清除显示			  
		delay_ms(200);
		LED0=!LED0;//DS0闪烁
	}													  			    
 	POINT_COLOR=BLUE;//设置字体为蓝色	   
	LCD_ShowString(30,150,200,16,16,"FATFS OK!");	 
	LCD_ShowString(30,170,200,16,16,"SD Total Size:     MB");	 
	LCD_ShowString(30,190,200,16,16,"SD  Free Size:     MB"); 	    
 	LCD_ShowNum(30+8*14,170,total>>10,5,16);				//显示SD卡总容量 MB
 	LCD_ShowNum(30+8*14,190,free>>10,5,16);					//显示SD卡剩余容量 MB	
#if 0   //初始化  创建文件	
				 //     /* 打开文件 */
		res=f_open(&fsrc, (const TCHAR*)filename, FA_CREATE_ALWAYS | FA_WRITE);			
		/* 将缓冲区的数据写到文件中 */		
		     /* f_write函数:向文件中写入数据
        fp:文件指针
        write_buf:要写入文件的数据
        第三个参数:写入多少个字节
        第四个参数:指针,返回已经写入到文件的字节数
        */
		res = f_write(&fsrc, wtext1, sizeof(wtext1), &bw);     
		    /* f_close:关闭文件,使用f_open必须使用f_close,不然会有缓存
        fp:文件指针
        */
		 //     /* 打开文件 */
		f_close(&fsrc);                         //关闭文件 	
		#endif	
		 	while(DS18B20_Init())	//DS18B20初始化	
	{
		LCD_ShowString(30,130,200,16,16,"DS18B20 Error");
		delay_ms(200);
		LCD_Fill(30,130,239,130+16,WHITE);
 		delay_ms(200);
	}   
	LCD_ShowString(30,130,200,16,16,"DS18B20 OK");
	POINT_COLOR=BLUE;//设置字体为蓝色 
 	LCD_ShowString(30,210,200,16,16,"Temp:   . C");	 
	while(1)
	{
		
	//	delay_ms(200);		 			   
		LED0=0;
//		*data_nanme=f_typetell("test");
//		printf(data_nanme);
//		LCD_ShowString(30,290,200,16,16,*u8 data_nanme) ;
		
//		sprintf(write_buff,"%04d\r\n",ad_value[i]*3300/4096);
//res_ad=f_lseek(&fil_ad,f_size(&fil_ad));
//res_ad=f_write(&fil_ad,write_buff,6,&bww_ad);

//	if(KEY_Scan(1)==KEY0_PRES)
		if(KEY0==1)	
	{
		t++; 
			 		if(t%10==0)//每100ms读取一次
		{									  
			temperature=DS18B20_Get_Temp();	
			if(temperature<0)
			{
				LCD_ShowChar(30+40,210,'-',16,0);			//显示负号
				temperature=-temperature;					//转为正数
			}else LCD_ShowChar(30+40,210,' ',16,0);			//去掉负号
			LCD_ShowNum(30+40+8,210,temperature/10,2,16);	//显示正数部分	    
   			LCD_ShowNum(30+40+32,210,temperature%10,1,16);	//显示小数部分 	
		t2++;//t2时间			
		}				   
	 	delay_ms(10);		
		LED0=1;
		
//	f_mount(0, &fs);
			//如果data.txt存在,则打开;否则,创建一个新文件
//	res = f_open(&file, "0:/data.txt",FA_OPEN_ALWAYS|FA_READ|FA_WRITE ); 
		//(const TCHAR*)  转换为字符串
		   /* f_open函数:创建文件
        fp:文件指针
        1:test.txt:文件名
        第三个参数是文件操作的权限,读/写/不管文件是否存在都创建(存在就覆盖)
		*/
		
		
 
		     /* 打开文件   没有文件则重新创建*/ 
		res=f_open(&fsrc,(const TCHAR*)filename, FA_OPEN_EXISTING | FA_WRITE);			 		 
		f_lseek(&fsrc, f_size(&fsrc)); //将文件指针移动到文件末尾 
		sprintf((char*)wtext,"  timer is:%2d.%2d\r\n",temperature/10,temperature%10);//输出格式  写入回车换行符

		/* 将缓冲区的数据写到文件中 */
		//sizeof(*wtext)   d  指针指向数组第一个t
		res = f_write(&fsrc,wtext , sizeof(wtext), &bw);   
				//写入回车换行  
//		res=f_write(&fsrc,"\r\n",4,&bw);	
		//写入回车换行  
		//res=f_write(&fdst,"\r\n",br,&bw);		
		    /* f_close:关闭文件,使用f_open必须使用f_close,不然会有缓存
        fp:文件指针
        */
		f_close(&fsrc);                         //关闭文件   






				if(res!=FR_OK)                          //判断是否打开成功
		{
			LCD_ShowString(10,230,tftlcd_data.width,tftlcd_data.height,16,"f_open error!"); 
			LCD_ShowString(30,230,200,16,16,"f_open error!"); 	
		}		


/*		
1.打开文件

f_open(filescr2, "0:/201711022.txt", FA_OPEN_DEFAULT);

2.写数据

f_write(filescr1, test_buff0, sizeof(test_buff0), &bw1);

3.关闭文件

f_close(filescr1);//一定要关闭

第二次写入数据

1.打开文件

f_open(filescr2, "0:/201711022.txt", FA_OPEN_DEFAULT);
2.按照文件现有大小移动指针

f_lseek(filescr1,filescr1->fptr+filescr1->fsize);

3.写数据

f_write(filescr1, test_buff0, sizeof(test_buff0), &bw1);

4.关闭文件

f_close(filescr1);//一定要关闭

其实,多次写入的时候就是需要将指针移动,
这样的h我们就可以根据自己的需求进行在相同文件内连续写入数据了。
但是如果要在指定行进行修改就比较麻烦了,
就需要计算指针移动的位置,者相比于面向对象的编程语言而言要麻烦的多。		
*/	
		//f_lseek(&fsrc,(&fsrc)->fsize);
	//	f_lseek(&fsrc,(&fsrc)->fptr-1);
	


#if 0
    /*注册一个工作区域*/
//    f_mount(0,&fs);			      
    /* 打开创建一个新文件 */
    res=f_open(&fdst,"0:/DATA.CSV",FA_CREATE_NEW | FA_WRITE);   
    /* 写入标题数据 */
    res=f_write(&fdst,"年-月-日-时-分-秒,fix,track\n",29,&bw); 
    /* 关闭文件 */
    f_close(&fdst);
     /* 数据转换 */
 //   size = format_data(text,324,12585);
     /* 打开文件   没有文件则重新创建*/
    res=f_open(&fdst,"0:/DATA.CSV",FA_OPEN_EXISTING | FA_WRITE); 
    /* 查找文件的结尾 */
    res=f_lseek(&fdst,f_size(&fdst)); 
    /* 写入数据 */
    res=f_write(&fdst,text,sizeof(text),&bw);
		//写入回车换行  
		res=f_write(&fdst,"\r\n",br,&bw);
    /* 关闭文件 */
    f_close(&fdst);


#endif


	if ( res == FR_OK )
 	 { 
//写入成功
  	}   
		
//		res=f_write(&fsrc, wtext, sizeof(wtext), &bw);          //向SD卡指定路径写入数据
		//LCD_ShowString(30,230,200,16,16,res); 
		if(res!=FR_OK)                          //判断是否写入成功
		{
			LCD_ShowString(10,230,tftlcd_data.width,tftlcd_data.height,16,"f_write error!"); 
			LCD_ShowString(30,230,200,16,16,"f_write error!"); 	
		}else
		{
		LCD_ShowString(10,230,tftlcd_data.width,tftlcd_data.height,16,"f_write ok!"); 
		}

		}
	//if(KEY_Scan(1)==KEY1_PRES)
		if(KEY1==0)	
	{
res=f_open(&fsrc, (const TCHAR*)filename, FA_READ);     //打开文件,如果文件不存在,则创建该文件
if(res!=FR_OK)                          //判断是否打开成功
{
	LCD_ShowString(10,230,tftlcd_data.width,tftlcd_data.height,16,"f_open error!"); 
}
res=f_read(&fsrc, buffer, sizeof(buffer), &br);         //读取SD卡指定路径的内容,并存放在buffer数组中
if(res!=FR_OK)                          //判断是否读取成功
{
	LCD_ShowString(10,230,tftlcd_data.width,tftlcd_data.height,16,"f_read error!"); 
}
else                                    //如果读取成功,则使用LCD显示
{
		LCD_ShowString(10,230,tftlcd_data.width,tftlcd_data.height,16,"f_read ok!"); 
	LCD_ShowString(10,260,tftlcd_data.width,tftlcd_data.height,16,buffer); 
}
f_close(&fsrc); 		
		
	}	
	} 
}





显示数据有问题

 

 

 

STM32F407ZG上通过DS18B20温度传感器采集数据并通过UART(通用异步收发器)发送到串口,你可以按照以下步骤操作: 1. **硬件连接**: - 将DS18B20的DQ线连接至STM32的PB9/PB10引脚,这两个引脚通常是DS18B20的一组数据线。 - 将VCC和GND分别连接到STM32的相应电源引脚。 - 接通STM32的USART口,例如USART3,用于串口通信。 2. **软件配置**: - 初始化GPIO:设置PB9和PB10为推挽输出,用于驱动DS18B20的信号线。 - 初始化USART:配置波特率、数据位数、停止位和校验位。 3. **DS18B20通信**: - 定义一个函数来发送二进制请求(比如寄存器寻址和测量命令),然后等待DS18B20响应。 - 解析收到的DS18B20的回答(1-Wire协议),其中包含温度值信息。 4. **温度值处理**: - 从DS18B20的响应中提取温度值。 - 将温度值转换为字符串格式,以便于串口传输。 5. **串口发送**: - 使用STM32的HAL库函数`HAL_UART_Transmit()`,将温度值字符串发送到指定的USART口中。 ```c // 示例代码片段 #include "stm32f4xx_hal.h" #include <string.h> #include "ds18b20.h" void ds18b20ToSerial(uint8_t* temperatureStr, uint16_t len) { while (len--) { HAL_UART_Transmit(&huart3, *temperatureStr++, 1, HAL_MAX_DELAY); } } void sendTemperatureRequestAndReceiveResponse() { // 发送请求... uint8_t request[2] = {0x44, 0x2A}; // 举例请求码 write_to_DS18B20(request); // 发送到DS18B20 // 接收并解析回答... uint8_t response[12]; if (read_from_DS18B20(response)) { uint16_t temp = parseTemperatureFromResponse(response); char temperatureStr[20]; dtostrf(temp, 1, 2, temperatureStr); // 转换并存储为字符串 ds18b20ToSerial((uint8_t*)temperatureStr, strlen(temperatureStr)); } } int main(void) { // 初始化... sendTemperatureRequestAndReceiveResponse(); while (1); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值