/***************************************************** 程序说明: 1,功能:频率计,采用周期对比法,即在0.5秒内所计得的脉冲数。 最大计数9999个脉冲(十进制数仅有四位),最大频率为 9999*2=19.998KHz. 2,硬件电路:PIC16F87X,4.00陶瓷振荡器。计数脉冲从IC第15脚 输入。 3,硬件资源:使用了两个定时器,TMR2,TMR1;TMR2完成0.5秒的 定时,TMR2完成在0.5抄内计量脉冲的个数。 *****************************************************/
#include "pic.h"
unsigned int x,f_result; unsigned char a,b,c,d,e,y1,y2,flag,a1,a2,b1,n,b2;
void interrupt ISR(void) { if(TMR2IE&&TMR2IF) //定时时间500000us=250*4(前分频比)*10(后分频比)*50(循环次数) { TMR2IF=0; n++; if(n>=50) { flag=1; n=0; TMR1ON=0; //停止计数,为了下面读出正确的数值。 TMR2ON=0; y1=/*0xff*/TMR1H; y2=/*0xff*/TMR1L; TMR1H=0; //计数器清零。 TMR1L=0; TMR2ON=1; //重新开启TMR1,TMR2。 TMR1ON=1; RD0=!RD0; } } }
void main(void) { TRISD=0X00; // OUTPUT PORTD=0XFF; TRISC=0x0F; //RC0设为input. n=0; T2CON=0b01001101;//-- TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKIPSI T2CKIPS0 后分频比为 1:10,前分频1:4。 PR2=249; //设置初值,希望得到250计数次数。中断50次,得到0.5S. TMR1H=0x00; //赋初值; TMR1L=0x00; T1CON=0b10000011; //-- -- T1CKPSI T1CKPS0 T1OSCEN T1SYNC TMR1CS TMR10N ,分频比1:1 TMR1CS=1(外部引脚上升沿计数),T1SYNC=0同步计数; TMR1ON=1(开启计数器) INTCON=0b11000000; //GIE PEIE T0IE INTE RBIE T0IF INTF RBIF PIE1=0b00000010; //PSPIE ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE PIR1=0B00000000; //PSPIF ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF
while(1) { if(flag==1) { //di(); x=y1; //须将十六进制数化为十进制数 x<<=8; x+=y2; e=x%10; x/=10; d=x%10; x/=10; c=x%10; x/=10; b=x%10; a=x/10; /******************* a1=a<<4; a2=a1+b; b1=c<<4; b2=b1+d; f_result+=a2; f_result<<=8; f_result+=b2; ********************/ switch (c) /*abcde*/ { case 0: PORTD=~0b11111100; break; //高--低 abcdefg: 1111110 0 case 1: PORTD=~0b01100000; break; //高--低 abcdefg: 0110000 0 case 2: PORTD=~0b11011010; break; //高--低 abcdefg: 1101101 0 case 3: PORTD=~0b11110010; break; //高--低 abcdefg: 1111001 0 case 4: PORTD=~0b01100110; break; //高--低 abcdefg: 0110011 0 case 5: PORTD=~0b10110110; break; //高--低 abcdefg: 1011011 0 case 6: PORTD=~0b10111110; break; //高--低 abcdefg: 1011111 0 case 7: PORTD=~0b11100000; break; //高--低 abcdefg: 1110000 0 case 8: PORTD=~0b11111110; break; //高--低 abcdefg: 1111111 0 case 9: PORTD=~0b11110110; break; //高--低 abcdefg: 1111011 0 default:; } flag=0; //ei(); } } }