女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

您好,歡迎來電子發(fā)燒友網! ,新用戶?[免費注冊]

您的位置:電子發(fā)燒友網>源碼下載>C/C++語言編程>

計時器與計頻器實驗及其幾種典型的應用案例分享

大小:0.1 MB 人氣: 2017-09-06 需要積分:0

1、計時器實驗I-垂詢方式-高低位燈互閃

/* ch07-5-1.c - 計時器實驗I-垂詢方式-高低位燈互閃 */
//==聲明區(qū)================================
#include??// 定義8x51暫存器之標頭檔,P2-17~19?
#define?LED?P1???// 定義LED接至Port 1
#define?count?50000?// T0(MODE 1)之計量值,約0.05秒(7-8頁)
#define? ?TH_M1 (65636-count)/256?// T0(Mode 1)計量高8位元?
#define? ?TL_M1 (65636-count)%256?// T0(Mode 1)計量低8位元?
//==主程序================================
main()?????// 主程序開始?
{?int? i;????// 宣告i變數?
?TMOD &= 0xf1;??// 設定T0為mode 1(7-3頁)
?TMOD |= 0x01;??// 設定T0為mode 1(7-3頁)
?LED=0xf0;???// LED初值=1111 0000,右4燈亮?
?while(1)???// 無窮循環(huán),程序一直跑?
?{?for (i=0;i<5;i++)//?for循環(huán),計時中斷5次?
???{ ?TH0=TH_M1;?// 設置高8位元?
???TL0=TL_M1;?// 設置低8位元?
???TR0=1;??// 啟動T0(7-7頁)
???while(TF0==0);// 等待溢位(TF0==1)
???TF0=0;??// 溢位後,清除TF0,關閉T0
??}????// for循環(huán)計時結束?
??LED=~LED;??// 輸出反相?
?}????// while循環(huán)結束?
}?????// 主程序結束?
?
?

2、計時器實驗2-中斷方式-高低位燈互閃

/* ch07-5-2.c - 計時器實驗2-中斷方式-高低位燈互閃? */
//==聲明區(qū)================================
#include??// 定義8x51暫存器之標頭檔,P2-17~19?
#define?LED?P1???// 定義LED接至Port 1
#define?count?50000?// T0(MODE 1)之計量值,約0.05秒?
#define? ?TH_M1 (65636-count)/256?// T0(Mode 1)計量高8位元?
#define? ?TL_M1 (65636-count)%256?// T0(Mode 1)計量低8位元?
int? IntCount=0;??// 宣告IntCount變數,計算T0中斷次數?
//==主程序================================
main()?????// 主程序開始?
{?IE=0x82;???// 啟用T0中斷(6-4頁)
?TMOD &= 0xf1;TMOD |= 0x01;?// 設定T0為mode 1(7-3頁)
?TH0=TH_M1; TL0=TL_M1;??// 設置T0計數量高8位元、低8位元?
?TR0=1;????// 啟動T0
?LED=0xf0;???//?LED初值=1111 0000,右4燈亮?
?while(1);???// 無窮循環(huán),程序停滯?
}??????// 主程序結束?
//== T0中斷子程序- 每中斷5次,LED反相 ================
void timer0(void) interrupt 1?// T0中斷子程序開始?
{?TH0=TH_M1; TL0=TL_M1;??// 設置T0計數量高8位元、低8位元?
?if (++IntCount==5)???// 若T0已中斷5次數?
?{?IntCount=0;????// 重新計次?
??LED^=0xff;????// 輸出相反?
?}???????// if敘述結束?
}????????// T0中斷子程序
?
?

3、計時器實驗3 -60秒計數器,每1分鐘LED反相1次

