找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4181|回复: 5
收起左侧

STM32F103C8T6_LCD2004_BMP280 显示气压温度

  [复制链接]
ID:87716 发表于 2019-9-30 22:49 | 显示全部楼层 |阅读模式
LCD200显示气压温度

单片机源程序如下:
  1. #include "bsp.h"
  2. #include "usart.h"
  3. #include "usb_lib.h"
  4. #include "hw_config.h"
  5. #include "memory.h"
  6. #include "usbio.h"
  7. #include "delay.h"
  8. #include "timer.h"
  9. #include "mpuiic.h"
  10. #include "mpu9250.h"
  11. #include "bmp280.h"
  12. #include "lcd1602.h"
  13. #include "1602iic.h"
  14. #include "LiquidCrystal_I2C.h"

  15. extern uint8_t USB_Received_Flag;
  16. uint8_t USB_ReceData[64];
  17. uint8_t IDxxx[32];
  18. Update_Set_TypeDef update;
  19. my_time TIME={0};//显示时间的结构体
  20. volatile SerialBuffType m_Usart1Recv = SerialBuffDefault();
  21. unsigned char LCD_data = 0x08;//全局变量 缺省状态 00001000使背光开启  00000000背光关闭

  22. #define N 12
  23. u32 bmp280_tempValue[N]={0};
  24. u32 bmp280_pressValue[N]={0};
  25. s32 bmp280_temp;
  26. u32 bmp280_press;
  27. u8 nCount=0,nFlag=0;
  28. char buf[20]={0};

  29. static void Usart1_RecvOneChar(u8 RecvCharacter);
  30. static void TimEndHandle(void);

  31. int main(void)
  32. {
  33.         uint32_t i=0;

  34. //        NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x5000);
  35. //        ENABLE_INT();//使能全局中断
  36.        
  37.         delay_init();
  38.         LED_Init();//初始化
  39.         TIM2_Init();//通用定时器2初始化
  40.         TIM_Delay_Init();//(TIM3)
  41.         TIM4_Init();//
  42.         USART1_Init(115200);//串口1初始化
  43.         IIC_Init();       
  44.         BMP280_Init();
  45.        
  46.         Set_System();//系统时钟初始化
  47.         USB_Interrupts_Config();
  48.         Set_USBClock();
  49.         USB_Init();  // 初始化完成后 就等待设备枚举成功
  50.         //USB打开的中断
  51.         /********************************************
  52.         IMR_MSK (CNTR_CTRM  | CNTR_WKUPM | CNTR_SUSPM | CNTR_ERRM  | CNTR_SOFM \
  53.                                          | CNTR_ESOFM | CNTR_RESETM )
  54.         ********************************************/
  55.        
  56.         //LCDI2C_init(0x27,16,2);//初始化LCD1602
  57.         LCDI2C_init(0x27,20,4);//初始化LCD2004
  58.         // Quick 3 blinks of backlight
  59.         for( i = 0; i< 3; i++)
  60.         {
  61.                 LCDI2C_setBacklight(1);//背光开关
  62.                 Delay(250);
  63.                 LCDI2C_setBacklight(0);
  64.                 Delay(250);
  65.         }
  66.         LCDI2C_setBacklight(1); // finish with backlight on
  67.         Delay(2000);
  68.         LCDI2C_clear();
  69.         LCDI2C_write_String("STM32F103C8T6_TEST  ");

  70.         Usart1_SetIRQCallBack(Usart1_RecvOneChar);
  71.         TIM4_SetIRQCallBack(TimEndHandle);

  72.         MemSet((u8 *)&update,0,sizeof(Update_Set_TypeDef));
  73.         if(EE_IsHaveStoreData(STORE_FLAG,STORE_ADDRESS))
  74.         {
  75.                 EE_FlashReadFlag(STORE_FLAG,STORE_ADDRESS,(u8 *)&update,sizeof(Update_Set_TypeDef));
  76.                 Get_ChipID(IDxxx);
  77.                 if(update.OldOrNew==0xaa)
  78.                 {
  79.                         if(!strstr((char *)IDxxx,(char *)update.IDxxx))
  80.                         {
  81.                                 while(1)
  82.                                 {
  83.                                         delay_ms(5000);
  84.                                         printf("Eorror\r\n");
  85.                                 }
  86.                                
  87.                         }
  88.                 }
  89.         }
  90.         else
  91.         {
  92.                 printf("ReadStoerEorror\r\n");
  93.         }

  94.         i=0xffffff;
  95.         while(i--);  //等待usb枚举完成
  96.        
  97.         printf("\r\nAPP 初始化完成\r\n");
  98.         while(1)
  99.         {
  100.                 if(IS_TIMEOUT_10MS(3, 100))//间隔1000毫秒执行1次
  101.         {
  102.                         LED0=!LED0;
  103.                         BMP280_ReadPressureTemperature(&bmp280_press,&bmp280_temp);//bmp280获取气压值和温度
  104.                         bmp280_tempValue[nCount]=bmp280_temp;
  105.                         bmp280_pressValue[nCount]=bmp280_press;
  106.                         nCount++;
  107.                         if(nCount>=N)
  108.                         {
  109.                                 nCount=0;
  110.                                 bmp280_temp=FILTER_median(bmp280_tempValue,N,1);//中位值平均滤波
  111.                                 bmp280_press=FILTER_median(bmp280_pressValue,N-1,0);//中位值滤波
  112.                                 MemSet((u8 *)buf,0,20);
  113.                                 sprintf(buf,"press:%d",bmp280_press);
  114.                                 printf("bmp280_%s\r\n",buf);
  115.                                 LCDI2C_Show_Str(0,2,buf);//(2004)
  116.                                 MemSet((u8 *)buf,0,20);
  117.                                 sprintf(buf,"temp:%d",bmp280_temp);
  118.                                 printf("bmp280_%s\r\n",buf);
  119.                                 LCDI2C_Show_Str(0,3,buf);//(2004)
  120.                         }
  121.                         TIME.second++;
  122.                         if(TIME.second>59)
  123.                         {
  124.                                 TIME.second=0;
  125.                                 TIME.minute++;
  126.                                 if(TIME.minute>59)
  127.                                 {
  128.                                         TIME.minute=0;
  129.                                         TIME.hour++;
  130.                                         if(TIME.hour>23)
  131.                                         {
  132.                                                 TIME.hour=0;
  133.                                                 TIME.date++;
  134.                                         }
  135.                                 }
  136.                         }
  137.                         MemSet((u8 *)buf,0,20);
  138.                         sprintf(buf,"run %03d %02d:%02d:%02d",TIME.date,TIME.hour,TIME.minute,TIME.second);
  139.                         LCDI2C_Show_Str(0,1,buf);//(2004)
  140.                 }
  141.                 if(USB_Received_Flag)//判断usb是否接收到数据
  142.                 {
  143.                         USB_Received_Flag=0;
  144.                         USB_GetData(USB_ReceData,64);
  145.                         printf("%s\r\n",USB_ReceData);
  146.                         //delay_ms(20);
  147.                         USB_SendData(USB_ReceData,64);
  148.                 }
  149.                 if(m_Usart1Recv.len > 0)
  150.                 {
  151.                         if(m_Usart1Recv.len > 1)
  152.                         {
  153.                                 printf("%s",m_Usart1Recv.buf);
  154.                         }
  155.                         else
  156.                         {
  157.                                 switch (m_Usart1Recv.buf[0])
  158.                                 {
  159.                                         case 0x6f: //o
  160.                                                 i2cWriteByte(BACKLIGHT_ON);
  161.                                         break;
  162.                                         case 0x63: //c
  163.                                                 i2cWriteByte(BACKLIGHT_OFF);
  164.                                         break;
  165.                                         case 0x02: //Ctrl+b
  166.                                                 //功能待定
  167.                                                 update.boot_type=1;//1为Bootloader
  168.                                                 //EE_FlashWrite(STORE_FLAG,STORE_ADDRESS,(u8 *)&update,sizeof(Update_Set_TypeDef));//写flash
  169.                                                 printf("重启进入Bootloader模式\r\n");
  170.                                         break;   
  171.                                         default :
  172.                                                 printf("Error 0x%02x\r\n",m_Usart1Recv.buf[0]);                       
  173.                                         break;
  174.                                 }
  175.                         }
  176.                         MemSet((u8 *)&m_Usart1Recv.buf,0,USART1_BUFF_LANGTH);
  177.                         m_Usart1Recv.len = 0;
  178.                 }
  179.         }
  180. }

  181. //USART1接收到一个字符
  182. static void Usart1_RecvOneChar(u8 RecvCharacter)
  183. {
  184.     if(m_Usart1Recv.ind >= USART1_BUFF_LANGTH)
  185.         return;
  186.         
  187.     if(m_Usart1Recv.len > 0)
  188.         return;
  189.         
  190.     m_Usart1Recv.buf[m_Usart1Recv.ind++] = RecvCharacter;
  191.         TIM_Open(TIM4);//定时器重新计数
  192. }

  193. //USART1接收字符超时回调函数
  194. static void TimEndHandle(void)
  195. {
  196.         TIM_Close(TIM4);//关闭定时器
  197.     m_Usart1Recv.len = m_Usart1Recv.ind;
  198.     m_Usart1Recv.ind = 0;
  199. }

  200. #ifdef  USE_FULL_ASSERT
  201. /**
  202.   * @brief  报告在检查参数发生错误时的源文件名和错误行数
  203.   * @param  file 源文件名
  204.   * @param  line 错误所在行数
  205.   * @retval None
  206.   */
  207. void assert_failed(uint8_t* file, uint32_t line)
  208. {
  209.     /* 用户可以增加自己的代码用于报告错误的文件名和所在行数,
  210.        例如:printf("错误参数值: 文件名 %s 在 %d行\r\n", file, line) */

  211.     /* 无限循环 */
  212.     while (1)
  213.     {
  214.     }
  215. }
  216. #endif

  217. /*********************************END OF FILE**********************************/
复制代码

所有资料51hei提供下载:
STM32F103C8T6_LCD2004_BMP280.7z (373.16 KB, 下载次数: 198)
回复

使用道具 举报

ID:127004 发表于 2019-10-18 20:11 | 显示全部楼层
自己写了程序,调试了一天都调试不成功,下载下来参考一下
回复

使用道具 举报

ID:820243 发表于 2022-11-25 16:15 | 显示全部楼层
楼主厉害
自己写了程序,调试了一天都调试不成功,下载下来参考一下
回复

使用道具 举报

ID:950976 发表于 2022-12-4 16:47 | 显示全部楼层
自己写了程序,调试了一天都调试不成功,下载下来参考一下
回复

使用道具 举报

ID:337280 发表于 2022-12-15 14:36 | 显示全部楼层
谢谢作者。。。
回复

使用道具 举报

ID:735831 发表于 2024-6-6 21:24 | 显示全部楼层
多谢楼主分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表