| 本帖最后由 jinglixixi 于 2023-8-2 11:04 编辑 
 #申请原创# @21小跑堂
 
 
 将点阵显示屏与RTC计时器及传感器结合起来可构成一个多功能的信息显示牌,这里仅以温度与大气压传感器为例来加以介绍,至于用RTC计时器来实现电子时钟的方法可参见: https://bbs.21ic.com/icview-3310866-1-1.html 
 图1  电子时钟显示效果 
 
 BMP085是一种温度与大气压传感器,它采用I2C接口来工作,其与开发板的连接关系为: SCL ---P00 SDA ---P32 
 为便于输出高低电平,所作的语句定义为: #define SCL_Set1()      GPIO_SetBits(GPIO0, GPIO_Pin_0) #define SCL_Clr1()      GPIO_ResetBits(GPIO0, GPIO_Pin_0) #define SDA_Set1()      GPIO_SetBits(GPIO3, GPIO_Pin_2) #define SDA_Clr1()      GPIO_ResetBits(GPIO3, GPIO_Pin_2) 
 为读取数据引脚的状态,所作的语句定义为: #define SDA_IN          GPIO_ReadInputDataBit(GPIO3,GPIO_Pin_2) 
 由于在工作过程中,数据引脚要在输入与输出模式间频繁变换,故为模式切换定义了相应的模式设置函数,其内容如下: void INPUT_MODE_SET()
{
    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_StructInit(&GPIO_InitStruct);
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_InitStruct.GPIO_Pin =  GPIO_Pin_2;
    GPIO_Init(GPIO3, &GPIO_InitStruct);
}
void OUTPUT_MODE_SET()
{
    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_StructInit(&GPIO_InitStruct);
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStruct.GPIO_Pin =  GPIO_Pin_2;
    GPIO_Init(GPIO3, &GPIO_InitStruct);
}
 在BMP085完成数据检测后,需通过数值变换来生成标准的显示值,实现该变换处理的函数为: void bmp085Convert()
{
      unsigned int ut;
      unsigned long up;
      long x1, x2, b5, b6, x3, b3, p;
      unsigned long b4, b7;
      ut = bmp085ReadTemp();
      up = bmp085ReadPressure();
      x1 = (((long)ut - (long)ac6)*(long)ac5) >> 15;
      x2 = ((long) mc << 11) / (x1 + md);
      b5 = x1 + x2;
      temperature1 = ((b5 + 8) >> 4);
      b6 = b5 - 4000;
      x1 = (b2 * (b6 * b6)>>12)>>11;
      x2 = (ac2 * b6)>>11;
      x3 = x1 + x2;
      b3 = (((((long)ac1)*4 + x3)<<OSS) + 2)>>2;
      x1 = (ac3 * b6)>>13;
      x2 = (b1 * ((b6 * b6)>>12))>>16;
      x3 = ((x1 + x2) + 2)>>2;
      b4 = (ac4 * (unsigned long)(x3 + 32768))>>15;
      b7 = ((unsigned long)(up - b3) * (50000>>OSS));
      if (b7 < 0x80000000)
            p = (b7<<1)/b4;
      else
            p = (b7/b4)<<1;
      x1 = (p>>8) * (p>>8);
      x1 = (x1 * 3038)>>16;
      x2 = (-7357 * p)>>16;
      pressure = p+((x1 + x2 + 3791)>>4);
}
 实现温度显示的函数为: void t_disp(void)
{
          long  mm;
          mm=temperature1/10;
          sj[0]=13;
          sj[1]=15;
          sj[2]=mm%100/10;
          sj[3]=mm%10;
          sj[4]=12;
          sj[5]=18;
          sj[6]=12;
          sj[7]=12;
}
 实现大气压显示的函数为: void p_disp(void)
{
          long  mm;
          mm=pressure/100;
          sj[0]=14;
          sj[1]=15;
          sj[2]=mm/1000;
          sj[3]=mm%1000/100;
          sj[4]=mm%100/10;
          sj[5]=mm%10;
          sj[6]=16;
          sj[7]=17;
}
 在以上函数的支持下,实现信息自动切换显示功能的主程序为: int main(void)
{
        u32 p;
        u8 o=0;
        Hardware_init();
        Delay_Ms(500);
        ScanRow=0;
        Init_BMP085();
        dzb_init();
        bmp085Convert();
        while (1)
        {
             for(p=0;p<40000;p++)
             {
                      Display();
             }
             o=(o+1)%2;
             bmp085Convert();
             f(o==1)
             {
                     p_disp();
             }
             else
             {
                     t_dispp(); 
             }
        }
}
 经程序的编译和下载,其显示效果如图2和图3所示。 
 图2  大气压显示效果 
 图3  温度显示效果 
 演示视频: 
 
 
 |