|
給大家分享一個(gè)很好的單片機(jī)設(shè)計(jì),而且資料很全。仿真 pcb 原理圖 程序和課程設(shè)計(jì)論文都有.
頻率計(jì)的所有設(shè)計(jì)資料下載:
頻率計(jì).rar
(13.27 MB, 下載次數(shù): 754)
2017-2-11 02:58 上傳
點(diǎn)擊文件名下載附件
下面給大家分享一下本設(shè)計(jì)的相關(guān)圖片
數(shù)字頻率計(jì)實(shí)物圖:
單片機(jī)數(shù)字頻率計(jì)原理圖:
數(shù)字頻率計(jì)仿真圖:
單片機(jī)數(shù)字頻率計(jì)pcb圖:
/****** 數(shù)字頻率計(jì)元件清單 *******/
1、1602LCD液晶屏 1個(gè)
2、排陣16P 1個(gè)
3、排陣4P 1個(gè)
4、排母16P 1個(gè)
5、單片機(jī)STC89C52 1個(gè)
6、DIP40插座 1個(gè)
7、74HC390 1個(gè)
8、74HC14 1個(gè)
9、DIP14 1個(gè)
10、DIP16 1個(gè)
11、電阻300 1個(gè)
12、3K 1個(gè)
13、1K 2個(gè)
14、75 1個(gè)
15、電容470UF 3個(gè)
16、0.1UF(104) 2個(gè)
17、10UF 1個(gè)
18、30P 2個(gè)
19、排阻103 1個(gè)
20、電位器103 1個(gè)
21、三極管8050 1個(gè)
22、按鍵 1個(gè)
23、晶振12M 1個(gè)
24、DC電源座子 1個(gè)
25、USB轉(zhuǎn)DC線 1個(gè)
26、電路板7*9 1個(gè)
27、導(dǎo)線12匝 1個(gè)
28、電路圖 1個(gè)
29、銅柱 4套
30、自鎖開關(guān) 1個(gè)
/*********** 共計(jì):29種 ***********/
/*********** 共計(jì):41個(gè) ***********/
單片機(jī)數(shù)字頻率計(jì)源程序:
- #include <reg52.h>
- unsigned long int fre;
- unsigned char time;
- unsigned int count;
- unsigned int count1;
- sbit LCD_RS=P1^0; //片選信號(hào)
- sbit LCD_RW=P1^1; //讀寫信號(hào)
- sbit LCD_E=P1^2; //使能信號(hào)
- #define LCD_DB P0 //數(shù)據(jù)信號(hào)
- unsigned char character[10]={0};//在屏幕上顯示的字符串
- unsigned char character_1[]={"fre= Hz"};
- unsigned char FLAG = 0; //是否分頻選擇標(biāo)志
- void LCD_init(void);//初始化函數(shù)
- void LCD_write_command(unsigned char command);//寫指令函數(shù)
- void LCD_write_data(unsigned char dat);//寫數(shù)據(jù)函數(shù)
- void LCD_disp_char(unsigned char x,unsigned char y,unsigned char dat);//在某個(gè)屏幕位置上顯示一個(gè)字符,X(0-15),y(1-2)
- void delay_n40us(unsigned int n);//延時(shí)函數(shù)
- void timer_init(); //中斷初始化函數(shù)
- //-----------------------------延時(shí)函數(shù)---------------------------
- void delay_n40us(unsigned int n) //延時(shí)函數(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++);
- }
- //---------------------lcd1602液晶顯示函數(shù)--------------------
- void LCD_init(void) //液晶初始化函數(shù)
- {
- LCD_write_command(0x38);//設(shè)置8位格式,2行,5x7
- LCD_write_command(0x38);//設(shè)置8位格式,2行,5x7
- LCD_write_command(0x38);//設(shè)置8位格式,2行,5x7
- LCD_write_command(0x0c);//整體顯示,關(guān)光標(biāo),不閃爍
- LCD_write_command(0x06);//設(shè)定輸入方式,增量不移位
- LCD_write_command(0x01);//清除屏幕顯示
- delay_n40us(100);//清屏延時(shí)
- }
- 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);//寫命令延時(shí)
- }
- void LCD_write_data(unsigned char dat) //寫數(shù)據(jù)函數(shù)
- {
- LCD_DB=dat;
- LCD_RS=1;//數(shù)據(jù)
- LCD_RW=0;//寫入
- LCD_E=1;//使能
- LCD_E=0;
- delay_n40us(1); //寫數(shù)據(jù)延時(shí)
- }
- void LCD_disp_char(unsigned char x,unsigned char y,unsigned char dat)//顯示一個(gè)字符
- {
- unsigned char address;
- if(y==1)
- address=0x80+x; //顯示在第一排的時(shí)候的x的地址
- else
- address=0xc0+x; //顯示在第二排的時(shí)候的x的地址
- LCD_write_command(address); //輸入地址
- LCD_write_data(dat); //輸入數(shù)據(jù)
- }
- void LCD_disp_num(unsigned char x,unsigned char y,unsigned char dat)//顯示一個(gè)數(shù)字
- {
- unsigned char address;
- if(y==1)
- address=0x80+x; //顯示在第一排的時(shí)候的x的地址
- else
- address=0xc0+x; //顯示在第二排的時(shí)候的x的地址
- LCD_write_command(address); //輸入地址
- LCD_write_data(dat+48); //輸入數(shù)據(jù)
- }
- void dis_num(void)
- {
- unsigned char i=0,j=0,k=0;
- LCD_write_command(0x01);//清除屏幕顯示
- character[0] = fre/10000000;
- character[1] = fre/1000000%10;
- character[2] = fre/100000%10;
- character[3] = fre/10000%10;
- character[4] = fre/1000%10;
- character[5] = fre/100%10;
- character[6] = fre/10%10;
- character[7] = fre%10;
- character[8] = 'H';
- character[9] = 'z';
- for(i = 0;i<4;i++) //顯示“fre=”
- {
- LCD_disp_char(i+0,1,character_1[i]);
- }
- for(i = 0;i<10;i++) //判斷第一個(gè)不為0的數(shù)
- {
- if(character[i]!=0)
- break;
- }
- k = 8-i;
- 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++;
- }
- }
- //----------------主函數(shù)--------------------
- void main()
- {
- unsigned char i;
- LCD_init();
- timer_init(); //定時(shí)/計(jì)數(shù)器初始化
- for(i = 0;i<4;i++)
- {
- LCD_disp_char(i+0,1,character_1[i]);
- }
- while(1)
- {
- dis_num(); //顯示
- delay_1s();
- }
- }
- //-------------------定時(shí)/計(jì)數(shù)器初始化--------------
- void timer_init(void) //定時(shí)/計(jì)數(shù)器初始化
- {
- TMOD=0x66; //計(jì)數(shù)器0和計(jì)數(shù)器1工作工作方式2,自動(dòng)重裝初值
- TH0=0; //計(jì)數(shù)器初值為0
- TL0=0;
- TR0=1; //計(jì)數(shù)器開始計(jì)數(shù)
- ET0=1; //打開計(jì)數(shù)器0中斷
- TH1=0; //計(jì)數(shù)器初值為0
- TL1=0;
- TR1=1; //計(jì)數(shù)器開始計(jì)數(shù)
- ET1=1; //打開計(jì)數(shù)器1中斷
- RCAP2H=(65536-62500)/256; //在程序初始化的時(shí)候給RCAP2L和RCAP2H賦值,
- RCAP2L=(65536-62500)%256; //TH2和TL2將會(huì)在中斷產(chǎn)生時(shí)自動(dòng)使TH2=RCAP2H,TL2=RCAP2L。
- TH2=RCAP2H; //12M晶振下每次中斷62.5ms(1s=1000ms=62.5ms×16)
- TL2=RCAP2L;
- ET2=1; //打開定時(shí)器2中斷
- TR2=1; //定時(shí)器2開始計(jì)時(shí)
- EA=1; //開總中斷
- }
- //------------------中斷函數(shù)----------------------
- void timer2(void) interrupt 5 //定時(shí)器2中斷(62.5ms)
- {
- time++;
- TF2=0; //定時(shí)器2的中斷標(biāo)志位TF2不能夠由硬件清零,所以要在中斷服務(wù)程序中將其清零
- if (time==16) //定時(shí)1s時(shí)間到
- {
- time=0; //計(jì)時(shí)清0
- EA=0; //關(guān)中斷
- fre=(long)count1*256+TL1; //count*256強(qiáng)制轉(zhuǎn)換成long型,否則將不產(chǎn)生進(jìn)位~先判斷分頻后(計(jì)數(shù)器1)
- FLAG = 0;
-
- if(fre<2000)//如果不到200KHz則讀取分頻前(計(jì)數(shù)器0)頻率(200K÷100=2000)
- {
- fre = (long)count*256+TL0;
- FLAG = 1;
- }
- if(!FLAG)
- {
- fre = fre *100;//100分頻
- }
- TL0=0; //清零計(jì)數(shù)器0計(jì)數(shù)
- TH0=0;
- TL1=0;
- TH1=0;
- count=0; //清零計(jì)數(shù)器0計(jì)數(shù)
- count1=0;
- EA=1; //開中斷
- }
- }
- //----------------------------------------------------------------
- void timer0(void) interrupt 1 //計(jì)數(shù)器0中斷(100分頻前)
- {
- count++;
- }
- //----------------------------------------------------------------
- void timer1(void) interrupt 3 //計(jì)數(shù)器1中斷(100分頻后)
- {
- count1++;
- }
復(fù)制代碼
|
評(píng)分
-
查看全部評(píng)分
|