電路原理圖如下:
單片機(jī)源程序如下:
- #include<reg51.h>
- #define uint unsigned int
- #define uchar unsigned char
- //單周期定閘門時(shí)間測(cè)量盡量降低誤差
- //后續(xù)待實(shí)現(xiàn):實(shí)現(xiàn)多周期定閘門時(shí)間測(cè)量以降低誤差
- static bit end= 0; //周期開(kāi)始結(jié)束標(biāo)志,為減少中斷服務(wù)工作量定義為全局變量
- uchar m=0; //保存定時(shí)器清零次數(shù)
- uchar u=0;
- uint xL,xH=0; //剩余計(jì)數(shù)次數(shù)
- unsigned long t0,c; //分別保存被測(cè)信號(hào)的周期和頻率
- uchar a[]={'F',':','w','a','i','t','.','.','.','.','.','H','z'}; //頻率數(shù)據(jù)結(jié)果保存
- sbit lcdrw=P1^6;
- sbit lcdrs=P1^7;
- sbit lcden=P2^4;
- void delay(uint s)//延時(shí)1MS
- {
- uint r,g;
- for(r=s;r>0;r--)
- for(g=10;g>0;g--); //原值為110,我改為了10,做實(shí)際產(chǎn)品時(shí)可能要改回去
- }
- /////////////////LCD1602的設(shè)置//////////////////
- void write_com(uchar com) // 寫(xiě)指令
- {
- lcdrs=0; //低電平0時(shí)選擇指令寄存器
- P0=com;
- delay(5);
- lcden=1; //高電平(1)時(shí)讀取信息
- delay(5);
- lcden=0; //負(fù)跳變時(shí)執(zhí)行指令
- }
- void write_data(uchar date) // 寫(xiě)數(shù)據(jù)
- {
- lcdrs=1; //高電平1時(shí)選擇數(shù)據(jù)寄存器
- P0=date;
- delay(5); //高電平(1)時(shí)讀取信息
- lcden=1;
- delay(5);
- lcden=0; //負(fù)跳變時(shí)執(zhí)行指令
- }
- void initlcd()//初始化LCD1602
- {
- lcdrw=0; //低電平(0)時(shí)進(jìn)行寫(xiě)操作
- lcden=0; //負(fù)跳變時(shí)執(zhí)行指令
- write_com(0x38);//顯示模式設(shè)置
- write_com(0x0c); //顯示開(kāi),開(kāi)游標(biāo),不閃爍
- write_com(0x06); // 字符時(shí)整體不移動(dòng)
- }
- ////////////LCD1602設(shè)置///////////////////////
- ///////////定時(shí)計(jì)數(shù)器外部中斷設(shè)置//////////////
- void CTINT0_init() //定時(shí)計(jì)數(shù)器0和外部中斷0初始化
- {
- TMOD = 0x1; //T0工作在模式1,定時(shí)方式FHP
- TH0=0; //定時(shí)計(jì)數(shù)器初值清零
- TL0=0;
- EA=1; //開(kāi)總中斷
- ET0=1; //開(kāi)Timer0中斷
- EX0=1; //開(kāi)外部中斷0
- IT0=1; //設(shè)置外部中斷方式為下降沿觸發(fā)
- }
- ///////////定時(shí)計(jì)數(shù)器外部中斷設(shè)置//////////////
- ////////////////中斷服務(wù)函數(shù)//////////////////
- void ITC0() interrupt 0 //外部中斷0服務(wù)程序
- {
- if(end) //FHP被測(cè)信號(hào)一個(gè)周期結(jié)束做三件事情:1、記錄周期相關(guān)數(shù)據(jù);2、定時(shí)計(jì)數(shù)器清零并停止;3、告知下次中斷為周期開(kāi)始
- {
- u=m; //讀定時(shí)計(jì)數(shù)器0溢出次數(shù)
- TR0=0; //停止計(jì)時(shí)器
- xH=TH0; //讀定時(shí)計(jì)數(shù)器0當(dāng)前值
- xL=TL0;
- end = 0; //設(shè)置下次中斷為周期開(kāi)始
- }
- else //FHP被測(cè)信號(hào)一個(gè)周期開(kāi)始做一件事情:?jiǎn)?dòng)計(jì)時(shí)器
- {
- TH0=TL0=0; //定時(shí)計(jì)數(shù)器初值清零
- TR0=1; //啟動(dòng)計(jì)時(shí)器
- m=0; //溢出次數(shù)清零
- end = 1; // //設(shè)置下次中斷為周期結(jié)束
- }
- }
- void TIME0() interrupt 1 //定時(shí)計(jì)數(shù)器0溢出中斷服務(wù)程序
- {
- m++; //溢出次數(shù)加1
- }
- ////////////////中斷服務(wù)函數(shù)//////////////////
- void main()
- {
- uchar i;
- CTINT0_init(); //定時(shí)計(jì)數(shù)器外部中斷初始化
- initlcd(); //液晶顯示初始化
- while(1)
- {
- t0=u*65536 + xH*256 + xL; //計(jì)算周期
- c=1000000000/t0; //計(jì)算頻率,保存的是頻率擴(kuò)大了1000倍的值
- //計(jì)算結(jié)果逐位保存,首先是小數(shù)點(diǎn)后三位
- a[10]=c%10+'0';
- a[9]=(c/10)%10+'0';
- a[8]=(c/100)%10+'0';
- c /= 1000;//下面是整數(shù)部分
- a[6]=c%10+'0';
- a[5]=(c/10)%10+'0';
- a[4]=(c/100)%10+'0';
- a[3]=(c/1000)%10+'0';
- a[2]=(c/10000)%10+'0';
- write_com(0x80);
- for(i=0;i<=12;i++)
- {
- write_data(a[i]);
- delay(2); //現(xiàn)在延時(shí)只有0.2ms,實(shí)際做產(chǎn)品時(shí)可能要加長(zhǎng)
- }
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
數(shù)字頻率計(jì)單周期實(shí)現(xiàn).rar
(563.21 KB, 下載次數(shù): 87)
2018-7-30 10:04 上傳
點(diǎn)擊文件名下載附件
|