• 基于stm32的温湿度检测案例串口通信屏显示(二)


    文章目录

    前言

    一、串口通信屏幕

    二、DHT11测试效果与说明

     三、读入数据

    四、串口及中断配置

    五、屏幕上显示数据

    5.1、屏幕内嵌指令

    5.2、静态数据

    5.3、动态数据

    六、效果


    前言

    因为stm32f042最小单片机系统外部引脚资源较少,故选取另外一款最小单片机系统stm32f103c8t6,承接前一章基于stm32的温湿度检测案例(一),加入串口通信屏幕将DHT11采集的数据在串口屏幕上显示。使用USART2向屏幕发送数据,屏幕将接收到的数据解析并显示。

    一、串口通信屏幕

    1.44 寸集成串口屏是一款串口屏模块,点阵分辨率是 128x128。其内置国标一级、二级简
    体中文字库和英文 ASCII 字符集,同时开放内部点阵 DDRAM,能够在屏幕上的任意位置显示
    图片及图形。硬件上它提供 UART 接口方式,接线简单。

    二、DHT11测试效果与说明

    DHT11温度湿度检测模块,是检测不到温湿度的小数位滴。

     三、读入数据

    1. #include "public.h"
    2. /*********************************************局部方法声明*********************************************/
    3. void DHT11_GPIO_Out(void);
    4. void DHT11_GPIO_In(void);
    5. void DHT11_StructInit(void);
    6. st_u8 DHT11_ReadByte ( void );
    7. /*********************************************方法定义*********************************************/
    8. /*********************************************初始化部分*********************************************/
    9. void DHT11_StructInit(void)
    10. {
    11. DHT11_Data.humi_int=0x00;
    12. DHT11_Data.humi_deci = 0x00;
    13. DHT11_Data.humi_int = 0x00;
    14. DHT11_Data.temp_deci=0x00;
    15. DHT11_Data.check_sum = 0x00;
    16. }
    17. void DHT11_Init(void)
    18. {
    19. DHT11_StructInit();
    20. DHT11_GPIO_Out();
    21. //GPIOSet(Debug1_DHT11_PORT, Debug1_DHT11_PIN,1);
    22. DHT11_H;
    23. }
    24. /*********************************************方法定义*********************************************/
    25. // 输出配置
    26. void DHT11_GPIO_Out(void)
    27. {
    28. // 时钟 端口 引脚 输出模式 通用推挽输出
    29. GPIOxInit(Debug1_DHT11_RCC,Debug1_DHT11_PORT,Debug1_DHT11_PIN,GPIO_Mode_Out_PP);
    30. }
    31. // 输入配置
    32. void DHT11_GPIO_In(void)
    33. {
    34. // 时钟 端口 引脚 输入模式 GPIO_Mode_IN_FLOATING
    35. // GPIOxInit(Debug1_DHT11_RCC,Debug1_DHT11_PORT,Debug1_DHT11_PIN,GPIO_Mode_IN_FLOATING);
    36. // GPIO_Mode_IPU
    37. GPIOxInit(Debug1_DHT11_RCC,Debug1_DHT11_PORT,Debug1_DHT11_PIN,GPIO_Mode_IPU);
    38. }
    39. /*
    40. * 从DHT11读取一个字节,MSB先行
    41. */
    42. st_u8 DHT11_ReadByte ( void )
    43. {
    44. st_u8 i, temp=0;
    45. for(i=0;i<8;i++)
    46. {
    47. /*每bit以50us低电平标置开始,轮询直到从机发出 的50us 低电平 结束*/
    48. while(DHT11_Input==Bit_RESET);
    49. /*DHT11 以26~28us的高电平表示“0”,以70us高电平表示“1”,
    50. *通过检测 x us后的电平即可区别这两个状 ,x 即下面的延时
    51. */
    52. delay_us(40); //延时x us 这个延时需要大于数据0持续的时间即可
    53. if(DHT11_Input==Bit_SET)/* x us后仍为高电平表示数据“1” */
    54. {
    55. /* 等待数据1的高电平结束 */
    56. while(DHT11_Input==Bit_SET);
    57. temp|=(st_u8)(0x01<<(7-i)); //把第7-i位置1,MSB先行
    58. }
    59. else // x us后为低电平表示数据“0”
    60. {
    61. temp&=(st_u8)~(0x01<<(7-i)); //把第7-i位置0,MSB先行 高位先出。 高位 1111 1111 地位 左边高位,右边地位
    62. }
    63. }
    64. return temp;
    65. }
    66. /*
    67. * 一次完整的数据传输为40bit,高位先出
    68. * 8bit 湿度整数 + 8bit 湿度小数 + 8bit 温度整数 + 8bit 温度小数 + 8bit 校验和
    69. */
    70. st_u8 DHT11_Read_TempAndHumidity(DHT11_Data_TypeDef *DHT11_Data)
    71. {
    72. /*输出模式*/
    73. DHT11_GPIO_Out();
    74. /*主机拉低*/
    75. DHT11_L;
    76. /*延时18ms*/
    77. delay_ms(18);
    78. /*总线拉高 主机延时30us*/
    79. DHT11_H;
    80. delay_us(30); //延时30us
    81. /*主机设为输入 判断从机响应信号*/
    82. DHT11_GPIO_In();
    83. /*判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行*/
    84. if(DHT11_Input==Bit_RESET)
    85. {
    86. /*轮询直到从机发出 的80us 低电平 响应信号结束*/
    87. while(DHT11_Input==Bit_RESET);
    88. /*轮询直到从机发出的 80us 高电平 标置信号结束*/
    89. while(DHT11_Input==Bit_SET);
    90. /*开始接收数据*/
    91. DHT11_Data->humi_int= DHT11_ReadByte();
    92. DHT11_Data->humi_deci= DHT11_ReadByte();
    93. DHT11_Data->temp_int= DHT11_ReadByte();
    94. DHT11_Data->temp_deci= DHT11_ReadByte();
    95. DHT11_Data->check_sum= DHT11_ReadByte();
    96. /*读取结束,引脚改为输出模式*/
    97. DHT11_GPIO_Out();
    98. /*主机拉高*/
    99. DHT11_H;
    100. /*检查读取的数据是否正确*/
    101. // 一次完整的数据传输为40bit,高位先出。数据格式:8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据+8bit校验和
    102. if(DHT11_Data->check_sum == DHT11_Data->humi_int + DHT11_Data->humi_deci + DHT11_Data->temp_int+ DHT11_Data->temp_deci)
    103. return SUCCESS;
    104. else
    105. return ERROR;
    106. }
    107. else
    108. return ERROR;
    109. }
    110. /*********************************************测试部分*********************************************/
    111. void DHT11_Test1(void)
    112. {
    113. //int humi_buf[3]; // 湿度
    114. //int temp_buf[3]; // 温度
    115. /*调用DHT11_Read_TempAndHumidity读取温湿度,若成功则输出该信息*/
    116. if( DHT11_Read_TempAndHumidity (&DHT11_Data) == SUCCESS)
    117. {
    118. //printf("\r\n读取DHT11成功!\r\n\r\n湿度为%d.%d %RH ,温度为 %d.%d℃ \r\n",\
    119. // DHT11_Data.humi_int,DHT11_Data.humi_deci,DHT11_Data.temp_int,DHT11_Data.temp_deci);
    120. // 湿度转 十六进制转换为十进制
    121. //humi_buf[0]= DHT11_Data.humi_int/100+0x30;
    122. //humi_buf[0]= DHT11_Data.humi_int/10+0x30;
    123. // humi_buf[1]= DHT11_Data.humi_int%10+0x30;
    124. //humi_buf[2]= '0';
    125. printf("湿度:%d\r\n 温度:%d\r\n",DHT11_Data.humi_int,DHT11_Data.temp_int);
    126. // 湿度 十六进制转换为十进制
    127. //temp_buf[0]= DHT11_Data.humi_int/100+0x30;
    128. //temp_buf[1]= DHT11_Data.humi_int/10+0x30;
    129. //temp_buf[2]= DHT11_Data.humi_int%10+0x30;
    130. //printf("温度:%d\r\n",DHT11_Data.humi_int);
    131. }
    132. else
    133. {
    134. printf("Read DHT11 ERROR!\r\n");
    135. }
    136. delay_ms(20000);
    137. }

    四、串口及中断配置

    1. /********************************************* 中断优先级配置*********************************************/
    2. // 中断分组配置 NVIC_PriorityGroupConfig
    3. void NVIC_PG_Config(st_u32 PG)
    4. {
    5. /*
    6. 中断分组号 抢占式优先级 子优先级配置/响应式优先级 分配位数
    7. 0 0 0-15 抢0bit 响4bit(1111)
    8. 1 0~1 0~7 抢1bit 响3bit(0111)
    9. 2 0~3 0~3 抢2bit 响2bit(0011)
    10. 3 0~7 0~1 抢3bit 响1bit(0001)
    11. 4 0~15 0 抢4bit 响0bit(0000)
    12. 特征:在抢占式优先级相同的情况下,高响应优先级的中断优先被响应。
    13. 抢占式优先级数值越小,优先级越高
    14. */
    15. if(PG==NVIC_PriorityGroup_0)
    16. {
    17. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
    18. }else if(PG==NVIC_PriorityGroup_1){
    19. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
    20. }else if(PG==NVIC_PriorityGroup_2) {
    21. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    22. } else if(PG==NVIC_PriorityGroup_3){
    23. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);
    24. }else if(PG==NVIC_PriorityGroup_4){
    25. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
    26. }else{
    27. printf("%s","没有使用中断分组\r\n");
    28. }
    29. }
    30. // 中断优先级配置
    31. void NVIC_Config(st_u8 IRQn,st_u8 IRQChannelPriority,st_u8 IRQChannelSubPriority)
    32. {
    33. NVIC_InitTypeDef NVIC_InitStructure;
    34. NVIC_InitStructure.NVIC_IRQChannel = IRQn;
    35. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =IRQChannelPriority; // 抢占式优先级 0~15
    36. NVIC_InitStructure.NVIC_IRQChannelSubPriority =IRQChannelSubPriority ; // 子优先级 0~15
    37. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    38. NVIC_Init(&NVIC_InitStructure);
    39. }
    40. /*********************************************串口配置*********************************************/
    41. void USART_Config(st_u32 BaudRate,USART_TypeDef* USARTx)
    42. {
    43. USART_InitTypeDef USART_InitStructure;
    44. if(USARTx==USART1)RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
    45. if(USARTx==USART2)RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
    46. /* USART1工作模式配置 */
    47. USART_InitStructure.USART_BaudRate = BaudRate; //波特率设置:
    48. USART_InitStructure.USART_WordLength = USART_WordLength_8b; //数据位数设置:8位
    49. USART_InitStructure.USART_StopBits = USART_StopBits_1; //停止位设置:1位
    50. USART_InitStructure.USART_Parity = USART_Parity_No ; //是否奇偶校验:无
    51. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //硬件流控制模式设置:没有使能
    52. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//接收与发送都使能
    53. USART_Init(USARTx, &USART_InitStructure); //初始化USART1
    54. // 使能串口接收中断
    55. USART_ITConfig(USARTx, USART_IT_RXNE, ENABLE);
    56. // 使能中断发送
    57. USART_ITConfig(USARTx, USART_IT_TXE, ENABLE);
    58. USART_Cmd(USARTx, ENABLE); // USART使能
    59. }

    五、屏幕上显示数据

    5.1、屏幕内嵌指令

    1. // 清屏背景颜色
    2. void LCD_CLR(void)
    3. {
    4. st_u8 LCDDIR[]={"CLR(15);"};
    5. LCDUSART2_TX(LCDDIR);
    6. delay_ms(100);
    7. }
    8. // 背景颜色
    9. void LCD_SBC(void)
    10. {
    11. st_u8 LCDSBC[] = {"SBC(15);"};
    12. LCDUSART2_TX(LCDSBC);
    13. delay_ms(100);
    14. }
    15. // 设置背景灯光的亮度
    16. void LCDBL(void)
    17. {
    18. // 0~255 0亮度最高 255 关闭显示
    19. st_u8 LCDBL[]={"BL(30);"};
    20. LCDUSART2_TX(LCDBL);
    21. delay_ms(100);
    22. }

    5.2、静态数据

    1. // 静态数据
    2. void TempHumi_static(void)
    3. {
    4. //unsigned char i;
    5. // 指令设置 清除背景内容 竖向布局 白色背景颜色
    6. unsigned char PreInit[] = {"CLR(15);DIR(0);SBC(15)"};
    7. unsigned char PreInit1[] = {"CLR(15);DIR(0);SBC(15)"};
    8. LCDUSART2_TX(PreInit);
    9. delay_ms(100);
    10. LCDUSART2_TX(PreInit1);
    11. delay_ms(100);
    12. // TempHumi_STPE(0x09);
    13. // delay_ms(100);
    14. //
    15. // TempHumi_STPE(0x0A);
    16. // delay_ms(100);
    17. //
    18. // TempHumi_STPE(0x0B);
    19. // delay_ms(100);
    20. //
    21. // TempHumi_STPE(0x0C);
    22. // delay_ms(100);
    23. //
    24. // TempHumi_STPE(0x0D);
    25. // delay_ms(100);
    26. //
    27. // TempHumi_STPE(0x0E);
    28. // delay_ms(100);
    29. //
    30. // TempHumi_STPE(0x0F);
    31. // delay_ms(100);
    32. for(unsigned char i=0x09;i<=0x0F;i++)
    33. {
    34. TempHumi_STPE(i);
    35. delay_ms(100);
    36. }
    37. }
    1. // 温湿度界面 静态
    2. void TempHumi_STPE(st_u8 TempHumi_SINFO)
    3. {
    4. unsigned char Style[] = {"PL(0,62,127,62,1);PL(60,0,60,128,1)"};
    5. unsigned char HD_V[] = {"DC16(0,0,'HD_V:',1)"};
    6. unsigned char SF_V[] = {"DC16(64,0,'SF_V:',1)"};
    7. unsigned char Temp[] = {"DC16(0,64,'温度:',1)"};
    8. unsigned char Temp_unit[] ={"DC16(20,84,'℃',1)"};
    9. unsigned char Humi[] = {"DC16(64,64,'湿度:',1)"};
    10. unsigned char Humi_unit[] = {"DC16(100,84,'%',1)"};
    11. switch(TempHumi_SINFO)
    12. {
    13. case 0x01:
    14. case 0x02:
    15. case 0x03:
    16. case 0x04:
    17. case 0x05:
    18. case 0x06:
    19. case 0x07:
    20. case 0x08:
    21. case 0x09: // 湿度单位
    22. LCDUSART2_TX(Humi_unit);
    23. TempHumi_SINFO++;
    24. break;
    25. case 0x0A: // 温度单位
    26. LCDUSART2_TX(Temp_unit);
    27. TempHumi_SINFO++;
    28. break;
    29. case 0x0B: // 样式
    30. LCDUSART2_TX(Style);
    31. TempHumi_SINFO++;
    32. break;
    33. case 0x0C: // 硬件版本
    34. //LCDUSART2_TX("DC16(0,0,'HD_V:',1);");
    35. LCDUSART2_TX(HD_V);
    36. TempHumi_SINFO++;
    37. break;
    38. case 0x0D: // 软件版本
    39. LCDUSART2_TX(SF_V);
    40. TempHumi_SINFO++;
    41. break;
    42. case 0x0E: // 温度
    43. LCDUSART2_TX(Temp);
    44. TempHumi_SINFO++;
    45. break;
    46. case 0x0F: // 湿度
    47. LCDUSART2_TX(Humi);
    48. TempHumi_SINFO++;
    49. break;
    50. default:
    51. //LCD_Show=TempHumi_State;
    52. break;
    53. }
    54. }

    5.3、动态数据

    1. // 动态数据
    2. void TempHumi_Dynamic_Step(st_u8 Debug_Data)
    3. {
    4. switch(Debug_Data)
    5. {
    6. case 0x01:
    7. case 0x02:
    8. case 0x03:
    9. case 0x04:
    10. case 0x05:
    11. case 0x06:
    12. case 0x07:
    13. case 0x08:
    14. case 0x09:
    15. case 0x0A:
    16. case 0x0B:
    17. case 0x0C: // 硬件版本显示
    18. GetHD_ID(ChipUniqueID[0],0,20);
    19. break;
    20. case 0x0D: // 软件版本
    21. LCDDisSfVersion();
    22. break;
    23. case 0x0E: // 温度显示
    24. // TempHumi_Value(0,84,DHT11_Data.temp_int);
    25. // TempHumi_Data_DC16Boxf(DHT11_Data.temp_int,0,84);
    26. TempHumi_Data_DC16Boxf(Thic.Temp,0,84);
    27. break;
    28. case 0x0F: // 湿度显示
    29. // TempHumi_Data_DC16Boxf(Thic.Humi,64,84);
    30. // TempHumi_Data_DC16Boxf(Thic.Humi,64,84);
    31. // TempHumi_Value(64,84,DHT11_Data.humi_int);
    32. Data_Show_Position(Thic.Humi,64,84);
    33. break;
    34. default:
    35. break;
    36. }
    37. }
    1. // 动态数据
    2. void TempHumi_Dynamic(void)
    3. {
    4. TempHumi_Dynamic_Step(0x0C); // 硬件版本号
    5. delay_ms(100);
    6. TempHumi_Dynamic_Step(0x0D); // 软件件版本号
    7. delay_ms(100);
    8. TempHumi_Dynamic_Step(0x0E); // 温度显示
    9. delay_ms(1000); // 延时太短只上一个数据
    10. TempHumi_Dynamic_Step(0x0F); // 湿度显示
    11. delay_ms(1000);
    12. // for(unsigned char i=0x0C;i<=0x0F;i++)
    13. // {
    14. // TempHumi_Dynamic_Step(i);
    15. // delay_ms(100);
    16. // }
    17. }

    六、效果

    效果视频

  • 相关阅读:
    HDU 1213 - How Many Tables(并查集 or dfs)
    无序列表 – ul - li
    Java多线程案例【定时器】
    XML的解析
    boost序列化vector
    JavaScript如何解决单线程缺陷——webWorker
    jquery相关操作--但是高级有些不太明白
    ⚡性能优化之首屏秒开
    计算机视觉——两视图几何求解投影矩阵
    任意文件上传与Ewebeditor、fckeditor、CKFinder、southidceditor等编辑器漏洞(五)
  • 原文地址:https://blog.csdn.net/RONG_YAO/article/details/127329839