打印
[LKS32 硬件]

【凌鸥创芯电机开发板LKS32MC071CBT8评测报告】+多功能信息牌的实现

[复制链接]
472|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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  温度显示效果

演示视频:


使用特权

评论回复
沙发
caigang13| | 2023-8-1 07:31 | 只看该作者
这个点阵屏是智能接口的,还是直接控制。

使用特权

评论回复
板凳
jinglixixi|  楼主 | 2023-8-1 13:11 | 只看该作者
caigang13 发表于 2023-8-1 07:31
这个点阵屏是智能接口的,还是直接控制。

直接控制

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

446

主题

2675

帖子

37

粉丝