stm32 MCU單片機源程序如下:
- #include "stm32f4xx.h"
- #include "sys.h"
- #include "stdio.h"
- u8 buf[5]={0}; //u8 uint8
- GPIO_InitTypeDef GPIO_InitStructure;
- USART_InitTypeDef USART_InitStructure;
- NVIC_InitTypeDef NVIC_InitStructure; //配置優先級
- void delay_us(uint32_t n)
- {
- while(n--)
- {
- SysTick->CTRL = 0; //關閉系統定時器
- SysTick->LOAD = 168; //決定了延時時間,假如這里是延時1us,計數值為168(前提時鐘源為168MHz)
-
- SysTick->VAL = 0; //清空標志位
-
- SysTick->CTRL = 5; //使用PLL作為時鐘源,并讓系統定時器工作
-
- while ((SysTick->CTRL & 0x00010000)==0);//等待系統定時器減到0,CTRL寄存器的COUNT標志位置位
-
- SysTick->CTRL = 0; //關閉系統定時器
-
- }
- }
- void delay_ms(uint32_t n)
- {
- while(n--)
- {
- SysTick->CTRL = 0; //關閉系統定時器
- SysTick->LOAD = 168000; //決定了延時時間,假如這里是延時1ms,計數值為168000(前提時鐘源為168MHz)
-
- SysTick->VAL = 0; //清空標志位
-
- SysTick->CTRL = 5; //使用PLL作為時鐘源,并讓系統定時器工作
-
- while ((SysTick->CTRL & 0x00010000)==0);//等待系統定時器減到0,CTRL寄存器的COUNT標志位置位
-
- SysTick->CTRL = 0; //關閉系統定時器
-
- }
- }
- //重定義fputc file putchar() printf
- int fputc(int ch,FILE *f)
- {
- USART_SendData(USART1,ch);
- while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
- return ch;
- }
- void usart1_init(void)
- {
-
- //使能端口A的時鐘
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
-
- //使能串口1的時鐘
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
-
-
- //配置端口A的引腳,為復用功能模式
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10;//9 10號引腳
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //輸出模式
- //GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽輸出,增加輸出電流,也會增加功耗
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //引腳最大的工作速度為100MHz,速度越快,功耗就越高
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //沒有上下拉電阻
- GPIO_Init(GPIOA, &GPIO_InitStructure); //配置端口F
-
-
- //將PA9和PA10引腳連接到串口1硬件
- GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);
- GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
-
- //配置串口1的參數
- USART_InitStructure.USART_BaudRate = 9600; //波特率
- USART_InitStructure.USART_WordLength = USART_WordLength_8b; //8位數據位
- USART_InitStructure.USART_StopBits = USART_StopBits_1; //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中斷的優先級
- NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //串口1的中斷號
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x03;//搶占優先級0x03
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03; //響應(子)優先級0x03
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能串口1的中斷
- NVIC_Init(&NVIC_InitStructure);
- //使能接收中斷
- USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
- }
- void usart3_init(uint32_t baud)
- {
- //使能端口B的時鐘
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
-
- //使能串口3的時鐘
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
-
-
- //配置端口B的引腳,為復用功能模式
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11;//10 11號引腳
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //復用功能模式
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //引腳最大的工作速度為100MHz,速度越快,功耗就越高
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //沒有上下拉電阻
- GPIO_Init(GPIOB, &GPIO_InitStructure); //配置端口F
-
-
- //將PB10和PB11引腳連接到串口3硬件
- GPIO_PinAFConfig(GPIOB,GPIO_PinSource10,GPIO_AF_USART3);
- GPIO_PinAFConfig(GPIOB,GPIO_PinSource11,GPIO_AF_USART3);
-
- //配置串口3的參數
- USART_InitStructure.USART_BaudRate = baud; //波特率
- USART_InitStructure.USART_WordLength = USART_WordLength_8b; //8位數據位
- USART_InitStructure.USART_StopBits = USART_StopBits_1; //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(USART3, &USART_InitStructure);
-
-
-
- //使能串口3工作
- USART_Cmd(USART3,ENABLE);
-
- //配置串口3中斷的優先級
- NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn; //串口3的中斷號
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x03;//搶占優先級0x03
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03; //響應(子)優先級0x03
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能串口1的中斷
- NVIC_Init(&NVIC_InitStructure);
- //使能接收中斷
- USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);
- }
- int dht11_init(void)
- {
- int t=0;
- int i=0,j=0;
- u8 d=0;
-
- //RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE);
-
- //配置端口G的引腳,為復用功能模式
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;//9號引腳
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //輸出模式
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽輸出,增加輸出電流,也會增加功耗
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //引腳最大的工作速度為100MHz,速度越快,功耗就越高
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //沒有上下拉電阻
- GPIO_Init(GPIOG, &GPIO_InitStructure); //配置端口G
-
- PGout(9)=0;
- delay_ms(20);
- PGout(9)=1;
- delay_us(30);
-
- //配置端口G的引腳,為復用功能模式
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;//9號引腳
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; //輸入模式
- //GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽輸出,增加輸出電流,也會增加功耗
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //引腳最大的工作速度為100MHz,速度越快,功耗就越高
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //沒有上下拉電阻
- GPIO_Init(GPIOG, &GPIO_InitStructure); //配置端口G
-
- while(PGin(9))
- {
- t++;
- delay_us(1);
- if(t>1000)
- {
- return -1;
- }
- }
-
- t=0;
- while(PGin(9)==0)
- {
- t++;
- delay_us(1);
- if(t>100)
- {
- return -2;
- }
- }
-
- t=0;
- while(PGin(9))
- {
- t++;
- delay_us(1);
- if(t>100)
- {
- return -3;
- }
- }
-
- for(i=0;i<5;i++)
- {
- d=0;
- for(j=7;j>=0;j--)
- {
- t=0;
- while(PGin(9)==0)
- {
- t++;
- delay_us(1);
- if(t>100)
- {
- return -4;
- }
- }
-
- delay_us(40);
-
- if(PGin(9))
- {
- d|=1<<j;
-
- t=0;
-
- while(PGin(9))
- {
- t++;
- delay_us(1);
- if(t>100)
- {
- return -5;
- }
- }
- }
- }
- buf[i]=d;
- }
-
- //結束通信,延時100us忽略掉
- delay_us(100);
-
- //計算校驗和
- d = buf[0]+buf[1]+buf[2]+buf[3];
-
- if(d!=buf[4])
- return -6;
- return 0;
- }
- void usart3_send_str(int8_t *pbuf)
- {
- while(*pbuf!='\0')
- {
- USART_SendData(USART3,*pbuf++);
-
- //等待數據發送完畢
- while(USART_GetFlagStatus(USART3,USART_FLAG_TXE)==RESET);
- }
- }
- void USART1_IRQHandler(void)
- {
- uint8_t d;
-
- //檢測是否有接收到數據
- if(USART_GetITStatus(USART1,USART_IT_RXNE) == SET)
- {
-
- //接收數據
- d=USART_ReceiveData(USART1);
-
- //將接收到的數據返發給串口1
- //usart1_send_bytes(&d,1);
- USART_SendData(USART1,d);
- while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
-
- //清空標志位,告訴CPU,已經完成中斷請求,可以處理新的數據
- USART_ClearITPendingBit(USART1,USART_IT_RXNE);
- }
- }
- void USART3_IRQHandler(void)
- {
- uint8_t d;
-
- //檢測是否有接收到數據
- if(USART_GetITStatus(USART3,USART_IT_RXNE) == SET)
- {
-
- //接收數據
- d=USART_ReceiveData(USART3);
-
-
- if(d==0x41)
- {
- PFout(9)=!PFout(9);
- }
-
- printf("%c",d);
- USART_ClearITPendingBit(USART3,USART_IT_RXNE);
- }
- }
- int main(void)
- {
- int ii;
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
-
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE);
-
- //配置PG9引腳,為輸出模式
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //9號引腳
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //輸出模式
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽輸出,增加輸出電流,也會增加功耗
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //引腳最大的工作速度為100MHz,速度越快,功耗就越高
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //沒有上下拉電阻
- GPIO_Init(GPIOG, &GPIO_InitStructure); //配置端口F
-
- PGout(9)=1;
-
-
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
-
- //配置PG9引腳,為輸出模式
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //9號引腳
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //輸出模式
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽輸出,增加輸出電流,也會增加功耗
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //引腳最大的工作速度為100MHz,速度越快,功耗就越高
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //沒有上下拉電阻
- GPIO_Init(GPIOF, &GPIO_InitStructure); //配置端口F
- usart1_init();
- usart3_init(9600);
-
-
-
-
-
- while(1)
- {
- ii=dht11_init();
- printf("ii=%d T=%hhd.%hhd,H=%hhd.%hhd\r\n",ii, buf[2],buf[3],buf[0],buf[1]);
- delay_ms(6000);
- }
-
- }
復制代碼
所有資料51hei提供下載:
溫濕度.7z
(1.35 MB, 下載次數: 55)
2020-3-1 01:40 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|