聲明:由青島理工大學建電16級某同學發布,希望不要雷同
話不多說,直接上圖仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (112.65 KB, 下載次數: 51)
下載附件
2018-7-7 17:20 上傳
總仿真圖,左上角是最小系統,右下角為啟動開關,信號輸入,左下角為閘門時間(采樣時間)控制,上升下降
核心算法是daimao=(to*65536+TH0*256+TL0)/m,m為采樣時間,daimao為頻率。具體內容請見報告
閘門時間2s時誤差在百分之11,3,、4s在百分之7,5s在百分之4,6s、7s在百分之3.簡要做了點誤差處理,很粗糙,希望大家留言改正,謝謝。
程序框圖在課設報告中
0.png (17.43 KB, 下載次數: 39)
下載附件
2018-7-7 17:20 上傳
0.png (20.29 KB, 下載次數: 39)
下載附件
2018-7-7 17:21 上傳
單片機總程序:
- #include "reg52.h"
- #define uchar unsigned char
- typedef unsigned int uint;
- sbit w1=P2^0;
- sbit w2=P2^1;
- sbit w3=P2^2;
- sbit w4=P2^3;
- sbit w5=P2^4;
- sbit w6=P2^5;
- sbit jia=P1^6;
- sbit jian=P1^7;
- sbit s=P3^7;//啟動
- bit flag;//標簽
- uchar s1,s2,s3,s4,s5,s6, shu=1;//控制數組取值
- uchar t0,t1,t2,a;
- unsigned long m=5,n;//m為閘門時間
- int y;
- unsigned long daimao;//頻率
- unsigned char code table1[]={0xc0,0xf9,0xa4,0xb0, //閘門時間數組0-f
- 0x99,0x92,0x82,0xf8,
- 0x80,0x90,0x88,0x83,
- 0xc6,0xa1,0x86,0x8e};
- unsigned char code table2[]={0xc0,0xf9,0xa4,0xb0, //頻率數組0-f
- 0x99,0x92,0x82,0xf8,
- 0x80,0x90,0x88,0x83,
- 0xc6,0xa1,0x86,0x8e};
-
-
- void delay1(int z)//延時子程序
- {
- int q,w;
- for(q=z;q>0;q--)
- for(w=110;w>0;w--);
- }
- void delay2(uint x)//按鍵消抖
- {
- uint s;
- uchar w;
- for(s=0;s<x;s++)
- for(w=0;w<110;w++);
- }
- void zhamen1()//閘門時間加
-
- {
- if(jia==0)
- { while(jia!=1);
- m=m+1;}
-
- }
- void zhamen2()//閘門時間減
- {
- if(jian==0)
- {while(jian!=1);
- m=m-1;}
- }
- void iint()//初始化
- {
- flag=0;
- TMOD=0x15;//t1為定時器,t0為計數器模式
- TH1=(65536-4000*m)/256;//設初始值
- TL1=(65536-4000*m)%256;
- TH0=0;
- TL0=0;
- EA=1; //允許中斷
- ET0=1;//定時器0的中斷允許
- ET1=1;//定時器1的中斷允許
- TR1=1;//定時器1啟動
- TR0=1;//定時器0啟動
- }
- void timer0() interrupt 1//定時器0初始化
- {
- TH0=0x00;
- TL0=0x00;
- t0++;
-
- }
- void timer1() interrupt 3//定時器1初始化
- {
- TH1=(65536-4000*m)/256;
- TL1=(65536-4000*m)%256;
- t1++;
- }
復制代碼
0.png (65.55 KB, 下載次數: 49)
下載附件
2018-7-7 17:21 上傳
全部資料51hei下載地址:
數字頻率計.zip
(270.78 KB, 下載次數: 144)
2018-7-7 09:51 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|