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