基于STM32F407的时间显示+DS18B20温度显示

这个注释乱码我也不知道怎么办,但是程序是没有问题的,下面这个是主程序的

#include "system.h"
#include "SysTick.h"
#include "led.h"
#include "usart.h"
#include "tftlcd.h"
#include "ds18b20.h"
#include "rtc.h"
#include "stdio.h"
#include "key.h"

int main()
{	  
		RTC_TimeTypeDef RTC_TimeStruct;
		
		u8 t,m,h;//·ÖÖÓ£¬Ð¡Ê±
		u8 buf[10];//ÓÃÓÚ´¢±¸Ê±¼ä
		u8 key,i=0;
	
		SysTick_Init(168);
		NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //ÖжÏÓÅÏȼ¶·Ö×é ·Ö2×é
        USART1_Init(9600);
		TFTLCD_Init();	//LCD³õʼ»¯
		KEY_Init();//°´¼ü³õʼ
		RTC_Config();//RTC³õʼ»¯
		DS18B20_Init();	//ÕâÀïÊÇDS18B20µÄ³õʼ»¯
		RTC_Set_WakeUp(RTC_WakeUpClock_CK_SPRE_16bits,0);//ÕâÀï»áÔÚ´®¿ÚÊä³ö
        FRONT_COLOR=RED;

       while(1)
		{
				
		         if(t%50==0) //ÿ 500ms ¶ÁÈ¡Ò»´Î
	
				 {  printf("%.2f¡ãC\r\n",DS18B20_GetTemperture());
                    key=KEY_Scan(0);   //ɨÃè°´¼ü
					switch(key)
				    {
					case KEY_UP:	RTC_Set_Time(h++,m,0,RTC_H12_AM);break;      //°´ÏÂK_UP°´¼ü    µãÁÁD2ָʾµÆ....ÕâÀï²»»á...........................................................
					case KEY_DOWN:RTC_Set_Time(h--,m,0,RTC_H12_AM);break;    //°´ÏÂK_DOWN°´¼ü  µãÁÁD2ָʾµÆ
					case KEY_LEFT:RTC_Set_Time(h,m++,0,RTC_H12_AM);break;    //°´ÏÂK_LEFT°´¼ü  ¹Ø±Õ·äÃùÆ÷
					case KEY_RIGHT:RTC_Set_Time(h,m--,0,RTC_H12_AM);break;   //°´ÏÂK_RIGHT°´¼ü ´ò¿ª·äÃùÆ÷
				    }
				
					RTC_GetTime(RTC_Format_BIN,&RTC_TimeStruct);
					sprintf((char *)buf,"%.2d:%.2d:%.2d",RTC_TimeStruct.RTC_Hours,RTC_TimeStruct.RTC_Minutes,RTC_TimeStruct.RTC_Seconds);
					LCD_ShowString(27,40,tftlcd_data.width,tftlcd_data.height,16,buf);		
					LCD_ShowNum(20,70,DS18B20_GetTemperture(),2,16); 
				 }
				 delay_ms(10);
				 t++;
				
		  }
		}

接下来是串口的

#include "usart.h"	


int fputc(int ch,FILE *p)  //º¯ÊýĬÈϵģ¬ÔÚʹÓÃprintfº¯Êýʱ×Ô¶¯µ÷ÓÃ
{
	USART_SendData(USART1,(u8)ch);	
	while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
	return ch;
}


/*******************************************************************************
* º¯ Êý Ãû         : USART1_Init
* º¯Êý¹¦ÄÜ		   : USART1³õʼ»¯º¯Êý
* Êä    Èë         : bound:²¨ÌØÂÊ
* Êä    ³ö         : ÎÞ
*******************************************************************************/
void USART1_Init(u32 bound)
{
   //GPIO¶Ë¿ÚÉèÖÃ
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //ʹÄÜGPIOAʱÖÓ
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//ʹÄÜUSART1ʱÖÓ
 
	//´®¿Ú1¶ÔÓ¦Òý½Å¸´ÓÃÓ³Éä
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); //GPIOA9¸´ÓÃΪUSART1
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); //GPIOA10¸´ÓÃΪUSART1
	
	//USART1¶Ë¿ÚÅäÖÃ
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10 ; //GPIOA9ÓëGPIOA10
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//¸´Óù¦ÄÜ
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	//ËÙ¶È50MHz
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //ÍÆÍ츴ÓÃÊä³ö
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //ÉÏÀ­
	GPIO_Init(GPIOA,&GPIO_InitStructure); //³õʼ»¯PA9£¬PA10
	

   //USART1 ³õʼ»¯ÉèÖÃ
	USART_InitStructure.USART_BaudRate = bound;//²¨ÌØÂÊÉèÖÃ
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//×Ö³¤Îª8λÊý¾Ý¸ñʽ
	USART_InitStructure.USART_StopBits = USART_StopBits_1;//Ò»¸öֹͣλ
	USART_InitStructure.USART_Parity = USART_Parity_No;//ÎÞÆæżУÑéλ
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//ÎÞÓ²¼þÊý¾ÝÁ÷¿ØÖÆ
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//ÊÕ·¢Ä£Ê½
	USART_Init(USART1, &USART_InitStructure); //³õʼ»¯´®¿Ú1
	
	USART_Cmd(USART1, ENABLE);  //ʹÄÜ´®¿Ú1 
	
	USART_ClearFlag(USART1, USART_FLAG_TC);
		
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//¿ªÆôÏà¹ØÖжÏ

	//Usart1 NVIC ÅäÖÃ
	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//´®¿Ú1ÖжÏͨµÀ
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//ÇÀÕ¼ÓÅÏȼ¶3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;		//×ÓÓÅÏȼ¶3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQͨµÀʹÄÜ
	NVIC_Init(&NVIC_InitStructure);	//¸ù¾ÝÖ¸¶¨µÄ²ÎÊý³õʼ»¯VIC¼Ä´æÆ÷¡¢	
}

