一乐电子

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 2093|回复: 5

写了段51的I/O口扫描程序!大家提点意见!

[复制链接]
发表于 2013-5-2 14:00 | 显示全部楼层 |阅读模式
     事情是这样的,打算用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;       //更新输出
    }  
}
发表于 2013-5-2 17:16 | 显示全部楼层
要求不高的地方可以用用,否则还是别省钱了!
我们车间控制4个电磁阀都要用一个20点PLC,不花自己钱就是不知道心疼啊!
回复

使用道具 举报

 楼主| 发表于 2013-6-28 00:02 | 显示全部楼层
在设备上用了个把月了!经实践发现效果很好!大家可以放心用
回复

使用道具 举报

发表于 2013-7-3 19:37 来自手机 | 显示全部楼层
加入看门狗吧!
回复

使用道具 举报

 楼主| 发表于 2013-7-3 19:40 | 显示全部楼层
看门狗有加的在中断2中!中断2是做PLC的那种计时器用的!是用中断扫描计时!
回复 1 0

使用道具 举报

发表于 2013-7-30 04:28 | 显示全部楼层
仿真测试了一下,很不错。好用!
回复

使用道具 举报

本版积分规则

QQ|一淘宝店|手机版|商店|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2025-11-2 00:41 , Processed in 0.032867 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表