我的思路就是t0計數,t1計時,然后在1602顯示,但是誤差很大,程序應該出現問題,可是我檢查不出來,希望大家能幫我看看!! |
- #include<reg51.h>
- #define uchar unsigned char
- sbit RS = P1^0;
- sbit RW = P1^1;
- sbit EN = P1^2;
- int k = 0;
- int f;
- uchar count;
- uchar tab_freq[]={0,0,0,0,0,0,0}; //頻率數組
- void delay(int x){ //延時
- int i;
- for(i=x;i>0;i--);
- }
- void write_com(char com){ //寫指令
- P0=com;
- RS=0;RW=0;EN=1;
- delay(200);
- EN=0;
- }
- void write_dat(char dat){ //寫數據
- P0=dat;
- RS=1;RW=0;EN=1;
- delay(200);
- EN=0;
- }
- void lcd_init(){ //初始化
- write_com(0x01);
- write_com(0x38);
- write_com(0x0f);
- write_com(0x06);
-
- }
- void int_count0() interrupt 1{ //T0計數
- k++;
- }
- void int_time1() interrupt 3{ //T1定時中斷函數開始{
- TH1=0x3c;
- TL1=0xb0; //50MS
- count++;
- if(count>=20)
- {
- count=0;
- TR0=0; //到1秒T0停止計數
- TR1=0;
- f = k;
- k=0; //T1停止定時
- TH1=0x3c;
- TL1=0xb0;
- }
- }
- void trans_count() //計算出一秒鐘收到的脈沖數量
- {
- unsigned long int z;
- int i;
- z = f*65536 + TH0 * 256 + TL0;
- if(z>9999999) //最大量程為999999
- {z=9999999;}
- for(i = 6;i > 0;i--)
- {
- tab_freq[i]=z%10+'0';
- z /= 10;
- }
- }
- void main(){
- uchar i;
- TMOD = 0x15; //T0為計數模式:方式1 T1為定時模式:方式1
- TH0 = 0; //T0計數初始值
- TL0 = 0;
- TR0=1;
- TR1=1;
- TH1 = 0x3c; //T1定時初始值
- TL1 = 0xb0; //50MS
- EA = 1;
- ET1 = 1; //允許T1定時中斷
- ET0 = 1; //允許T0計數中斷
- lcd_init();
- trans_count();
- for(i=0;i<7;i++)
- {
- write_dat(tab_freq[i]); //顯示頻率值
- }
- write_dat('H');
- write_dat('z'); //顯示Hz
- delay(20000);
- write_com(0x02);
- }
復制代碼
360截圖20180721114431859.jpg (102.48 KB, 下載次數: 28)
下載附件
2018-7-22 09:26 上傳
仿真我設置3kHz,結果他一直顯示30Hz、29Hz。到底怎么回事啊?
|