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