/*******************************************************************************
* º¯ Êý Ãû         : USART1_IRQHandler
* º¯Êý¹¦ÄÜ		   : USART1ÖжϺ¯Êý
* Êä    Èë         : ÎÞ
* Êä    ³ö         : ÎÞ
*******************************************************************************/ 
void USART1_IRQHandler(void)                	//´®¿Ú1ÖжϷþÎñ³ÌÐò
{
	u8 r;
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //½ÓÊÕÖжÏ
	{
		r =USART_ReceiveData(USART1);//(USART1->DR);	//¶ÁÈ¡½ÓÊÕµ½µÄÊý¾Ý
		USART_SendData(USART1,r);
		while(USART_GetFlagStatus(USART1,USART_FLAG_TC) != SET);
	} 
	USART_ClearFlag(USART1,USART_FLAG_TC);
} 	

接下来是RTC和DS18B20的配置,这个网上一般都会有

主要就是主函数里的内容和注意每个函数的具体用法。

我们老师告诉我这是个螺旋学习的过程,但是还是感觉自己有点low。


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,您想了解如何利用STM32F407通过串口驱动ds18b20,是吗? 首先,您需要将ds18b20连接到STM32F407的USART串口引脚。然后,您需要编写程序使用串口通信协议与ds18b20进行通信。 其中,您需要使用STM32的USART模块来发送和接收数据。为了与ds18b20通信,您需要使用单总线协议。您可以编写程序使用该协议从ds18b20读取温度数据。 代码示例: ``` #include "stm32f4xx.h" #define DS18B20_PIN GPIO_Pin_0 #define DS18B20_PORT GPIOA void ds18b20_init(void) { RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = DS18B20_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(DS18B20_PORT, &GPIO_InitStructure); } void ds18b20_write_bit(uint8_t bit) { GPIO_ResetBits(DS18B20_PORT, DS18B20_PIN); if (bit) { delay_us(5); GPIO_SetBits(DS18B20_PORT, DS18B20_PIN); delay_us(60); } else { delay_us(60); GPIO_SetBits(DS18B20_PORT, DS18B20_PIN); delay_us(5); } } uint8_t ds18b20_read_bit(void) { GPIO_ResetBits(DS18B20_PORT, DS18B20_PIN); delay_us(5); GPIO_SetBits(DS18B20_PORT, DS18B20_PIN); delay_us(10); uint8_t bit = GPIO_ReadInputDataBit(DS18B20_PORT, DS18B20_PIN); delay_us(55); return bit; } void ds18b20_write_byte(uint8_t byte) { for (uint8_t i = 0; i < 8; i++) { ds18b20_write_bit(byte & (1 << i)); } } uint8_t ds18b20_read_byte(void) { uint8_t byte = 0; for (uint8_t i = 0; i < 8; i++) { byte |= ds18b20_read_bit() << i; } return byte; } float ds18b20_read_temperature() { ds18b20_init(); ds18b20_write_byte(0xcc); ds18b20_write_byte(0x44); delay_us(750000); ds18b20_init(); ds18b20_write_byte(0xcc); ds18b20_write_byte(0xbe); uint16_t temperature = ds18b20_read_byte(); temperature |= ds18b20_read_byte() << 8; uint8_t digit = temperature >> 4; uint8_t decimal = (temperature & 0x0f) * 625 / 100; return digit + decimal / 100.0; } ``` 这段代码中包括了ds18b20初始化、单总线协议的编写、读取温度值的代码。您可以根据实际需要进行修改和使用。 希望可以帮到您。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值