单片机源程序如下:
- #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,进入下一个循环
- }
- }
复制代码
|