分享分享
數(shù)字頻率計電路原理圖如下:
Altium Designer畫的數(shù)字頻率計原理圖和PCB圖如下:(51hei附件中可下載工程文件)
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
論文目錄:
目錄
前 言 1
第一章 總體設(shè)計方案 2
1.1 總設(shè)計框圖 2
1.2 硬件設(shè)計分析 2
1.2.1 電源的設(shè)計 2
(4):LCD1602的指令說明及時序 10
(5): LCD1602的RAM地址映射及標準字庫表 13
第二章 軟件設(shè)計與分析 15
2.1 軟件設(shè)計的組成 15
2.2 各部分軟件分析 15
2.2.1 定時器0中斷子函數(shù) 15
2.2.2 定時器1中斷子函數(shù) 15
2.2.3 主函數(shù) 16
2.3 總源程序 18
第三章 軟件介紹 28
3.1 PROTEUS簡介 28
3.2 PROTEL 99 SE簡介 29
3.2.1 電路工程設(shè)計部分 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)預(yù)處理電路部分 39
(2)增加電源部分 39
4.3 功能上的完善 40
4.3.1 增加鍵盤控制 40
4.3.2 實現(xiàn)自動量程轉(zhuǎn)換 40
4.3.3 液晶顯示器(LCD)進行數(shù)據(jù)的顯示 41
總結(jié) 42
致謝詞 43
參考文獻 44
單片機數(shù)字頻率計源程序如下:
- #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內(nèi)部等待函數(shù)
- {
- RS=0;
- RW=1;
- _nop_();
- E=1;
- _nop_();
- E=0;
- return P0;
- }
- void LCD_write(bit aa,uchar bb)//向LCD寫入命令或數(shù)據(jù)
- {
- E=0;
- RS=aa;
- RW=0;
- _nop_();
- P0=bb;
- _nop_();//注意順序
- E=1;
- _nop_();//注意順序
- E=0;
- _nop_();
- LCD_wait();//LCD1602內(nèi)部等待函數(shù)
- }
- 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位數(shù)據(jù)端口,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延時子函數(shù)
- {
- uchar i;
- for(i=0;i<x;i++); //延時,脈沖一位持續(xù)的時間
- }
- uchar start(bit temp) //把模擬電壓值轉(zhuǎn)換成8位二進制數(shù)并返回,dat為通道選擇。
- {
- uchar i,aa=0;
- CS=0;
- DO=0;//片選,DO為高阻態(tài)
- 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轉(zhuǎn)為高阻態(tài),DO脫離高阻態(tài)為輸出數(shù)據(jù)作準備
- CLK=1;
- delay1(2);
- CLK=0;
- delay1(2);//經(jīng)實驗,這里加一個脈沖AD便能正確讀出數(shù)據(jù),
- //不加的話讀出的數(shù)據(jù)少一位(最低位d0讀不出)
- for(i=0;i<8;i++)
- {
- CLK=1;
- delay1(2);
- CLK=0;
- delay1(2);
- aa=(aa<<1)|DO;//在每個脈沖的下降沿DO輸出一位數(shù)據(jù),最終ch為8位二進制數(shù)
- }
- CS=1;//取消片選,一個轉(zhuǎn)換周期結(jié)束
- return(aa);//把轉(zhuǎn)換結(jié)果返回
- }
- uint fenjie(bit cc)
- {
- uchar dd;
- uint ee;
- dd=start(cc);
- ee=(uint)dd*100/51; //51是由5/255的倒數(shù)得來的,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延時子函數(shù)
- {
- 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--);
- }
- //定時計數(shù)初始化
- void init()
- {
- TMOD=0x25; // T0計數(shù),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()//主函數(shù)
- {
- 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中斷服務(wù)程序
- {
- 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黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
數(shù)字頻率計.zip
(984.6 KB, 下載次數(shù): 222)
2018-5-6 19:17 上傳
點擊文件名下載附件
|