真正开始写blog了

        blog已经火了很久了,web2.0的大潮也来了,虽然以前玩过Q-Zone,MSN Space,新浪blog等等,但都没坚持下去,或许时间一长就会忘记写了吧,又或者写不出什么了。

        假期到了,学习仍然没有结束,但我的生命已经捆在IT业这匹快马上时,我就明白只有不断的学习才能不从马上摔下,在前一阵学校内很火的校内网上,看到了很多同学都去copy代码以使自己的页面更漂亮,却不注重内容的魅力。了解csdn很久,在假期学习过程以及今后的学习中,我要尽力坚持写好技术blog,美好blog不是没有技术,但舍弃了浏览速度和弄的过于花哨就不是真正的blog了。所以csdn的blog一定程度上也是督促自己学习的一种方式。

      内容当然尽量原创啦,在高手看来我这些东西可能都很菜了,但我还是会记录下自己的成长路程,有朝一日也会成为高手。所以访问量就从没想过,也在简化blog显示时去掉了统计。

 

好的,我们可以做一个基于单片机的温湿度检测显示系统。我们需要以下材料: 1. 单片机:我们选用STM32F103C8T6 2. 温湿度传感器:我们选用DHT11 3. 12864液晶屏 4. 杜邦线若干 5. 电位器一个 6. 面包板一个 接下来我们开始搭建电路,电路图如下: ![电路图](https://img-blog.csdnimg.cn/20220528145251798.png) 接下来,我们需要编代码。代码如下: ```c #include "stm32f10x.h" #include "dht11.h" //DHT11驱动程序 #define LCD_RS_GPIO_RCC RCC_APB2Periph_GPIOB #define LCD_RS_GPIO_PORT GPIOB #define LCD_RS_GPIO_PIN GPIO_Pin_0 #define LCD_RW_GPIO_RCC RCC_APB2Periph_GPIOB #define LCD_RW_GPIO_PORT GPIOB #define LCD_RW_GPIO_PIN GPIO_Pin_1 #define LCD_EN_GPIO_RCC RCC_APB2Periph_GPIOB #define LCD_EN_GPIO_PORT GPIOB #define LCD_EN_GPIO_PIN GPIO_Pin_2 #define LCD_D0_GPIO_RCC RCC_APB2Periph_GPIOB #define LCD_D0_GPIO_PORT GPIOB #define LCD_D0_GPIO_PIN GPIO_Pin_8 #define LCD_D1_GPIO_RCC RCC_APB2Periph_GPIOB #define LCD_D1_GPIO_PORT GPIOB #define LCD_D1_GPIO_PIN GPIO_Pin_9 #define LCD_D2_GPIO_RCC RCC_APB2Periph_GPIOB #define LCD_D2_GPIO_PORT GPIOB #define LCD_D2_GPIO_PIN GPIO_Pin_10 #define LCD_D3_GPIO_RCC RCC_APB2Periph_GPIOB #define LCD_D3_GPIO_PORT GPIOB #define LCD_D3_GPIO_PIN GPIO_Pin_11 #define LCD_D4_GPIO_RCC RCC_APB2Periph_GPIOB #define LCD_D4_GPIO_PORT GPIOB #define LCD_D4_GPIO_PIN GPIO_Pin_12 #define LCD_D5_GPIO_RCC RCC_APB2Periph_GPIOB #define LCD_D5_GPIO_PORT GPIOB #define LCD_D5_GPIO_PIN GPIO_Pin_13 #define LCD_D6_GPIO_RCC RCC_APB2Periph_GPIOB #define LCD_D6_GPIO_PORT GPIOB #define LCD_D6_GPIO_PIN GPIO_Pin_14 #define LCD_D7_GPIO_RCC RCC_APB2Periph_GPIOB #define LCD_D7_GPIO_PORT GPIOB #define LCD_D7_GPIO_PIN GPIO_Pin_15 void Delay_us(unsigned int nus) { unsigned int i=0; for(;nus>0;nus--) for(i=0;i<12;i++); } void LCD_GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(LCD_RS_GPIO_RCC, ENABLE); RCC_APB2PeriphClockCmd(LCD_RW_GPIO_RCC, ENABLE); RCC_APB2PeriphClockCmd(LCD_EN_GPIO_RCC, ENABLE); RCC_APB2PeriphClockCmd(LCD_D0_GPIO_RCC, ENABLE); RCC_APB2PeriphClockCmd(LCD_D1_GPIO_RCC, ENABLE); RCC_APB2PeriphClockCmd(LCD_D2_GPIO_RCC, ENABLE); RCC_APB2PeriphClockCmd(LCD_D3_GPIO_RCC, ENABLE); RCC_APB2PeriphClockCmd(LCD_D4_GPIO_RCC, ENABLE); RCC_APB2PeriphClockCmd(LCD_D5_GPIO_RCC, ENABLE); RCC_APB2PeriphClockCmd(LCD_D6_GPIO_RCC, ENABLE); RCC_APB2PeriphClockCmd(LCD_D7_GPIO_RCC, ENABLE); GPIO_InitStructure.GPIO_Pin = LCD_RS_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(LCD_RS_GPIO_PORT, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = LCD_RW_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(LCD_RW_GPIO_PORT, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = LCD_EN_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(LCD_EN_GPIO_PORT, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = LCD_D0_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(LCD_D0_GPIO_PORT, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = LCD_D1_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(LCD_D1_GPIO_PORT, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = LCD_D2_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(LCD_D2_GPIO_PORT, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = LCD_D3_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(LCD_D3_GPIO_PORT, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = LCD_D4_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(LCD_D4_GPIO_PORT, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = LCD_D5_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(LCD_D5_GPIO_PORT, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = LCD_D6_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(LCD_D6_GPIO_PORT, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = LCD_D7_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(LCD_D7_GPIO_PORT, &GPIO_InitStructure); } void LCD_WriteCommand(unsigned char command) { GPIO_ResetBits(LCD_RS_GPIO_PORT, LCD_RS_GPIO_PIN); //RS=0,命令 GPIO_ResetBits(LCD_RW_GPIO_PORT, LCD_RW_GPIO_PIN); //RW=0,数据 GPIO_SetBits(LCD_EN_GPIO_PORT, LCD_EN_GPIO_PIN); //EN=1 GPIO_Write(GPIOB, command<<8); //入命令 GPIO_ResetBits(LCD_EN_GPIO_PORT, LCD_EN_GPIO_PIN); //EN=0 } void LCD_WriteData(unsigned char data) { GPIO_SetBits(LCD_RS_GPIO_PORT, LCD_RS_GPIO_PIN); //RS=1,数据 GPIO_ResetBits(LCD_RW_GPIO_PORT, LCD_RW_GPIO_PIN); //RW=0,数据 GPIO_SetBits(LCD_EN_GPIO_PORT, LCD_EN_GPIO_PIN); //EN=1 GPIO_Write(GPIOB, data<<8); //入数据 GPIO_ResetBits(LCD_EN_GPIO_PORT, LCD_EN_GPIO_PIN); //EN=0 } void LCD_Init(void) { LCD_GPIO_Config(); //初始化GPIO口 Delay_us(15000); //等待电源稳定 LCD_WriteCommand(0x38); //设置16×2显示,5×7点阵,8位数据口 LCD_WriteCommand(0x0C); //显示开,无光标 LCD_WriteCommand(0x06); //光标右移,字符不动 LCD_WriteCommand(0x01); //清屏 } void LCD_ShowString(unsigned char x, unsigned char y, unsigned char* str) { unsigned char i; if(x<16 && y<2) //判断字符串是否超出范围 { if(y==0) //第一行 { LCD_WriteCommand(0x80+x); } if(y==1) //第二行 { LCD_WriteCommand(0xC0+x); } for(i=0; str[i]!='\0'; i++) { LCD_WriteData(str[i]); //入字符 } } } int main(void) { char buf[32]; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能PORTA时钟 DHT11_Init();// 初始化DHT11 LCD_Init();//初始化LCD while(1) { if(DHT11_Read_Data()) //读取温湿度,并判断是否读取成功 { sprintf(buf, "Temp:%d.%d C", DHT11_Data[2], DHT11_Data[3]); //将温度数据转换为字符串 LCD_ShowString(0, 0, (unsigned char*)buf); //在LCD第一行显示温度数据 sprintf(buf, "Hum:%d.%d%%", DHT11_Data[0], DHT11_Data[1]); //将湿度数据转换为字符串 LCD_ShowString(0, 1, (unsigned char*)buf); //在LCD第二行显示湿度数据 } else { LCD_ShowString(0, 0, "DHT11 Error!"); //在LCD第一行显示错误信息 } Delay_us(1000000); //延时1秒 } } ``` 代码注释已经比较详细,这里简单介绍一下。首先是LCD的初始化,然后进入无限循环,读取DHT11的温湿度数据,判断是否读取成功,将温湿度数据转换为字符串,并在LCD屏幕上显示出来。 最后,我们将代码烧录到STM32F103C8T6开发板中,连接传感器和液晶屏,就可以实现温湿度检测显示了。 效果如下: ![效果图](https://img-blog.csdnimg.cn/20220528145254737.png)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值