|
|
需要使用51單片機做一個模擬流水線產(chǎn)品計數(shù)器的設(shè)計,之前沒有用過對射式光電開關(guān)(如下圖1)。仿真圖和單片機程序都設(shè)計得差不多,現(xiàn)在拿到器件,看著說明書也不太懂,希望用過這個器件或者知道怎么用的朋友幫忙解釋一下,非常感謝。仿真圖里接單片機中斷串口的開關(guān),模擬光電開關(guān)的作用,之前閱讀資料后寫的代碼,當(dāng)開關(guān)輸入一個低電平的時候,單片機外部中斷計數(shù)一次。本人是初學(xué)單片機的小白==
#include<AT89x51.H>
#define uchar unsigned char
#define uint unsigned int
typedef unsigned int u16; //對數(shù)據(jù)類型進行聲明定義
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; //定義數(shù)據(jù)類型
uint dispcount=0;
sbit led=P1^4; //定義P1.4口是led
/*****延時函數(shù)*****/
void delay(uchar t)
{
uchar i,j;
for(i=0;i<t;i++)
for(j=13;j>0;j--);
}
/*****數(shù)碼管動態(tài)掃描:數(shù)據(jù)轉(zhuǎn)換的實現(xiàn)*****/
void xianshi()
{
c=date/10; //求十位
v=date%10; //求個位
P2=wei[0]; //2.0口位選高位
P0=duan[c]; //十位數(shù)的段選
delay(50);
P2=wei[1]; //2.1口位選地位
P0=duan[v]; //個位數(shù)的段選
delay(50);
}
/*****中斷函數(shù):外部中斷的實現(xiàn)*****/
void ExtInt0() interrupt 0 //中斷服務(wù)程序
{
dispcount++; //外部中斷一次,計數(shù)加一
if(dispcount>50) //計數(shù)范圍0~50
dispcount=1;
}
/***** Timer0Init : 定時器0初始化*****/
void Timer0Init()
{
TMOD|=0X01; //選擇為定時器0模式,工作方式1,僅用TR0打開啟動。
TH0=0XFC; //給定時器高八位賦初值,定時1ms
TL0=0X18;
ET0=1; //打開定時器0中斷允許
EA=1; //打開中斷總開關(guān)
TR0=1; //打開定時器0
}
/*****主函數(shù)*****/
void main()
{
// static u16 i;
TCON=0x01; //中斷設(shè)置 TCON寄存器(外部中斷觸發(fā)方式設(shè))
IE|=0x81; //IE外部中斷0請求標(biāo)志位 (總中斷開關(guān))
Timer0Init(); //定時器0初始化
while(1)
{
date=dispcount;
xianshi(); //調(diào)用數(shù)碼管顯示
}
}
/*****void Timer0() interrupt 1 : 定時器1中斷函數(shù)*****/
void Timer0() interrupt 1
{
static u16 i;
TH0=0XFC; //給定時器賦初值,定時1ms
TL0=0X18;
if(dispcount%10==0&&dispcount!=0) //判斷外部中斷是否達到10的整數(shù)倍,達到時使led閃爍兩秒
{
i++;
if(i%100==0) //100ms
led=~led; //led閃爍
if(i>=2000) //當(dāng)時間大于2s后,led熄滅
{
i=2000;
led=1;
}
}
else //當(dāng)不滿足外部中斷條件時,led保持關(guān)閉狀態(tài)
{
led=1;
i=0;
}
}
|
|