日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

51单片机定时器及其应用(2)(测量脉冲宽度)

發(fā)布時間:2023/12/29 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 51单片机定时器及其应用(2)(测量脉冲宽度) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

51單片機定時器及其應用(2)(測量脈沖寬度)

上一篇文章講了如何使用51單片機的定時器功能制作一個簡易的數(shù)字鐘,上次有一個GATE位沒有涉及到,因此這次來介紹一下定時器的這個GATE位的應用,也就是測量脈沖寬度。先來介紹一下我們有什么“工具”,看一下定時器的TMOD寄存器:

這個GATE位,為了方便,這里以定時器1為例。手冊說只有當定時器的外部引腳INT1ˉ\bar{INT1}INT1ˉ為高電平并且內(nèi)部軟件控制位TR1為1時才能打開定時器1,這正好能用于解決脈沖寬度測量這個難題。

將GATE置1,TR1置1,此時外部送來一個脈沖,在高電平器件就會開始計數(shù),計數(shù)值在TH1和TL1寄存器里,當?shù)碗娖降絹頃r,關閉定時器,將最后的計數(shù)值減去初值,再乘以每秒計數(shù)間隔(51單片機每秒間隔為一個機器周期,1us左右),就可以得到脈沖寬度了。如果脈沖寬度過大,則每次計數(shù)值滿了會產(chǎn)生溢出中斷,此時只定義一個變量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左右。

總結(jié)

以上是生活随笔為你收集整理的51单片机定时器及其应用(2)(测量脉冲宽度)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。