單片機源程序如下:
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar code table[11] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- long uint pulse=0;//計數輸入的方波的個數;
- long uint freq=0;//頻率
- uchar temp=0; //臨時變量
- uchar f;
- void delay_1ms(uint i) //延時函數,約1ms
- {
- uint x,j;
- for(j=0;j<i;j++)
- for(x=0;x<=148;x++);
- }
- void Time0_Init()//定時器和計數器的初始化函數
- {
- EA=1; //打開全局中斷
- TMOD = 0x15;//設定定時器1和計數器0的工作方式為方式1
-
- TH0 = 0xff;//計數器0的初值
- TL0 = 0xff;//計數器0的初值
- ET0=1; //允許計數器0中斷
- TR0=1; //打開計數器0,開始計數
- TH1 = 0x3c;//定時器1的初值
- TL1 = 0xb0;//定時器1的初值
- ET1=1; //允許定時器1中斷
- TR1 = 1;//打開定時器1,開始計數
- }
- void main()
- {
- Time0_Init(); //初始化定時器和計數器
-
- while(1)
- {
-
- P2=0xf7; //以下為數碼管顯示函數
- P0=0x00;
- P0=table[freq/1000%10];
- delay_1ms(2);
- P2=0xfb;
- P0=0x00;
- P0=table[freq/100%10];
- delay_1ms(2);
- P2=0xfd;
- P0=0x00;
- P0=table[freq/10%10];
- delay_1ms(2);
- P2=0xfe;
- P0=0x00;
- P0=table[freq%10];
- delay_1ms(1);
- }
- }
- void ISQ_timer0(void) interrupt 1 //用來計數脈沖數,每一個方波脈沖,計數器進入中斷,脈沖數加一
- {
- TR0 = 0;
- pulse++;
- TH0 = 0xff;
- TL0 = 0xff;
- TR0 = 1;
- }
- /****************************************************************
- 用來設定時間,定時器的周期為50ms,當經過20次后,
- 也即1s后,關斷定時器和計數器,將一秒內計數的脈沖數賦給頻率pulse,
- 一秒內采集的脈沖數即為輸入方波的頻率
- ****************************************************************/
- void ISQ_time1() interrupt 3
- {
- TH1 = 0x3c;
- TL1 = 0xb0;
- temp++;
- if(temp==20)
- {
- TR0 = 0;
- TR1 = 0;
- temp=0;
- freq=202642400/pulse*100/pulse;
- pulse=0;//將脈沖數清零,重新計數
- TR0 = 1;//打開計數器0,進入下一個循環
- TR1 = 1;//打開定時器1,進入下一個循環
- }
- }
復制代碼
|