/* ch07-5-3.c - 計時器實驗3 -60秒計數器,每1分鐘LED反相1次 */
//==聲明區(qū)================================
#include??// 定義8x51暫存器之標頭檔,P2-17~19?
#define?SEG?P2???// 定義七節(jié)顯示器接至Port 2
#define?SCANP?P1??// 定義掃瞄線接至Port 1
sbit? LED=P0^7;???// 聲明LED接至P0.7
/*聲明T0計時相關聲明*/? // THx TLx 計算參考?
#define? count_M1?? 50000???// T0(MODE 1)之計量值,0.05s?
#define? TH_M1? (65636-count_M1)/256// T0(MODE 1)計量高8位元?
#define? TL_M1? (65636-count_M1)%256// T0(MODE 1)計量低8位元?
int count_T0=0; ?????// 計算 T0中斷次數?
/*聲明T1掃瞄相關聲明*/
#define? count_M2?? 250???// T1(MODE 2)之計量值,0.25ms
#define? TH_M2? (256-count_M2)?// T1(MODE 2)自動載入計量??
#define? TL_M2? (256-count_M2)?// T1(MODE 2)計數量?
char count_T1=0;????// 計算 T1中斷次數 ?
/* 聲明七節(jié)顯示器驅動信號陣列(共陽) */
char code TAB[10]={?0xc0, 0xf9, 0xa4, 0xb0, 0x99,?//數字0-4
?????0x92, 0x83, 0xf8, 0x80, 0x98 };?//數字5-9
char disp[2]={ 0xc0, 0xc0 };?// 聲明顯示區(qū)陣列初始顯示00
/* 聲明基本變量 */
char seconds=0;???// 秒數?
char scan=0;???// 掃瞄信號?
//==主程序================================
main()?????// 主程序開始?
{?IE=0x8a;???// 1000 1010,啟用TF0、TF1中斷(6-4頁)
?TMOD=0x21;???// 0010 0001,T1采mode 2、T0采mode 1
?TH0=TH_M1; TL0=TL_M1;// 設置T0計數量高8位元、低8位元?
?TR0=1;????// 啟動T0(7-7頁)
?TH1=TH_M2; TL1=TL_M2;// 設置T1自動載入值、計數量?
?TR1=1;????// 啟動T1
?LED=1;????// 關閉LED
?while(1);???// 無窮回圈,程序停滯?
}??????// 主程序結束??
//== T0中斷子程序- 計算并顯示秒數 ==================
void T0_1s(void) interrupt 1?// T0中斷子程序開始?
{?TH0=TH_M1; TL0=TL_M1;??// 設置T0計數量高8位元、低8位元?
?if (++count_T0==20)???// 若中斷20次,即0.05x20=1秒?
?{?count_T0=0;????// 重新計次?
??seconds++;????// 秒數加1
??if (seconds==60) ??// 若超過60秒?
??{?seconds=0;???// 秒數歸0,重新開始?
???LED=~LED; ???// 切換LED
??}??????// if敘述結束(超過60秒)
?}???????// if敘述結束(中斷20次)
?disp[1]=TAB[seconds/10]; ?// 填入十位數顯示區(qū)?
?disp[0]=TAB[seconds%10]; ?// 填入個位數顯示區(qū)?
}????????// T0中斷子程序結束?
//===T1中斷子程序 - 掃瞄 =========================
void T1_8ms(void) interrupt 3?// T1中斷子程序開始?
{?if (++count_T1==32)???// 若中斷32次,即0.25mx32=8ms
??{?count_T1=0;???// 重新計次?
???if (++scan==3) scan=1;// 若超過十位數,顯示個位 ?
???SEG=0xff;???// 關閉7段顯示器?
???SCANP=~scan;??// 輸出掃瞄信號?
???SEG=disp[scan-1];?// 輸出顯示信號?
??}??????// 結束if判斷(中斷32次)
}????????// T0中斷子程序結束?
?
?

4、計頻器實驗

