基于51單片機的數字頻率計
設計的頻率計范圍能夠達到1HZ-1MHZ(實際上51單片機達不到這個范圍,不要在實驗環境下進行),這個是課設來著,用Proteus仿真實現的,給有需要的同學參考一下
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載).
1.png (24.6 KB, 下載次數: 254)
下載附件
2018-5-2 13:25 上傳
Altium Designer畫的數字頻率計電路原理圖和PCB圖如下:(51hei附件中可下載工程文件)
0.png (53.86 KB, 下載次數: 154)
下載附件
2018-5-2 16:02 上傳
0.png (37.23 KB, 下載次數: 146)
下載附件
2018-5-2 16:02 上傳
0.png (44.04 KB, 下載次數: 127)
下載附件
2018-5-2 16:01 上傳
論文內容截圖:
0.jpg (28.38 KB, 下載次數: 136)
下載附件
2018-5-2 16:03 上傳
0.jpg (35.33 KB, 下載次數: 144)
下載附件
2018-5-2 16:04 上傳
單片機源碼:
- #include<reg51.h>
- #include<stdio.h>
- #include<intrins.h>
- typedef unsigned char uchar;
- typedef unsigned int uint;
- sbit RS=P2^5;
- sbit RW=P2^6;
- sbit E=P2^7;
- sbit CLK=P2^0;
- sbit DO=P2^1;
- sbit DI=P2^1;
- sbit CS=P2^2;
- sbit CLR=P3^0;
- sbit GATE=P3^1;
- sbit K1=P3^7;
- uint num=0;
- uint c=0;
- float d=0;
- uchar e=1,f=1;
- unsigned long int aaa=0,bbb=0;
- uchar LCD_wait()//LCD1602內部等待函數
- {
- RS=0;
- RW=1;
- _nop_();
- E=1;
- _nop_();
- E=0;
- return P0;
- }
- void LCD_write(bit aa,uchar bb)//向LCD寫入命令或數據
- {
- E=0;
- RS=aa;
- RW=0;
- _nop_();
- P0=bb;
- _nop_();//注意順序
- E=1;
- _nop_();//注意順序
- E=0;
- _nop_();
- LCD_wait();//LCD1602內部等待函數
- }
- void LCD_display(uchar temp)
- {
- LCD_write(0,0x08|temp);
- }
- void LCD_input(uchar cc)
- {
- LCD_write(0,0x04|cc);
- }
- void LCD_init()//初始化LCD
- {
- //RW=0;
- LCD_write(0,0x38);//8位數據端口,2行顯示,5*7點陣
- LCD_write(0,0x38);
-
- LCD_write(0,0x0C);//開啟顯示, 無光標
- LCD_write(0,0x01);//清屏
- LCD_write(0,0x0C);//AC遞增,畫面不動
-
- }
- void LCD_sfj1(uchar x,uchar y)
- {
- if(y==0)
- LCD_write(0,0x80|x);
- if(y==1)
- LCD_write(0,0x80|(x-0x40));
- }
- void LCD_print(uchar *p)
- {
- while(*p!='\0')
- {
- LCD_write(1,*p);
- p++;
- }
- }
- void delay1(uchar x)//ms延時子函數
- {
- uchar i;
- for(i=0;i<x;i++); //延時,脈沖一位持續的時間
- }
- uchar start(bit temp) //把模擬電壓值轉換成8位二進制數并返回,dat為通道選擇。
- {
- uchar i,aa=0;
- CS=0;
- DO=0;//片選,DO為高阻態
- delay1(10);
- CLK=0;
- delay1(2);
- DI=1;
- CLK=1;
- delay1(2);//第一個脈沖,起始位
- CLK=0;
- delay1(2);
- DI=1;
- CLK=1;
- delay1(2);//第二個脈沖,DI=1表示雙通道單極性輸入
- CLK=0;
- delay1(2);
- DI=temp; /*******************************/
- CLK=1;
- delay1(2);//第三個脈沖,DI=1表示選擇通道1(CH2)
- DI=0;
- DO=1;//DI轉為高阻態,DO脫離高阻態為輸出數據作準備
- CLK=1;
- delay1(2);
- CLK=0;
- delay1(2);//經實驗,這里加一個脈沖AD便能正確讀出數據,
- //不加的話讀出的數據少一位(最低位d0讀不出)
- for(i=0;i<8;i++)
- {
- CLK=1;
- delay1(2);
- CLK=0;
- delay1(2);
- aa=(aa<<1)|DO;//在每個脈沖的下降沿DO輸出一位數據,最終ch為8位二進制數
- }
- CS=1;//取消片選,一個轉換周期結束
- return(aa);//把轉換結果返回
- }
- uint fenjie(bit cc)
- {
- uchar dd;
- uint ee;
- dd=start(cc);
- ee=(uint)dd*100/51; //51是由5/255的倒數得來的,5是5V,255是8位AD。
- return(ee);
- }
- void delay2(uint z)//按鍵消抖
- {
- uint x;
- uchar y;
- for(x=0;x<z;x++)
- for(y=0;y<110;y++);
- }
- void delay3()//1s延時子函數
- {
- uchar h,i,j,k;
- for(h=5;h>0;h--)
- for(i=4;i>0;i--)
- for(j=116;j>0;j--)
- for(k=214;k>0;k--);
- }
復制代碼 礙于篇幅,上述只有部分代碼,其他在壓縮包中
論文內容預覽:http://www.zg4o1577.cn/bbs/dpj-115892-1.html
全部資料51hei下載地址:
基于51單片機數字頻率計的設計.zip
(984.6 KB, 下載次數: 2082)
2018-5-2 13:25 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|