|
制作光電計數(shù)器,仿真和實物都一步步摸索過來... 又有想不明白的地方,請做過或者了解的朋友能指導(dǎo)或者分享一下經(jīng)驗、看法,謝謝大家!!
采用槽型光耦,當(dāng)計數(shù)是十的整數(shù)倍時,連接單片機(jī)的led報警閃爍2s, 下方還有兩個led的模塊是光電轉(zhuǎn)換模塊,一個led作電源指示(綠色),另一個作開關(guān)指示(紅色)。仿真圖如圖1,視頻是實物操作。
問題: 1、感覺當(dāng)物體經(jīng)過光電開關(guān)時,數(shù)碼管顯示的計數(shù)值和物體的速度有關(guān),速度快計數(shù)跳變少,速度慢計數(shù)很多!但仿真時不是這樣的啊。光電計數(shù)模塊的輸出作為外部中斷的輸入。
2、當(dāng)物體經(jīng)過速度變慢時,感覺物體進(jìn)入和出來,數(shù)碼管會產(chǎn)生兩次跳變!不應(yīng)該啊。。。
已經(jīng)檢查過實際電路,感覺沒有問題,應(yīng)該是代碼的問題?但是本人小白一個,而且仿真也沒有問題,現(xiàn)在很迷茫。。
代碼:
#include<AT89x51.H>
#define uchar unsigned char
#define uint unsigned int
typedef unsigned int u16; //對數(shù)據(jù)類型進(jìn)行聲明定義
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)掃描*****/
void xianshi()
{
/***數(shù)據(jù)轉(zhuǎn)換***/
c=date/10; //求十位
v=date%10; //求個位
P2=wei[0];
P0=duan[c];
delay(20);
P2=wei[1];
P0=duan[v];
delay(20);
}
/*****中斷函數(shù)*****/
void ExtInt0() interrupt 0 //中斷服務(wù)程序
{
dispcount++; //外部中斷一次,計數(shù)加一
if(dispcount>99) //計數(shù)范圍0~50
dispcount=1;
}
/*******************************************************************************
* 函 數(shù) 名 : Timer0Init
* 函數(shù)功能 : 定時器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寄存器
IE|=0x81; //IE外部中斷0請求標(biāo)志位
Timer0Init(); //定時器0初始化
while(1)
{
date=dispcount;
xianshi(); //調(diào)用數(shù)碼管顯示
}
}
/*******************************************************************************
* 函 數(shù) 名 : void Timer0() interrupt 1
* 函數(shù)功能 : 定時器1中斷函數(shù)
*******************************************************************************/
void Timer0() interrupt 1
{
static u16 i;
TH0=0XFC; //給定時器賦初值,定時1ms
TL0=0X18;
if(dispcount%10==0&&dispcount!=0)
{
i++;
if(i%100==0) //100ms
led=~led;
if(i>=2000) //時間大于2s
{
i=2000;
led=1;
}
}
else
{
led=1;
i=0;
}
}
|
|