/* ch07-5-6.c - 計頻器實驗 - 由P3.5輸入信號,按下PB0於1秒後顯示其頻率 */
//==聲明區(qū)================================
#include??// 定義8x51暫存器之標頭檔,P2-17~19?
#define?SEG??P2??// 定義七節(jié)顯示器接至Port 2
#define?SCANP?P1??// 定義掃瞄線接至Port 1
sbit? PB0=P3^2;???// 聲明PB0按鈕,接至P3.2
char code TAB[11]={?0xc0, 0xf9, 0xa4, 0xb0, 0x99,???// 數字0-4
????? ??0x92, 0x83, 0xf8, 0x80, 0x98 , 0xbf };?// 數字5-9,及-號?
char disp[4]={ 0xc0, 0xc0, 0xc0, 0xc0}; // 聲明顯示區(qū)陣列初始顯示0000
/* 聲明T0計時相關聲明 */????// THx TLx 計算參考 7-8頁?
#define? count_M1?? 50000????// T0(MODE 1)之計量值,0.05s?
#define? H_0? (65636-count_M1)/256??// T0(MODE 1)計量高8位元?
#define? L_0? (65636-count_M1)%256??// T0(MODE 1)計量低8位元?
char times=0; ???// 計算 T0中斷次數?
/* 聲明基本變量 */
bit? status_F = 1;??// 狀態(tài)旗標?
char? scan = 1;???// 掃瞄信號?
unsigned int freq = 0;?// 頻率變量?
sfr16? DPTR = 0x82;??// 聲明DPTR
void delay1ms(int);??// 聲明延遲函數?
void measure(void); ?// 聲明量測函數?
void display(void); ?// 聲明顯示函數?
//==主程序======================================
main()?????// 主程序開始?
{?while(1)???// 無窮回圈,程序一直跑?
?{?if (PB0==0) ?// 若按下PB0
??{?status_F=0;?// 則進入量測階段?
???measure();?// 呼叫量測函數?
???while(status_F==0); }?// 等待0,量測完畢?
??else display();?// 顯示階段?
?}?????//?while回圈結束?
}??????// 主程序結束?
//==量測函數====================================
void measure(void)??// 量測函數開始
{?SCANP=0xff;???// 關閉顯示器?
?IE=0x8a;???// 10001010,啟用T0、T1中斷
?TMOD=0x51;???// 7-3 頁?
?/*0101 0001:T1為計數器、T0為計時器,都采mode 1*/
?TH0=H_0;TL0=L_0;?// 設置T0計數量之高、低八位元?
?TH1=0;TL1=0;??// 設置T1歸零?
?TR0=1;TR1=1;??// 啟動T0、T1
}??????// 量測函數結束?
//===T0_1S=================================
void T0_1S(void) interrupt 1 ?// T0_1S中斷副程序開始?
{?TH0=H_0;TL0=L_0;?// 設置T0計數量之高、低八位元?
?if (++times==20)?// 若達到1秒?
?{?times=0;??// 重新計次?
??status_F=1;??// 完成量測?
??TR1=0;TR0=0;?// 關閉T1、T0
??DPL=TL1;??// 計數量之低八位元?
??DPH=TH1;??// 計數量之高八位元?
??freq=DPTR;??// 計數量放入freq變量?
??if (freq>=10000)// 超過10 kHz
??{?disp[3]=TAB[10];???// 負號填入千位數顯示區(qū)?
???disp[2]=TAB[10];???// 負號填入百位數顯示區(qū)?
???disp[1]=TAB[freq/10000];?// 填入十位數顯示區(qū)?
???disp[0]=TAB[(freq/1000)%10];}// 填入個位數顯示區(qū)?
??else???????// 低於10 kHz
??{?disp[3]=TAB[freq/1000];??// 填入千位數顯示區(qū) ????
???disp[2]=TAB[(freq/100)%10];?// 填入百位數顯示區(qū)?
???disp[1]=TAB[(freq/10)%10];?// 填入十位數顯示區(qū)?
???disp[0]=TAB[freq%10];}??// 填入個位數顯示區(qū)?
?}?????????// 結束if判斷(達到1秒)
}??????????//?T0_1S中斷副程序結束?
//===顯示函數================================
void display(void)???// 顯示函數開始?
{?char i;?????// 聲明變量?
?while (PB0==1)???// 若按下PB0
?{?scan=0x01;???// 初始掃瞄信號?
??for (i=0;i<4;i++)?// 掃瞄4次?
??{?SEG=0xff;??// 關閉7段顯示器?
???SCANP=~scan;?// 輸出掃瞄信號?
???SEG=disp[i];?// 輸出顯示信號?
???delay1ms(4); ?// 延遲4ms
???scan<<=1;??// 下一個掃瞄信號?
?? }?????//?for結束掃瞄4次?
?}??????// 結束while(按下PB0)
}???????// 顯示函數結束?
//===延遲函數================================
void delay1ms(int x)??// 延遲函數開始?
{?int i,j;????// 聲明變量?
?for(i=0;i ??for(j=0;j<120;j++); // 數120次,約1ms
}???????// 延遲函數結束?

非常好我支持^.^

(0) 0%

不好我反對

(0) 0%

      發(fā)表評論

      用戶評論
      評價:好評中評差評

      發(fā)表評論,獲取積分! 請遵守相關規(guī)定!

      ?