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