本帖最后由 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 温度显示效果
演示视频:
|