基于STC8H单片机通过按键修改阻尼值控制压力传感器采集压力值显示在段码屏,阻尼值越高,反应越慢,波动越小的程序
时间: 2023-12-13 19:03:41 浏览: 33
下面是基于STC8H单片机通过按键修改阻尼值控制压力传感器采集压力值并显示在段码屏上,阻尼值越高,反应越慢,波动越小的示例程序:
```
#include <STC8.H>
#define uchar unsigned char
#define uint unsigned int
sbit SCK = P1^0; // 74HC595时钟信号
sbit RCK = P1^1; // 74HC595锁存信号
sbit DIO = P1^2; // 74HC595数据信号
sbit KEY_UP = P3^2; // 上按键
sbit KEY_DOWN = P3^3; // 下按键
uint pressure_value = 0; // 压力传感器采样值
uchar damping = 1; // 阻尼值
uint display_value = 0; // 显示值
void delay_ms(uint ms) // 延时函数
{
uint i, j;
for(i = 0; i < ms; i++)
for(j = 0; j < 1141; j++);
}
void LED_display(uint value) // 数码管显示函数
{
uchar i;
uchar code led_table[] = // 数码管显示表
{
0x3F, 0x06, 0x5B, 0x4F, 0x66,
0x6D, 0x7D, 0x07, 0x7F, 0x6F
};
for(i = 0; i < 4; i++) // 4位数码管显示
{
DIO = 0; // 数据线置低
SCK = 0; // 时钟置低
DIO = led_table[value % 10]; // 发送数据
value /= 10;
SCK = 1; // 时钟上升沿
}
RCK = 1; // 锁存上升沿
RCK = 0; // 锁存下降沿
}
void ADC_init() // ADC初始化
{
P1ASF = 0x01; // P1.0设为模拟输入
ADC_RES = 0; // 结果寄存器清零
ADC_CONTR = 0x88; // A/D转换器工作在模式1,时钟频率12T
}
uint ADC_read() // ADC读取函数
{
uint value = 0;
ADC_CONTR |= 0x10; // 启动转换
while(!(ADC_CONTR & 0x20)); // 等待转换完成
value = ADC_RES;
value = (value << 2) | ADC_RESL; // 获取AD采样结果
return value;
}
void main()
{
ADC_init(); // ADC初始化
while(1)
{
if(KEY_UP == 0 && damping < 10) // 按上键,阻尼值+1
{
damping++;
delay_ms(50); // 消除按键抖动
}
if(KEY_DOWN == 0 && damping > 1) // 按下键,阻尼值-1
{
damping--;
delay_ms(50);
}
pressure_value = ADC_read(); // 获取压力传感器采样值
display_value += (pressure_value - display_value) / damping; // 计算显示值
LED_display(display_value); // 数码管显示
}
}
```
该程序使用74HC595芯片驱动4位共阳数码管进行显示,并通过上下按键控制阻尼值,使用阻尼值对采样值进行滤波,得到更稳定的显示结果。需要根据具体的数码管型号和硬件接口进行适当的修改。