钻石会员
主题
回帖0
积分10261
阅读权限50
注册时间2012-5-17
最后登录1970-1-1
在线时间 小时
|
事情是这样的,打算用51单片机代替PLC用在机器上(对控制方面要求不高就几个动作)!硬件上面用的51单片机输入用光耦隔离输出用ULN2003,为了能准确的识别输入信号并做好滤波,用中断采集输入处理后存储在内存,当比较连续采集的三次某位上的数据一样时对应翻转改位(抗干扰防止输入的按键及信号的抖动)!该程序能实时的准确的判断P1口的每一位的高或低的状态!P2输出状态指示!响应时间3.3ms程序如下!请大家提点建议
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
unsigned char nc1,nc2,nc3; //8位变量
unsigned char bdata key_scan; //在可位寻址区定义ucsigned char 类型的变量 该变量为处理后in的实际值
unsigned char data key_buffer[24]; //I/O数据缓存3*8
unsigned char code key_constant[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //key的8个位的常量
void time0() //定义中断
{
TMOD=0x01;
TH0 = 0x0F3; //12M 3.3ms
TL0 = 0x1C; //12T
EA = 1;
TR0 = 1;
ET0 = 1;
}
void time0_prg() interrupt 1 using 1 //中断入口程序
{
TH0 = 0x0F3; //12M 3.3ms //
TL0 = 0x1C; //12T //设置中断扫描时间
nc2=P1;
for(nc3=0;nc3<8;nc3++) //扫描8个I/O
{
key_buffer[nc1*8+nc3]=nc2&key_constant[nc3]; //将扫描结果存放到内存以便之后比较处理
}
nc1++; //中断扫描三次 3*8=24位缓存
if(nc1==3) nc1=0;
}
void in_scan() //对输入I/O以3.3ms的速度连续扫描!当连续的某位3次数据相同则认为I/O变化!并输出相应位的变化
{ //当出现干扰 连续的某位3次数据不同的时候则认为是干扰!不操作相应位的变化
uchar n4;
for(n4=0;n4<8;n4++) ////比较8个I/O口
{
if(key_buffer[n4]==key_buffer[8+n4]) //比较之前第一次和第二次的数据
{
if(key_buffer[n4]==key_buffer[16+n4]) //比较之前第二次和当前这次的数据
{
if(key_buffer[n4]) key_scan=key_scan&~key_constant[n4]; //检测到三次输入为1,则设置对应位为0;
else key_scan=key_scan|key_constant[n4]; //检测到三次输入为0,则设置对应位为1;
} //否则不执行任何操作
}
}
}
void main()
{
time0(); //开定时器0
while(1)
{
in_scan(); //执行按键扫描
P2=key_scan; //更新输出
}
}
|
|