如何将干簧管脉冲信号通过单片机实现到数码管显示?

如何将干簧管脉冲信号通过单片机实现到数码管显示?,第1张

将干簧管脉冲信号通过单片机实现到数码管显示:

/********************************************************************

* 文件名  : 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)

}

}

}

RSD BIT P1.4 //热释电人接近汽车检测输入

GHG BIT P1.5干簧管车门开启检测输入

ZDJC BIT P1.6振动检测输入

DPLJC BIT P1.7多普勒检测人接近驾驶座输入

BJFS BIT P2.1报警发射输出端

FDJC BIT P2.2防盗解除遥控接收输入端

FDBF BIT P2.3防盗布防遥控接收输入端

VT BIT P2.4遥控接收有效输入端

YXBJ BIT P2.5音响报警信号输出端

DHKZ BIT P2.6发动机点火控制输出端

CMBF BIT P2.7车门开启检测布防控制信号输出端

BFBZ DATA 30H //定义防盗布防标志

JCBZ DATA 31H //定义防盗解除标志

ORG 00H

LJMP MAIN

ORG 30H

MAIN:

MOV BFBZ,#0 //定义防盗布防标志

MOV JCBZ,#1 //定义防盗解除标志

SETB EA 开总中断

SETB IT0 外部中断1设置为下降沿触发

SETB EX0开外部中断1

LOOP:

JNB VT,ZT1

JNB FDBF,XZ2 接收到布防遥控指令

XZ1:

MOV R7,#100

MOV R6,#0

ACALL DELAY按键消抖

MOV BFBZ,1置布防状态标志

MOV JCBZ,0清解除状态标志

XZ2:

JNB FDJC,ZT1接收到布防解除指令

MOV R7,#100

MOV R6,#0

ACALL DELAY按键消抖

MOV BFBZ,0清布防状态标志

MOV JCBZ,1置解除状态标志

ZT1:

MOV A,BFBZ

CJNE A,#1, ZT2布防状态

SETB DHKZ发动机点火闭锁

SETB CMBF开启车门开启检测

ZT2:

MOV A,JCBZ

CJNE A,#1, ZT2解除状态

CLR DHKZ发动机点火允许

CLR CMBF关闭车门开启检测

LJMP LOOP

DELAY:延时,给R6、R7赋值,R7表示X的低8位,R6为表示X的高8位

CLR A

MOV R5,A

MOV R4,A

D0:

CLR C

MOV A,R5

SUBB A,R7

MOV A,R4

SUBB A,R6

JNC D4

CLR A

MOV R3,A

MOV R2,A

D1:

INC R3

CJNE R3,#0,D2

INCR2

D2:

MOV A,R3

XRL A,#64H100

ORL A,R2

JNZ D1

INC R5

CJNE R5,#0,D3

INC R4

D3:

SJMP D0

D4:

RET

END

(未完)

指纹锁输入密码后显示门已反锁:

门锁确实已经被从内反锁!

指纹锁内锁上面一般都会有一个反锁旋钮

对应的有两个英文单词:

OPEN :开

CLOSE:关

当反锁旋钮被旋转到:CLOSE位置的时候,从外面用指纹或密码开锁就会显示门已反锁

处理方式:

1、呼叫屋内的人,将内锁上的反锁旋钮旋转到OPEN位置

2、有的指纹锁是带机械钥匙的,有的机械钥匙具有开反锁的功能,可以用机械钥匙开门试试。

现在市面上用的指纹密码锁主板上面大多都会有一个干簧管

而指纹锁内锁的反锁旋钮上面会固定一小块磁铁

屋内的人通过旋转反锁旋钮对门进行反锁的原理:

1、反锁旋钮转动带动连接锁芯的小方轴转动,从而带动锁芯内部的机械构件d出反锁用的方舌,达到反锁的效果;

2、当反锁旋钮被旋转到CLOSE位置的时候,反锁旋钮上面的磁铁会随着旋钮的转动而移动,并且刚刚处在内锁主板干簧管的感应区域以内;

3、门锁主板上面是烧写好了工程师所写的门锁运行系统程序的。当干簧管感应到了磁铁,门锁系统就会自动运行到反锁状态。所以从门外用指纹或者密码开门,外锁的显示屏上面会显示门已反锁。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11368106.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存