![]() |
大家一起來看看,交流一下,獲取經驗 |
希望大家能幫我看看 |
zl2168 發表于 2018-7-22 10:35 您可以先看看我哪里出問題了嗎,謝謝 |
實例73 測量脈沖頻率 先Proteus仿真一下,確認有效 ![]() ![]() 以上摘自張志良編著《80C51單片機仿真設計實例教程——基于Keil C和Proteus》清華大學出版社ISBN 978-7-302-41682-1,內有常用的單片機應用100案例,用于仿真實驗操作,電路與程序真實可靠可信可行,可演示,可觀測,程序語句條條有注解。 |
頂一下 |
詳細代碼: #include<reg51.h> #define uchar unsigned char sbit RS = P1^0; sbit RW = P1^1; sbit EN = P1^2; uchar k = 0, f; uchar count; uchar tab_freq[]={0,0,0,0,0,0,0}; //頻率數組 void delay(int x){ //延時 int i; for(i=x;i>0;i--); } void write_com(char com){ //寫指令 P0=com; RS=0;RW=0;EN=1; delay(200); EN=0; } void write_dat(char dat){ //寫數據 P0=dat; RS=1;RW=0;EN=1; delay(200); EN=0; } void lcd_init(){ //初始化 write_com(0x01); write_com(0x38); write_com(0x0f); write_com(0x06); } void int_count0() interrupt 1{ //T0計數 k++; } void int_time1() interrupt 3{ //T1定時中斷函數開始{ TH1=0x4c; TL1=0x00; //50MS count++; if(count>=20) { count=0; TR0=0; //到1秒T0停止計數 TR1=0; f = k; k=0; //T1停止定時 } } void trans_count() //計算出一秒鐘收到的脈沖數量 { unsigned long int z; int i; z = f * 65536 + TH0 * 256 + TL0; if(z>9999999) //最大量程為999999 {z=9999999;} for(i = 6; i >= 0; i--) { tab_freq[i]=z%10+'0'; z /= 10; } } void main(){ uchar i; TMOD = 0x15; //T0為計數模式:方式1 T1為定時模式:方式1 TH0 = 0; //T0計數初始值 TL0 = 0; TR0=1; TH1 = 0x4c; //T1定時初始值 TL1 = 0x00; //50MS EA = 1; ET1 = 1; //允許T1定時中斷 ET0 = 1; //允許T0計數中斷 lcd_init(); trans_count(); for(i=0;i<7;i++) { write_dat(tab_freq[i]); //顯示頻率值 } write_dat('H'); write_dat('z'); //顯示Hz delay(2000); write_com(0x02); while(1); } |