找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4202|回复: 3
收起左侧

求教,对射式光电开关连接单片机的使用方法

[复制链接]
ID:676703 发表于 2020-5-30 15:27 | 显示全部楼层 |阅读模式
      需要使用51单片机做一个模拟流水线产品计数器的设计,之前没有用过对射式光电开关(如下图1)。仿真图和单片机程序都设计得差不多,现在拿到器件,看着说明书也不太懂,希望用过这个器件或者知道怎么用的朋友帮忙解释一下,非常感谢。仿真图里接单片机中断串口的开关,模拟光电开关的作用,之前阅读资料后写的代码,当开关输入一个低电平的时候,单片机外部中断计数一次。本人是初学单片机的小白==

#include<AT89x51.H>
#define uchar unsigned char
#define uint unsigned int
typedef unsigned int u16;          //对数据类型进行声明定义
typedef unsigned char u8;
uchar duan[10]={0xc0,0Xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //所需的段的位码
uchar wei[2]={0X01,0X02}; //位的控制端
uint c,v,date; //定义数据类型
uint dispcount=0;

sbit led=P1^4;         //定义P1.4口是led
/*****延时函数*****/
void delay(uchar t)
{
        uchar i,j;
        for(i=0;i<t;i++)
                for(j=13;j>0;j--);
}
/*****数码管动态扫描:数据转换的实现*****/
void xianshi()
{
        c=date/10;      //求十位
        v=date%10;      //求个位
        P2=wei[0];                //2.0口位选高位
        P0=duan[c];                //十位数的段选
        delay(50);
        P2=wei[1];                //2.1口位选地位
        P0=duan[v];                //个位数的段选
        delay(50);
}
/*****中断函数:外部中断的实现*****/
void ExtInt0() interrupt 0   //中断服务程序
{
        dispcount++;        //外部中断一次,计数加一
        if(dispcount>50)   //计数范围0~50
                dispcount=1;
}
/***** Timer0Init : 定时器0初始化*****/
void Timer0Init()
{
        TMOD|=0X01; //选择为定时器0模式,工作方式1,仅用TR0打开启动。
        TH0=0XFC;   //给定时器高八位赋初值,定时1ms
        TL0=0X18;        
        ET0=1;      //打开定时器0中断允许
        EA=1;       //打开中断总开关
        TR0=1;      //打开定时器0                        
}
/*****主函数*****/
void main()
{
//        static u16 i;
        TCON=0x01;     //中断设置 TCON寄存器(外部中断触发方式设)
        IE|=0x81;       //IE外部中断0请求标志位   (总中断开关)
        Timer0Init();  //定时器0初始化
        while(1)
        {
                date=dispcount;
                xianshi();           //调用数码管显示   
        }
}
/*****void Timer0() interrupt 1 : 定时器1中断函数*****/
void Timer0() interrupt 1
{
        static u16 i;
        TH0=0XFC;        //给定时器赋初值,定时1ms
        TL0=0X18;
        if(dispcount%10==0&&dispcount!=0)          //判断外部中断是否达到10的整数倍,达到时使led闪烁两秒
        {
                i++;
                if(i%100==0)       //100ms
                        led=~led;  //led闪烁
                if(i>=2000)       //当时间大于2s后,led熄灭
                {
                        i=2000;
                        led=1;
                }
        }
        else                 //当不满足外部中断条件时,led保持关闭状态
        {
                led=1;   
                i=0;
        }
}


图一

图一

光电开关使用说明

光电开关使用说明

仿真电路图

仿真电路图
回复

使用道具 举报

ID:94031 发表于 2020-5-30 16:14 | 显示全部楼层
说明已经很清楚,三根线一个接电源负,一根接电源正,信号输出接计数中断输入,模块槽中有东西经过计数一次。
回复

使用道具 举报

ID:676703 发表于 2020-5-30 17:51 | 显示全部楼层
xuyaqi 发表于 2020-5-30 16:14
说明已经很清楚,三根线一个接电源负,一根接电源正,信号输出接计数中断输入,模块槽中有东西经过计数一次 ...

有物体经过时,开关输出高电平是吗?程序是按照单片机输入低电平写的,那就要改一下?
回复

使用道具 举报

ID:213173 发表于 2020-5-30 18:01 | 显示全部楼层
本帖最后由 wulin 于 2020-5-30 21:22 编辑

使用说明很清楚:槽中无遮挡输出低电平,有遮挡输出高电平。你对产品计数,传送带上就得满足上述条件。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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