|
制作光電計數器,仿真和實物都一步步摸索過來... 又有想不明白的地方,請做過或者了解的朋友能指導或者分享一下經驗、看法,謝謝大家!!
采用槽型光耦,當計數是十的整數倍時,連接單片機的led報警閃爍2s, 下方還有兩個led的模塊是光電轉換模塊,一個led作電源指示(綠色),另一個作開關指示(紅色)。仿真圖如圖1,視頻是實物操作。
問題: 1、感覺當物體經過光電開關時,數碼管顯示的計數值和物體的速度有關,速度快計數跳變少,速度慢計數很多!但仿真時不是這樣的啊。光電計數模塊的輸出作為外部中斷的輸入。
2、當物體經過速度變慢時,感覺物體進入和出來,數碼管會產生兩次跳變!不應該啊。。。
已經檢查過實際電路,感覺沒有問題,應該是代碼的問題?但是本人小白一個,而且仿真也沒有問題,現在很迷茫。。
代碼:
#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];
P0=duan[c];
delay(20);
P2=wei[1];
P0=duan[v];
delay(20);
}
/*****中斷函數*****/
void ExtInt0() interrupt 0 //中斷服務程序
{
dispcount++; //外部中斷一次,計數加一
if(dispcount>99) //計數范圍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)
{
i++;
if(i%100==0) //100ms
led=~led;
if(i>=2000) //時間大于2s
{
i=2000;
led=1;
}
}
else
{
led=1;
i=0;
}
}
|
|