32遥控检测小车

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "oled.h"
#include "led.h"
#include "adc.h"
#include "pwm.h"
#include "dht11.h"
#include "stdlib.h"
#include "remote.h"   
#include "key.h"
 int main(void)
 {	
	u8 key,t;	 
 	u16 adc,pm;	//AD
	float PM; 
//	float adleft,adright;
	float led0pwmval=0,led0pwmval1=0;//PWM   
	u8 temperature;  	    
	u8 humidity; 
	 
	delay_init();	     //延时初始化
	uart_init(9600);	 //串口初始化为9600 A9 A10
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
 	LED_Init();        //A8 D2
	Motor_Init();
	KEY_Init();          //初始化与按键连接的硬件接口
  OLED_Init();			//初始化OLED
 	Adc_Init();	      //四路 A0-A1 A4 A5
	Remote_Init();			//红外接收初始化	  
	TIM1_PWM_Init(899,0);//不分频。PWM频率=72000/(999+1)=72Khz 	A8 2 
 	while(DHT11_Init())	//DHT11初始化	
	{
		OLED_ShowString(0,0,"DHT11 Error",24);	//初始化失败,检查连线
 		delay_ms(200);
	}
		OLED_Clear(); 	     											//清屏
	
	while(1)
	{		


		if((Res=='1')||(KEY2==0)){IN1=1;IN2=0;IN3=0;IN4=1;led0pwmval=200;led0pwmval1=200;}
		else if((Res=='2')||(KEY1==0)){IN1=1;IN2=0;IN3=0;IN4=1;led0pwmval=200;led0pwmval1=800;}
		else if((Res=='3')||(KEY0==0)){IN1=1;IN2=0;IN3=1;IN4=0;led0pwmval=800;led0pwmval1=200;}
		else if((Res=='4')||(KEY3==0)){IN1=0;IN2=1;IN3=1;IN4=0;led0pwmval=200;led0pwmval1=200;}
		else if(Res=='5'){IN1=1;IN2=1;IN3=1;IN4=1;led0pwmval=899;led0pwmval1=899;}
		led0pwmval=(led0pwmval<200?200:led0pwmval);led0pwmval1=(led0pwmval1<200?200:led0pwmval1);
		TIM_SetCompare3(TIM4,led0pwmval1);	       //右	led0pwmval1
		TIM_SetCompare4(TIM4,led0pwmval);	         //左 led0pwmval
		OLED_ShowNum(70,2,led0pwmval,3,16);  		   	//显示
		OLED_ShowNum(70,4,led0pwmval1,3,16);  		   	//显示
		
ADC///	
 		if(t%20==0)																//隔一段时间读取一次温度以及H2浓度并显示
		{				
		adc=Get_Adc_Average(ADC_Channel_3,10);	
		
		OLED_ShowNum(0,0,adc,4,16);  		   	        //显示烟雾浓度
		printf("烟雾值:%d  \r\n",adc);
		
		DHT11_Read_Data(&temperature,&humidity);		//读取温湿度值		
		OLED_ShowNum(0,2,temperature,5,16);  		   	//显示
		printf("温度值:%d  \r\n",temperature);
		OLED_ShowNum(0,4,humidity,5,16);  		   	//显示
		printf("湿度值:%d  \r\n",humidity);
//		key=Remote_Scan();
		OLED_ShowNum(0,6,key,5,16);  		   	//显示
		pm=Get_Adc_Average(ADC_Channel_4,5);
		PM=0.17*pm-0.1;
		OLED_ShowNum(70,0,(u32)PM,4,16);  		   	//显示
		printf("PM值:%d  \r\n",(int)PM);
		}delay_ms(10);
				t++;
		if(t==20)
		{
			t=0;
		}	


	}
 }

#include "sys.h"
#include "usart.h"	  
// 	 
//如果使用ucos,则包括下面的头文件即可.
#if SYSTEM_SUPPORT_UCOS
#include "includes.h"					//ucos 使用	  
#endif
//	 
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK STM32开发板
//串口1初始化		   
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2012/8/18
//版本:V1.5
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2009-2019
//All rights reserved
//********************************************************************************
//V1.3修改说明 
//支持适应不同频率下的串口波特率设置.
//加入了对printf的支持
//增加了串口接收命令功能.
//修正了printf第一个字符丢失的bug
//V1.4修改说明
//1,修改串口初始化IO的bug
//2,修改了USART_RX_STA,使得串口最大接收字节数为2的14次方
//3,增加了USART_REC_LEN,用于定义串口最大允许接收的字节数(不大于2的14次方)
//4,修改了EN_USART1_RX的使能方式
//V1.5修改说明
//1,增加了对UCOSII的支持
// 	  
 

