本帖最后由 NOKOL520 于 2019-8-22 15:37 编辑
新手学习16f917,定时器1给蜂鸣器提供波形!定时器2改变定时器1的频率,让蜂鸣器能发出类似的报警声!主函数里一个定时检测电压的,一个按键程序,现在出现的问题是,主函数跑不起来!测试发现,主函数跑了890次左右时就不跑了,然后就一直在定时器中断里打转!前面的这段时间定时器也是正常的在跑!如果把中断函数删掉,主函数就能正常跑起来!只是关掉定时器使能没用。。。。求论坛里的大神们帮忙看看,哪里出了问题!- #include<pic.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define low RD0
- #define lbt RD3
- #define high RD2
- #define flt RD4
- #define spk RD5
- #define mot RD6
- #define ctr RD7
- #define keyin RB0
- uint data[2]={64722,64436}; //蜂鸣器频率const
- uint count=0,jcout=0,mode=0,lednum;
- uint vba,isp,k,t,flagb,flagf,i,p,j,s;
- __CONFIG(0xE0F1); //30F5
- //void delay(uint x);
- void init();
- uint get_ad(uchar y);
- void monitor();
- void key_scan();
- void sentchar(uchar data1);
- void printcom(const uchar *dat);
- void printdata(uint dat);
- uint filter();
- void main()
- {
- init();
- while(1)
- {
- k++;
- RD1=!RD1;
- if(k>=1000)
- {
- k=0;
- monitor();
- //TMR1IE=!TMR1IE;
- //TMR1ON=TMR1IE;
- }
- key_scan();
- }
- }
- /*void delay(uint x)
- {
- uint a,b;
- for(a=x;a>0;a--)
- for(b=110;b>0;b--);
- }*/
- void init() //初始化:4MHZ,AD, PWM,uart,定时器012
- {
- OSCCON=0x67;
- TRISA=0x0f;
- TRISB=0x01;
- TRISC=0xc0;
- TRISD=0;
- PORTA=0;
- PORTB=0;
- PORTC=0;
- PORTD=0xE1;
- TXSTA=0x24;
- RCSTA=0x90;
- SPBRG=25;
- RCIE=1;
-
- ANSEL=0x28;
- ADIE=1;
- ADCON0=0x05;
- ADCON1=0x9e;
-
- OPTION=0X07;
- TMR0=61;
- T0IE=1;
- INTCON=0xa0;
- GIE=1;
- PEIE=1;
- PIE1=0X03;
- T2CON=0X1C;
- //TMR2IE=0;
- TMR2ON=1;
- CCPR1L=0x5b; //C8
- CCP1CON=0x0C;
- //TMR2=0;
- PR2=0x7C;
- T1CON=0x01;
- TMR1L=(65536-200)%256;
- TMR1H=(65536-200)/256;
- //delay(10);
- T1CON=0;
- PORTD=0x81;
- }
- uint get_ad(uchar y) //AN1---133,AN3---141
- {--ADC--}
- void monitor()
- {--调用ADC和平均值+判定---}
- void key_scan(){---按键扫描----}
- void sentchar(uchar data1){---发送数据---}
- void printcom(const uchar *dat){----发送字符串----}
- void printdata(uint dat){ ----发送变量值----}
- uint filter(){----去除最大和最小后取平均值----}
- void interrupt T1()
- {
- if(TMR1IF==1)
- {
- p=data[jcout];
- TMR1H=p/256;
|