发布网友 发布时间:2022-05-29 06:40
共5个回答
热心网友 时间:2023-10-09 18:17
将干簧管脉冲信号通过单片机实现到数码管显示:
/********************************************************************
* 文件名 : TLC549.c
* 描述 : 该程序实现了对TLC549的控制。通过TLC549把电压转换为数字信号并通过数码管显示出来。实际工作中进行AD采样时,一般都要把AD信号处理后再用。在这里,采集了30次,去掉最大和最小的5个,中间20个取平均值,最大限度的保证了所要采集AD的准确性。
***********************************************************************/
#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit AD_Out = P3^2; //TLC549输出端
sbit CS = P1^0; //TLC549片选信号
sbit AD_In = P1^1; //TLC549输入端
uchar code table[10] = {0x03, 0x9f, 0x25, 0x0d, 0x99, 0x49, 0x41, 0x1f, 0x01, 0x09};
uchar code table_d[10] = {0x02, 0x9e, 0x24, 0x0c, 0x98, 0x48, 0x40, 0x1e, 0x00, 0x08}; //带点数码管显示
/********************************************************************
* 名称 : AD_Change(void)
* 功能 : TLC549驱动程序,在“视频及教程”中有讲解。
* 输入 : 无
* 输出 : temp (电压值)
***********************************************************************/
uchar AD_Change(void)
{
uchar i,temp = 0;
CS = 0;
_nop_();
_nop_();
_nop_();
_nop_();
for(i=0; i<8; i++)
{
AD_In = 1;
_nop_();
_nop_();
temp = temp << 1;
if(AD_Out == 1) temp += 1;
AD_In = 0;
_nop_();
_nop_();
}
CS = 1;
return temp;
}
/********************************************************************
* 名称 : Delay()
* 功能 : 延时,延时时间为 1ms * del
* 输入 : del
* 输出 : 无
***********************************************************************/
void Delay(uint del)
{
uchar i, j;
for(i=0; i
for(j=0; j<=148; j++)
;
}
/***********************************************************************
* 名 称: Average()
* 功 能: 中位值平均滤波法,取一共三十个数据,最大和最小的五个数据不要
对中间的二十个数据求平均值
* 输 入: 三十个待处理的值
* 输 出:得到一个中位的平均值
***********************************************************************/
uint Average(uint buffer[30])
{
uchar i,j;
uint temp;
for(i=1; i<30; i++) ////先对整个数组的三十个值进行从小到大的排列
for(j=29; j>=i; --j)
{
if(buffer[j-1] > buffer[j])
{
temp = buffer[j-1];
buffer[j-1] = buffer[j];
buffer[j] = temp;
}
}
////对数组进行处理,去掉一个最大值和一个最小值,中间的二十个值再来求平均值
temp = 0;
for(i=5; i<25; i++)
{
temp += buffer[i];
}
temp = (uint)(((float)temp) / 20 + 0.5);
return(temp);
}
/***********************************************************************
* 名 称: AD_Filter()
* 功 能: 进行AD采集30次,并进行滤波处理
* 输 入: 三十次AD采集值
* 输 出:经过处理后的AD值
***********************************************************************/
uint AD_Filter()
{
uint Date_Buffer[30] = {0}, temp;
uchar i;
for(i=0; i<30; i++)
{
Date_Buffer[i] = AD_Change();
Delay(1); //延时1毫秒采集一次。这里可以根据工作需要调整时间。
}
temp = Average(Date_Buffer);
return(temp);
}
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main()
{
uint i = 0,temp;
uint j;
P2 = 0x00;
P1 = 0xff;
while(1)
{
temp = AD_Filter();
j = temp * 2;
for(i=0; i<40; i++)
{
P0 = table_d[j / 100];
P2 = 0x04;
Delay(10);
P0 = table[j/ 10 % 10];
P2 = 0x02;
Delay(10);
P0 = table[j % 10];
P2 = 0x01;
Delay(10);
}
}
}
热心网友 时间:2023-10-09 18:17
请先深刻理解干簧管和霍尔传感器区别和相同点,这2种传感器用的场合有点类似.
干簧管:机械结构,有常开,常闭2种,适合低速场合,成本较低(就是个开关)
霍尔传感器:根据磁钢的霍尔效应并经过运放放大和比较输出高低电平的开关变化(也有集电极开路),可适合高速场合测速,成本较高.
所以干簧管脉冲信号可以和手动开关一样与单片机中断脚或IO口相连,电容是可选的,再经过你软件的去抖和周期判断输出给数码管显示. 附张图你就清楚了!
热心网友 时间:2023-10-09 18:18
不难。一端接一IO口,另一端接地就可以了。热心网友 时间:2023-10-09 18:19
干簧管输出为干接点信号,将一端接地,另一端通过电阻接电源,接电阻端与单片机IO口(计数器计数输入引脚、计数器捕获引脚、外部中断引脚或普通IO口均可),当干簧管闭合时,单片机检测到得电平为低电平,干簧管断开时,单片机检测到的是高电平。如果是计数器捕获捕获,可开启防扰动功能,如果是外部中断引脚,可设置为下降沿中断。如果单片机引脚本身无抗扰动措施,软件增加防扰动处理。热心网友 时间:2023-10-09 18:19
首先频率不能太高,这个问题其实不是很难,我的学习板上就有数码管,加上干簧管,编上程序就OK了