//
//加入以下代码,支持printf函数,而不需要选择use MicroLIB	  
#if 1
#pragma import(__use_no_semihosting)             
//标准库需要的支持函数                 
struct __FILE 
{ 
	int handle; 

}; 

FILE __stdout;       
//定义_sys_exit()以避免使用半主机模式    
_sys_exit(int x) 
{ 
	x = x; 
} 
//重定义fputc函数 
int fputc(int ch, FILE *f)
{      
	while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET); 
    USART_SendData(USART1,(uint8_t)ch);   
	return ch;
}
#endif 

/*使用microLib的方法*/
 /* 
int fputc(int ch, FILE *f)
{
	USART_SendData(USART1, (uint8_t) ch);

	while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {}	
   
    return ch;
}
int GetKey (void)  { 

    while (!(USART1->SR & USART_FLAG_RXNE));

    return ((int)(USART1->DR & 0x1FF));
}
*/
 
#if EN_USART1_RX   //如果使能了接收
//串口1中断服务程序
//注意,读取USARTx->SR能避免莫名其妙的错误   	
u8 USART_RX_BUF[USART_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.
//接收状态
//bit15,	接收完成标志
//bit14,	接收到0x0d
//bit13~0,	接收到的有效字节数目
u16 USART_RX_STA=0;       //接收状态标记	  

//初始化IO 串口1 
//bound:波特率
	u8 Res;
void uart_init(u32 bound){
    //GPIO端口设置
    GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	 
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);	//使能USART1,GPIOA时钟
 	USART_DeInit(USART1);  //复位串口1
	 //USART1_TX   PA.9
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出
    GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA9
   
    //USART1_RX	  PA.10
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
    GPIO_Init(GPIOA, &GPIO_InitStructure);  //初始化PA10


   //USART 初始化设置

	USART_InitStructure.USART_BaudRate = bound;//一般设置为9600;
	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); //初始化串口
#if EN_USART1_RX		  //如果使能了接收  
   //Usart1 NVIC 配置
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//子优先级3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器
   
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断
#endif
    USART_Cmd(USART1, ENABLE);                    //使能串口 

}

void USART1_IRQHandler(void)                	//串口1中断服务程序
	{

#ifdef OS_TICKS_PER_SEC	 	//如果时钟节拍数定义了,说明要使用ucosII了.
	OSIntEnter();    
#endif
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  

		{
		Res =USART_ReceiveData(USART1);//(USART1->DR);	

			
     } 
#ifdef OS_TICKS_PER_SEC	 	//如果时钟节拍数定义了,说明要使用ucosII了.
	OSIntExit();  											 
#endif
} 
#endif	


#ifndef __USART_H
#define __USART_H
#include "stdio.h"	
#include "sys.h" 
//	 
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//Mini STM32开发板
//串口1初始化		   
//正点原子@ALIENTEK
//技术论坛:www.openedv.csom
//修改日期:2011/6/14
//版本:V1.4
//版权所有,盗版必究。
//Copyright(C) 正点原子 2009-2019
//All rights reserved
//********************************************************************************
//V1.3修改说明 
//支持适应不同频率下的串口波特率设置.
//加入了对printf的支持
//增加了串口接收命令功能.
//修正了printf第一个字符丢失的bug
//V1.4修改说明
//1,修改串口初始化IO的bug
//2,修改了USART_RX_STA,使得串口最大接收字节数为2的14次方
//3,增加了USART_REC_LEN,用于定义串口最大允许接收的字节数(不大于2的14次方)
//4,修改了EN_USART1_RX的使能方式
// 	
#define USART_REC_LEN  			200  	//定义最大接收字节数 200
#define EN_USART1_RX 			1		//使能(1)/禁止(0)串口1接收
extern u8 Res;	  	
extern u8  USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.末字节为换行符 
extern u16 USART_RX_STA;         		//接收状态标记	
//如果想串口中断接收,请不要注释以下宏定义
void uart_init(u32 bound);
#endif



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

音符o

有闲钱打赏一下,穷死了。哈哈哈

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值