標題: 帶分頻整形的單片機頻率計(1Hz—20MHz)源程序,仿真與設計論文等全套資料 [打印本頁]
作者: micoco 時間: 2018-5-2 18:51
標題: 帶分頻整形的單片機頻率計(1Hz—20MHz)源程序,仿真與設計論文等全套資料
單片機頻率計 系統(tǒng)采用單片機+分頻模塊+整形模塊+lcd1602液晶顯示+按鍵設計而成。
頻率的測量范圍為1Hz—20MHz能測量各種周期信號,能測出正弦波、三角波或方波等波形的頻率。通過LCD1602液晶顯示屏顯示檢測到的即時頻率數(shù)值(最多8位數(shù),單位為Hz)。
頻率計 (3).jpg (1.37 MB, 下載次數(shù): 111)
下載附件
2018-5-3 01:13 上傳
頻率計 (1).jpg (1.77 MB, 下載次數(shù): 130)
下載附件
2018-5-3 01:13 上傳
頻率計 (2).jpg (1.51 MB, 下載次數(shù): 86)
下載附件
2018-5-3 01:13 上傳
頻率計電路原理圖如下:
截圖格式 雙擊可以打.png (110.41 KB, 下載次數(shù): 115)
下載附件
2018-5-3 01:14 上傳
頻率計 PCB圖.jpg (630.64 KB, 下載次數(shù): 104)
下載附件
2018-5-3 01:13 上傳
74HC14電路設計
由于三極管放大電路輸出的信號不是標準的方波信號,存在著上升沿不夠陡峭,波形類似于正弦波等問題,為了使單片機對信號更好的采集,這里使用了施密特觸發(fā)器74HC14對三極管放大電路輸出的信號進行整形。電路圖如圖3-10所示。
圖3-10施密特觸發(fā)器電路原理圖
其中輸入信號從芯片的1號腳輸入,74HC14本身是一個芯片內部帶有6個施密特觸發(fā)器,我這里為了充分利用芯片使用了其中三個,實際上可以只使用一個。整形后的信號從芯片的6號腳輸出。
3.5分頻模塊設計
3.5.1 74HC390芯片介紹
分頻電路一般采用十進制計數(shù)器如74HC290、74HC390等來實現(xiàn)時間計數(shù)單元的計數(shù)功能。本次設計中選擇74HC390。由其內部邏輯框圖(如圖3)可知,其為雙2-5-10異步計數(shù)器,并每一計數(shù)器均有一個異步清零端(高電平有效)。由于我們要設計的是100分頻電路,因此74HC390內部兩個計數(shù)器都用上,分別都設置成10計數(shù)器。
圖3-11 74HC390內部邏輯框圖
3.5.2 74HC390分頻電路設計
由于單片機運行速度有限,單片機運行一條基礎指令需要1個機器周期即12個是時鐘周期,換算成時間為1us。因此當頻率過高的時候單片機就不能很精確的換算出頻率。為了解決這個問題,這設計加入了一個100分頻的計數(shù)器。當頻率高于200KHZ的時候單片機計算分頻后的信號,當頻率低于200KHZ的時候計算分頻前的信號。這樣高低搭配可以擴大單片機的測量頻率。最終換算出其真實對應的頻率并在液晶上顯示。其中電路圖如圖3-12所示。
圖3-12 74HC390分頻電路原理圖
4.系統(tǒng)軟件設計
4.1系統(tǒng)軟件總體設計
4-1系統(tǒng)主流程圖
頻率計元件清單:
0.png (19.54 KB, 下載次數(shù): 145)
下載附件
2018-5-3 01:14 上傳
單片機仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
仿真截圖.png (86.84 KB, 下載次數(shù): 100)
下載附件
2018-5-3 01:15 上傳
頻率計仿真操作說明:
鼠標右擊這個元件,
選擇最后一項就可以了
單片機頻率計源程序如下:
- //******************************************************************************************
- //連接框圖: ___________________
- // | P1.0 |->RS
- // | P1.1 |->RW
- // | P1.2 |->E
- // | P0 |->DB
- // | P3.4 |->1~9999hz的輸入
- // | P3.5 |->1~9999KHZ輸入 (分頻后)
- //******************************************************************************************
- #include <reg52.h>
- unsigned long int fre;
- unsigned char time;
- unsigned int count;
- unsigned int count1;
- //端口及函數(shù)說明----------------------------------------------------------------------------
- sbit LCD_RS=P1^0; //片選信號
- sbit LCD_RW=P1^1; //讀寫信號
- sbit LCD_E=P1^2; //使能信號
- #define LCD_DB P0 //數(shù)據信號
- unsigned char character[10]={0};//在屏幕上顯示的字符串
- unsigned char character_1[]={"fre= Hz"};
- unsigned char FLAG = 0;
- void LCD_init(void);//初始化函數(shù)
- void LCD_write_command(unsigned char command);//寫指令函數(shù)
- void LCD_write_data(unsigned char dat);//寫數(shù)據函數(shù)
- void LCD_disp_char(unsigned char x,unsigned char y,unsigned char dat);//在某個屏幕位置上顯示一個字符,X(0-15),y(1-2)
- void delay_n40us(unsigned int n);//延時函數(shù)
-
- void timer_init(); //中斷初始化函數(shù)
- //-------------------------------------------------------------------------------
- void delay_n40us(unsigned int n) //延時函數(shù)
- {
- unsigned int i;
- unsigned char j;
- for(i=n;i>0;i--)
- for(j=0;j<2;j++);
- }
- void delay_1s()
- {
- unsigned int i,j;
- for(i = 0;i<100;i++)
- for(j = 0;j<1000;j++);
- }
- void LCD_init(void) //液晶初始化函數(shù)
- {
- LCD_write_command(0x38);//設置8位格式,2行,5x7
- LCD_write_command(0x38);//設置8位格式,2行,5x7
- LCD_write_command(0x38);//設置8位格式,2行,5x7 切記要寫三遍。。!
- LCD_write_command(0x0c);//整體顯示,關光標,不閃爍
- LCD_write_command(0x06);//設定輸入方式,增量不移位
- LCD_write_command(0x01);//清除屏幕顯示
- delay_n40us(100);//清屏延時
- }
- void LCD_write_command(unsigned char dat) //寫命令函數(shù)
- {
- LCD_DB=dat;
- LCD_RS=0;//指令
- LCD_RW=0;//寫入
- LCD_E=1; //使能
- LCD_E=0;
- delay_n40us(1);//寫命令延時
- }
- void LCD_write_data(unsigned char dat) //寫數(shù)據函數(shù)
- {
- LCD_DB=dat;
- LCD_RS=1;//數(shù)據
- LCD_RW=0;//寫入
- LCD_E=1;//使能
- LCD_E=0;
- delay_n40us(1); //寫數(shù)據延時
- }
- void LCD_disp_char(unsigned char x,unsigned char y,unsigned char dat)//顯示一個字符
- {
- unsigned char address;
- if(y==1)
- address=0x80+x; //顯示在第一排的時候的x的地址
- else
- address=0xc0+x; //顯示在第二排的時候的x的地址
- LCD_write_command(address); //輸入地址
- LCD_write_data(dat); //輸入數(shù)據
- }
- void LCD_disp_num(unsigned char x,unsigned char y,unsigned char dat)//顯示一個數(shù)字
- {
- unsigned char address;
- if(y==1)
- address=0x80+x; //顯示在第一排的時候的x的地址
- else
- address=0xc0+x; //顯示在第二排的時候的x的地址
- LCD_write_command(address); //輸入地址
- LCD_write_data(dat+48); //輸入數(shù)據
- }
- void dis_num(void)
- {
- unsigned char i=0,j=0,k=0;
- LCD_write_command(0x01);//清除屏幕顯示
-
- character[0] = fre/1000000;
- character[1] = fre/100000%10;
- character[2] = fre/10000%10;
- character[3] = fre/1000%10;
- character[4] = fre/100%10;
- character[5] = fre/10%10;
- character[6] = fre%10;
- character[7] = 'H';
- character[8] = 'z';
-
- for(i = 0;i<4;i++) //顯示fre
- {
- LCD_disp_char(i+0,1,character_1[i]);
- }
- for(i = 0;i<10;i++) //判斷第一個不為0的數(shù)
- {
- if(character[i]!=0)
- break;
- }
- k = 10-i-2;
- for(j = 0;j<k;j++) //顯示所有的數(shù)字
- {
- LCD_disp_num(4+j,1,character[i++]);
- }
-
- for(i = 5;i<7;i++) //顯示Hz
- {
- LCD_disp_char(j+4,1,character_1[i]);
- j++;
- }
- }
- void main()
- {
- unsigned char i;
- LCD_init();
- timer_init(); //定時/計數(shù)器初始化
-
- for(i = 0;i<4;i++)
- {
- LCD_disp_char(i+0,1,character_1[i]);
- }
- while(1)
- {
- dis_num(); //顯示
- delay_1s();
-
- }
- }
- void timer_init(void) //定時/計數(shù)器初始化
- {
- TMOD=0x66; //計數(shù)器0工作工作方式2,自動重裝初值
- TH0=0; //計數(shù)器初值為0
- TL0=0;
- TR0=1; //計數(shù)器開始計數(shù)
- ET0=1; //打開計數(shù)器0中斷
- TH1=0; //計數(shù)器初值為0
- TL1=0;
- TR1=1; //計數(shù)器開始計數(shù)
- ET1=1; //打開計數(shù)器0中斷
- RCAP2H=(65536-62500)/256; //在程序初始化的時候給RCAP2L和RCAP2H賦值,
- RCAP2L=(65536-62500)%256; //TH2和TL2將會在中斷產生時自動使TH2=RCAP2H,TL2=RCAP2L。
- TH2=RCAP2H; //12M晶振下每次中斷62.5ms
- TL2=RCAP2L;
- ET2=1; //打開定時器2中斷
- TR2=1; //定時器2開始計時
- EA=1; //開總中斷
- }
- //----------------------------------------------------------------
- void timer2(void) interrupt 5 //定時器2中斷(62.5ms)
- {
- double temp;
- time++;
- TF2=0; //定時器2的中斷標志位TF2不能夠由硬件清零,所以要在中斷服務程序中將其清零
- if (time==16) //定時1s時間到
- {
- time=0; //計時清0
- fre=(long)count*256+TL1; //count*256強制轉換成long型,否則將不產生進位 先判斷分頻后的
- FLAG = 0;
-
- if(fre<2000)//200K之后讀取分頻后的頻率
- {
- fre = (long)count1*256+TL0;
- FLAG = 1;
- }
-
- count=0; //清零計數(shù)器0計數(shù)
- count1=0;
- EA=1; //開中斷
- }
- }
- //----------------------------------------------------------------
- void timer0(void) interrupt 1 //計數(shù)器0中斷
- {
- count++;
- }
- //----------------------------------------------------------------
- void timer1(void) interrupt 3 //計數(shù)器1中斷
- {
- count1++;
- }
-
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
0.png (52.11 KB, 下載次數(shù): 112)
下載附件
2018-5-3 01:18 上傳
所有資料51hei提供下載:
##單片機頻率計.rar
(10.69 MB, 下載次數(shù): 996)
2018-5-2 18:50 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者: hqpos 時間: 2018-11-2 14:02
資料配套齊全,很有參考價值。
作者: aking991 時間: 2018-11-27 11:50
很不錯,收藏了
作者: 張小寶1 時間: 2018-12-10 11:02
下載打開根本是亂碼,一點用都沒有
作者: jadyjayjay 時間: 2018-12-10 15:06
新手來看看
作者: 都市郎 時間: 2018-12-11 01:27
資料非常全,很好,感謝樓主分享!
作者: 黑點哥iii 時間: 2018-12-13 21:39
贊一個
作者: wpppmlah 時間: 2019-3-29 16:52
已經下載了資料,很不錯很有學習價值!謝謝.
作者: 一只貓的過客 時間: 2019-4-13 20:47
為什么我測不到1MHZ以上的頻率啊,仿真一直崩潰
作者: cnc202 時間: 2019-4-14 22:21
感謝樓主分享
作者: 774388942 時間: 2019-4-18 10:19
謝謝分享
作者: 774388942 時間: 2019-4-18 10:28
感謝樓樓
作者: 竹之君 時間: 2019-5-31 18:30
內容很詳細,看的非常清楚,會一直關注這個網站的。
作者: 快樂眼淚 時間: 2019-5-31 21:26
感謝樓主分享,有時間做個!
作者: 物業(yè)tuan 時間: 2019-12-9 23:10
資料很全面,這兩天正好在學習這個,感謝樓主分享
作者: 517087308 時間: 2019-12-31 16:47
很給力
作者: 517087308 時間: 2020-1-2 14:11
很不錯喲
作者: saine 時間: 2020-3-4 22:50
能幫我設計一下嗎?
作者: wangjinlongd 時間: 2020-3-10 22:16
資料非常全,很好,感謝樓主分享!
作者: 329575852 時間: 2020-4-28 19:22
仿真圖文件夾里邊的hex跟程序文件夾里邊的不是同一個吧,仿真圖文件夾里邊的那個很準,程序文件夾里邊的那個老是出錯
作者: 單片機新手12.15 時間: 2020-5-4 18:44
謝謝樓主
作者: 195470880 時間: 2020-5-14 21:38
很不錯,收藏了
作者: zxcvgfd 時間: 2020-5-17 13:41
樓主怎么計算這個頻率計能測多少頻率范圍???
作者: asdfqw 時間: 2020-5-23 18:03
這里的分頻期間我認為可以設計成50分頻,可以更好地利用資源
作者: 初晴2000 時間: 2020-6-13 15:16
很實用的資料,棒棒噠!!
作者: swustlx86 時間: 2020-6-17 09:03
好資料,51黑有你更精彩!!!
作者: xieyebao1995 時間: 2020-6-18 08:37
正想學習這方面,謝謝分享
作者: peeta 時間: 2020-7-2 22:14
超好的東西,收藏慢慢學!
作者: rayin 時間: 2020-11-15 17:32
不錯,值得學習。51hei有你更精彩。
作者: lele88888 時間: 2021-1-26 14:31
很不錯,收藏了
作者: xuliya282 時間: 2021-3-9 07:18
不錯不錯,正好想學習一下頻率計。
作者: 螞蟻科技 時間: 2023-7-4 11:56
能不能測試晶振頻率?
作者: 王秋冬 時間: 2023-7-27 08:46
能不能測試晶振頻率?如果不超測量上限,應該能測試晶振頻率。
作者: 螞蟻科技 時間: 2023-11-27 19:26
防制了一個,感覺有點誤差,不知道什么原因,有誰做成功的分享一下經驗
作者: 螞蟻科技 時間: 2024-5-25 19:23
4M以下不能測試,4M以上測試精度還可以,點贊!。
作者: xlhlydd 時間: 2024-6-18 10:42
能否改成數(shù)碼管的,1602顯示的字能改大字嗎
作者: nanfuB 時間: 2024-6-19 19:35
看起來好全的資,收下了謝謝
歡迎光臨 (http://www.torrancerestoration.com/bbs/) |
Powered by Discuz! X3.1 |