分享分享
數字頻率計電路原理圖如下:
Altium Designer畫的數字頻率計原理圖和PCB圖如下:(51hei附件中可下載工程文件)
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
論文目錄:
目錄
前 言 1
第一章 總體設計方案 2
1.1 總設計框圖 2
1.2 硬件設計分析 2
1.2.1 電源的設計 2
(4):LCD1602的指令說明及時序 10
(5): LCD1602的RAM地址映射及標準字庫表 13
第二章 軟件設計與分析 15
2.1 軟件設計的組成 15
2.2 各部分軟件分析 15
2.2.1 定時器0中斷子函數 15
2.2.2 定時器1中斷子函數 15
2.2.3 主函數 16
2.3 總源程序 18
第三章 軟件介紹 28
3.1 PROTEUS簡介 28
3.2 PROTEL 99 SE簡介 29
3.2.1 電路工程設計部分 29
3.2.2 電路仿真與PLD部分 30
3.3 Protel 99 SE的功能特性 30
3.4 Protel99SE快捷鍵大全 30
3.6仿真圖 36
3.7原理圖 37
第四章 減小誤差措施及擴展方面 39
4.1減小誤差措施 39
4.2擴展方面 39
(1)預處理電路部分 39
(2)增加電源部分 39
4.3 功能上的完善 40
4.3.1 增加鍵盤控制 40
4.3.2 實現自動量程轉換 40
4.3.3 液晶顯示器(LCD)進行數據的顯示 41
總結 42
致謝詞 43
參考文獻 44
單片機數字頻率計源程序如下:
- #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--);
- }
- //定時計數初始化
- void init()
- {
- TMOD=0x25; // T0計數,T1定時
- TH0=0x00;
- TL0=0x00;
- TH1=0x06;
- TL1=0x06;
- CLR=1;
- CLR=0;
- GATE=0;
- GATE=1;
- ET0=1;
- ET1=1;
- EA=1;
- TR0=1;
- TR1=1;
- }
- void main()//主函數
- {
- unsigned long a=0;
- bit b=0;
- uchar tab[10];
- uint temp=0;
- LCD_init();
- init();
- LCD_sfj1(0,0);
- LCD_print("Welcome to use ");
- LCD_sfj1(0,1);
- LCD_print("Please Wating...");
- delay3();
- LCD_write(0,0x01);
- while(1)
- {
- if(K1==0)
- {
- delay2(10);
- if(K1==0)
- {
- while(K1==0);
- b=~b;
- LCD_write(0,0x01);
- }
- }
- temp=fenjie(0);
- if(temp>c)
- c=temp;
- if(temp>c>>3&&temp<c>>1)
- f=0;
- if(b==0)
- {
- a=(aaa*256)+bbb;
- if(a==0)
- {
- LCD_sfj1(0,0);
- LCD_print("F= 0000000000 Hz");
- LCD_sfj1(0,1);
- LCD_print("F= 0000000000 Hz");
- }
- else
- {
- LCD_sfj1(0,0);
- LCD_print("F= Hz");
- sprintf(tab,"%ld",a);
- LCD_sfj1(2,0);
- LCD_print(tab);
- LCD_sfj1(0,1);
- LCD_print("P= ms");
- sprintf(tab,"%0.6f",1000.0/a);
- LCD_sfj1(2,1);
- LCD_print(tab);
- }
- }
- else
- {
- sprintf(tab,"%bd",e);
- LCD_sfj1(0,0);
- LCD_print(tab);
- sprintf(tab,"Upp=%0.3fV",d);
- LCD_sfj1(0,1);
- LCD_print(tab);
- }
- }
- }
- void t0() interrupt 1 using 1
- {
- }
- void t1() interrupt 3 using 3//定時器T1中斷服務程序
- {
- if(num==3999)
- {
- GATE=0;
- TR0=0;
- TR1=0;
- aaa=TH0*256+TL0;
- bbb=P1;
- d=c/100.0;
- c=0;
- e=f;
- f=1;
- CLR=1;
- CLR=0;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
數字頻率計.zip
(984.6 KB, 下載次數: 222)
2018-5-6 19:17 上傳
點擊文件名下載附件
|