找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3749|回复: 3
打印 上一主题 下一主题
收起左侧

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

[复制链接]
跳转到指定楼层
楼主
      需要使用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;
        }
}


7KM3WM8DBFY[MA45SV0K$W6.png (368.52 KB, 下载次数: 61)

图一

图一

NGEFDNWMCOYI2E[XE2~K{{4.png (58.24 KB, 下载次数: 41)

光电开关使用说明

光电开关使用说明

F8`B]Z$%L{9386`5(T{YA{7.png (47.23 KB, 下载次数: 39)

仿真电路图

仿真电路图
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

地板
ID:213173 发表于 2020-5-30 18:01 | 只看该作者
本帖最后由 wulin 于 2020-5-30 21:22 编辑

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

使用道具 举报

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

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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