生活随笔
收集整理的這篇文章主要介紹了
51单片机定时器及其应用(2)(测量脉冲宽度)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
51單片機定時器及其應用(2)(測量脈沖寬度)
上一篇文章講了如何使用51單片機的定時器功能制作一個簡易的數字鐘,上次有一個GATE位沒有涉及到,因此這次來介紹一下定時器的這個GATE位的應用,也就是測量脈沖寬度。先來介紹一下我們有什么“工具”,看一下定時器的TMOD寄存器:
這個GATE位,為了方便,這里以定時器1為例。手冊說只有當定時器的外部引腳INT1ˉ\bar{INT1}INT1ˉ為高電平并且內部軟件控制位TR1為1時才能打開定時器1,這正好能用于解決脈沖寬度測量這個難題。
將GATE置1,TR1置1,此時外部送來一個脈沖,在高電平器件就會開始計數,計數值在TH1和TL1寄存器里,當低電平到來時,關閉定時器,將最后的計數值減去初值,再乘以每秒計數間隔(51單片機每秒間隔為一個機器周期,1us左右),就可以得到脈沖寬度了。如果脈沖寬度過大,則每次計數值滿了會產生溢出中斷,此時只定義一個變量Count,每次溢出加1,并在中斷服務程序中清0,就可以得到最終脈沖寬度為count×定時時間+TH1*256+TL1,單位為us。下面給出代碼
#include <reg52.h>
sbit Wei_Select
=P2
^6;
sbit Duan_Select
=P2
^5;
sbit INT
=P3
^2;
char Display_Code
[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
char Wei
[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
long count
=0;
long Pulse_Width
=0;
unsigned int flag
=0;
unsigned int Count_High
=0;
unsigned int Count_Low
=0;
unsigned int num
=0;
unsigned int ge
=0,shi
=0,bai
=0,qian
=0,wan
=0;
void delay_ms(unsigned int Xms
)
{unsigned int i
=0,j
=0;for(i
=Xms
;i
>0;i
--)for(j
=110;j
>0;j
--);
}
void InitTimer0(void)
{TMOD
= 0x09;TH0
= 0x14;TL0
= 0x13;EA
= 1;ET0
= 1;EX0
=0;
}
void Timer0()interrupt
1
{TH0
= 0x14;TL0
= 0x13;count
++;
}
void display(unsigned int position
,unsigned int number
)
{Duan_Select
=0;Wei_Select
=1;P0
=Wei
[position
-1];Wei_Select
=0;Duan_Select
=1;P0
=Display_Code
[number
];delay_ms(2);
}
void Read_Count()
{Count_Low
=TL0
;Count_High
=TH0
;num
=Count_High
*256+Count_Low
;
}
void main()
{InitTimer0();while(1){count
=0;flag
=0;while(INT
==1);TH0
= 0;TL0
= 0;TR0
=1;while(INT
==0);while(INT
==1);TR0
=0;Read_Count();Pulse_Width
=(count
*65535+num
)/1000;ge
=Pulse_Width
%10;shi
=Pulse_Width
/10%10;bai
=Pulse_Width
/100%10;qian
=Pulse_Width
/1000%10;wan
=Pulse_Width
/10000%10;while(flag
!=200){flag
++;display(8,ge
);display(7,shi
);display(6,bai
);display(5,qian
);display(4,wan
);}}
}
測量范圍為10ms到未知,只要你愿意等,能測量很寬的脈沖寬度,顯示單位為ms。測量范圍大的話,誤差差不多為4ms左右。
總結
以上是生活随笔為你收集整理的51单片机定时器及其应用(2)(测量脉冲宽度)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。