完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
要求是这个:
然后我写的代码是这个:#include "stm32f4xx.h" //必须包含 #include "string.h" #include "stdio.h" #include "stdlib.h" #define KEY_Init() #define KEY_Read() #define KEY2_Read() #define KEY3_Read() #define KEY4_Read() GPIO_InitTypeDef GPIO_InitStructure; __IO volatile unsigned char usart1_recvbuf[128]; //串口1的接收数组 volatile unsigned int usart1_recvcnt = 0; //串口1的接收数据的个数 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; //printf可以向标准输出输出格式化字符串 int fputc(int ch, FILE *f) {
//通过串口1发送一个字节数据
USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET ); //等待数据发送完成
ch; } //LED灯的PWM初始化 void buzzer_init(void) {
TIM_OCInitTypeDef
ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14, ENABLE);
= GPIO_Mode_AF; //复用模式
= GPIO_Speed_100MHz; //引脚速率
= GPIO_PuPd_NOPULL; //上拉下拉
&GPIO_InitStructure); //把定时器和引脚建立映射关系 GPIO_PinAFConfig(GPIOF, GPIO_PinSource9, GPIO_AF_TIM14); //5.配置定时器TIM14,对于定时频率要进行设置,比如定时器时间设置为20ms TIM_TimeBaseStructure.TIM_Period = 200-1; //时钟频率是10000HZ,则100us计数1次 TIM_TimeBaseStructure.TIM_Prescaler = 8400-1; //预分频值 84MHZ / 8400 = 10000HZ TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//采用递增计数的方式 TIM_TimeBaseInit(TIM14, &TIM_TimeBaseStructure); //6.配置定时器通道 TIM14_CH1 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //PWM模式
= TIM_OutputState_Enable; //输出比较 TIM_OCInitStructure.TIM_Pulse = 100; //占空比初值 相当于占空比是50% TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //低电平有效 TIM_OC1Init(TIM14, &TIM_OCInitStructure); TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable); TIM_ARRPreloadConfig(TIM14, ENABLE); //7.使能定时器 TIM_Cmd(TIM14, ENABLE); } void led_pwm_init(void) {
TIM_OCInitTypeDef
ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14, ENABLE);
= GPIO_Mode_AF; //复用模式
= GPIO_Speed_100MHz; //引脚速率
= GPIO_PuPd_NOPULL; //上拉下拉
&GPIO_InitStructure); //把定时器和引脚建立映射关系 GPIO_PinAFConfig(GPIOF, GPIO_PinSource9, GPIO_AF_TIM14); //5.配置定时器TIM14,对于定时频率要进行设置,比如定时器时间设置为20ms TIM_TimeBaseStructure.TIM_Period = 200-1; //时钟频率是10000HZ,则100us计数1次 TIM_TimeBaseStructure.TIM_Prescaler = 8400-1; //预分频值 84MHZ / 8400 = 10000HZ TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//采用递增计数的方式 TIM_TimeBaseInit(TIM14, &TIM_TimeBaseStructure); //6.配置定时器通道 TIM14_CH1 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //PWM模式 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //输出比较 TIM_OCInitStructure.TIM_Pulse = 100; //占空比初值 相当于占空比是50% TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //低电平有效 TIM_OC1Init(TIM14, &TIM_OCInitStructure); TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable); TIM_ARRPreloadConfig(TIM14, ENABLE); //7.使能定时器 TIM_Cmd(TIM14, ENABLE); } //延时微秒 void delay_us(uint32_t nus) {
= 0; // 关闭定时器
= nus*21 - 1; // 指的是延时时间对应的计数次数
= 0; // 清空当前计数值
= 1; // 开启定时器 并且时钟频率是21MHZ --> 1us计数21次
((SysTick->CTRL & 0x00010000)==0);//等待计数完成,则表示时间到达
= 0; // 关闭定时器 } //延时毫秒 参数不能超过798ms void delay_ms(uint32_t nms) {
= 0; // 关闭定时器
= nms211000 - 1; // 指的是延时时间对应的计数次数
= 0; // 清空当前计数值
= 1; // 开启定时器 并且时钟频率是21MHZ --> 1us计数21次
((SysTick->CTRL & 0x00010000)==0);//等待计数完成,则表示时间到达
= 0; // 关闭定时器 } //延时秒 void delay_s(uint32_t delay) {
} void usart1_init(void) {
USART_InitStructure;
NVIC_InitStructure;
GPIO_InitStructure;
ENABLE);
ENABLE);
GPIO_AF_USART1);
= GPIO_Mode_AF; //复用模式
= GPIO_Speed_100MHz; //引脚速率
= GPIO_PuPd_UP; //上拉电阻
&GPIO_InitStructure);
= USART_HardwareFlowControl_None; //无硬件流控
USART_Mode_Tx; //收发模式
&USART_InitStructure);
= USART1_IRQn; //中断编号
= 1;//抢占优先级
= 0; //响应优先级
= ENABLE; //打开中断通道
USART_IT_RXNE, ENABLE);
ENABLE); } void tim14_init(void) {
打开TIM14的硬件时钟 */
ENABLE);
配置TIM14:输出频率、脉宽 */
= 10000/50-1; //定时频率等价于输出频率
= 8400-1; //预分频值8400
= TIM_CKD_DIV1;//时钟分频为1,但是F407不支持,可以不用配置
= TIM_CounterMode_Up;//向上计数
&TIM_TimeBaseStructure);
= TIM_OCMode_PWM1;//PWM的工作模式为PWM模式1
= TIM_OutputState_Enable;//允许输出脉冲
= 200;//比较值,用于控制输出的脉宽
= TIM_OCPolarity_High;//通道的有效状态为高电平
配置TIM14的通道1 */
&TIM_OCInitStructure);
使能TIM14工作 */
ENABLE); } void USART_Config(void) {
USART_InitStructure;
NVIC_InitStructure;
GPIO_InitStructure;
ENABLE);
ENABLE);
GPIO_PinSource9, GPIO_AF_USART1);
GPIO_PinSource10, GPIO_AF_USART1);
= GPIO_OType_PP;
= GPIO_Speed_100MHz;
= GPIO_Pin_9 | GPIO_Pin_10;
&GPIO_InitStructure);
= 9600;
= USART_WordLength_8b; //数据位 8bit
= USART_StopBits_1; //停止位 1bit
= USART_Parity_No; //无奇偶校验
= USART_HardwareFlowControl_None; //无硬件流控制
= USART_Mode_Rx | USART_Mode_Tx; //收发模式
&USART_InitStructure);
= USART1_IRQn;
= 0;
= 0;
= ENABLE;
ENABLE);
USART_IT_RXNE, ENABLE); } //USART1发送字符串 void USART1_SendString(char *str) {
!= '\0')
USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET );
} //DHT11的初始化 void DHT11_init(void) {
GPIOG
ENABLE);
= GPIO_OType_PP;
= GPIO_Speed_100MHz;
&GPIO_InitStructure);
,Bit_SET); } //设置DHT11引脚为输出模式 void DHT11_SetOutputMode(void) {
GPIOG
ENABLE);
= GPIO_OType_PP;
= GPIO_Speed_100MHz;
&GPIO_InitStructure); } //设置DHT11引脚为输入模式 void DHT11_SetInputMode(void) {
GPIOG
ENABLE);
&GPIO_InitStructure); } //DHT11的开始信号 void DHT11_Start(void) {
,Bit_SET);
,Bit_RESET);
,Bit_SET);
} //DHT11的响应信号 return 1 表示响应 return uint8_t DHT11_WaitAck(void) {
i = 0;
用户需要进行超时处理
GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_9) == 1 && i < 100 )
0; //表示未响应 原因是超时
= 0;
判断是否为80us 用户需要进行超时处理 超时时间一般设置100us
GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_9) == 0 && i < 100 )
0; //表示未响应 原因是超时
1; //表示响应了 } //读取1bit数据 uint8_t指的是unsigned char,是一个字节 注意:函数的返回值中最低位存储读取的1bit数据 //return 0 表示读取的是数字0--> uint8_t DHT11_ReadBit(void) {
i = 0;
GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_9) == 1 && i < 100 )
= 0;
GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_9) == 0 && i < 100 )
延时时间 28us< ?
GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_9) == 1 )
1; //表示读取的bit位为1 保存在字节的最低位
0; //表示读取的bit位为0 保存在字节的最低位 } //DHT11读取1byte uint8_t DHT11_ReadByte(void) {
i = 0;
data = 0; //data用于保存读取的字节 data = 8'b0000 0000
1byte=8bit 高位先出
<<= 1; //每次循环都需要进行左移
|= DHT11_ReadBit();
data; } //获取DHT11温湿度数据 return 0 表示获取失败 return 1 表示获取成功 uint8_t DHT11_GetVal(uint8_t *pbuf) {
i = 0;
DHT11_WaitAck() == 1 )
= DHT11_ReadByte();
pbuf[0]+pbuf[1]+pbuf[2]+pbuf[3] != pbuf[4] )
0; //表示获取失败,原因是数据校验失败导致
0; //表示获取失败,原因是DHT11未响应
1; //表示数据读取成功 } void LED_Config(void) {
GPIOF GPIOE
ENABLE);
ENABLE);
= GPIO_OType_PP;
= GPIO_Speed_100MHz;
= GPIO_Pin_9 | GPIO_Pin_10;
&GPIO_InitStructure);
= GPIO_Pin_13 | GPIO_Pin_14;
&GPIO_InitStructure);
,Bit_SET);
} void init_KEEY(void) {
GPIO_KEEY_InitStruct;
ENABLE);
= GPIO_Mode_IN; //定义输出模式
= GPIO_Speed_100MHz; //定义速度
= GPIO_OType_PP; //定义推挽输出
= GPIO_PuPd_UP; //定义是否有上下拉电阻
} //程序的入口 int main() { } //串口1的中断服务函数 void USART1_IRQHandler(void) {
(USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
= USART_ReceiveData(USART1);
} 请问为了实现功能,主函数应该写什么? |
|
相关推荐 |
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
2136 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
1970 浏览 3 评论
4566 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
2116 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
2629 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 21:36 , Processed in 0.710544 second(s), Total 72, Slave 55 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号