|
需要使用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;
}
}
|
|