希望有人能点拨下
时间:10-02
整理:3721RD
点击:
定时功能出问题,不准,有人能点拨下我的程序问题出在哪吗?
#include<pic.h>
__CONFIG(HS&WDTDIS&LVPDIS);
#define P1 RC7 //模拟定时加
#define P2 RC6 //模拟定时减
#define LED1 RC4 //模拟电磁阀
#define LED2 RC5 //模拟电磁阀
#define Beng RC3 //模拟定时时间到时,切断所有设备的信号
unsigned int q=1; //用于电磁阀切换程序
unsigned char h=0; //用于电磁阀切换程序
unsigned int check=0; //用于定时程序
signed char t=0; //存储定时值
unsigned char ONE=1;
unsigned char d=0;
const unsigned char LED[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7d,0x07,0x7f,0x6f};
void Delay1602(unsigned int g)
{
unsigned int k; //定义一个16位寄存器用来做延时用
for(k=0;k<g;k++); //延时
}
void interrupt ISR(void) //中断程序
{
if(T0IF==1)
{ PORTB=0;
d=!d;
if(d==0)
{
PORTD=0B00000000;
PORTB=LED[t/10];
}
else
{
PORTD=0B00000001;
PORTB=LED[t%10];
}
TMR0=0x13;
T0IF=0;
if(ONE==1)
{
if(++q>2000) //4s
{
q=1;
LED1=0;
LED2=1;
ONE++;
}
}
else if(ONE==2)
{
if(++q>500) //1s
{
q=1;
LED1=0;
LED2=0;
ONE++;
}
}
else if(ONE==3)
{
if(++q>130) //0.26
{
q=1;
LED1=0;
LED2=1;
ONE++;
}
}
else if(ONE==4)
{
if(++q>1370) //2.74s
{
q=1;
LED1=1;
LED2=1;
ONE++;
}
}
else if(ONE==5)
{
if(++q>350) //0.7s
{
q=1;
LED1=(!h);
LED2=h;
h=(!h);
ONE--;
}
}
}
else if(TMR2IF==1) //定时中断
{
TMR2=0x12;
TMR2IF=0;
if(++check>(250*60)) //4000us中断一次,再计次250次后就是1000毫秒,乘60就是1分钟
{
check=0;
if(t==1) Beng=1;
t--;
}
}
}
void main(void)
{
TRISD=0B11111000;
TRISB=0B00000000;
PORTB=0B00000000;
PORTD=0B00000000;
TRISC=0B11000000;
PORTC=0B00110000;
T2CKPS1=1;
T2CKPS0=1;
TMR2=0X12;
TOUTPS3=0;
TOUTPS2=0;
TOUTPS1=0;
TOUTPS0=0;
TMR2IF=0;
TMR2IE=1;
PEIE=1;
T0CS=0;
PSA=0;
PS0=0;
PS1=1;
PS2=0;
TMR0=0X13;
T0IF=0;
T0IE=1;
GIE=1;
while(1)
{
if(P1==0)
{
t++;
Delay1602(25000);
while(P1==0)
{
t++;
Delay1602(15000);
if(t>99) t=0;
}
if(t>99) t=0;
}
if(P2==0)
{
t--;
Delay1602(25000);
while(P2==0)
{
t--;
Delay1602(15000);
if(t<0) t=99;
}
if(t<0) t=99;
} //定时程序
if(t!=0)
{
TMR2ON=1;
Beng=0;
} //判断是否定时到时
else
TMR2ON=0;
}
}
#include<pic.h>
__CONFIG(HS&WDTDIS&LVPDIS);
#define P1 RC7 //模拟定时加
#define P2 RC6 //模拟定时减
#define LED1 RC4 //模拟电磁阀
#define LED2 RC5 //模拟电磁阀
#define Beng RC3 //模拟定时时间到时,切断所有设备的信号
unsigned int q=1; //用于电磁阀切换程序
unsigned char h=0; //用于电磁阀切换程序
unsigned int check=0; //用于定时程序
signed char t=0; //存储定时值
unsigned char ONE=1;
unsigned char d=0;
const unsigned char LED[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7d,0x07,0x7f,0x6f};
void Delay1602(unsigned int g)
{
unsigned int k; //定义一个16位寄存器用来做延时用
for(k=0;k<g;k++); //延时
}
void interrupt ISR(void) //中断程序
{
if(T0IF==1)
{ PORTB=0;
d=!d;
if(d==0)
{
PORTD=0B00000000;
PORTB=LED[t/10];
}
else
{
PORTD=0B00000001;
PORTB=LED[t%10];
}
TMR0=0x13;
T0IF=0;
if(ONE==1)
{
if(++q>2000) //4s
{
q=1;
LED1=0;
LED2=1;
ONE++;
}
}
else if(ONE==2)
{
if(++q>500) //1s
{
q=1;
LED1=0;
LED2=0;
ONE++;
}
}
else if(ONE==3)
{
if(++q>130) //0.26
{
q=1;
LED1=0;
LED2=1;
ONE++;
}
}
else if(ONE==4)
{
if(++q>1370) //2.74s
{
q=1;
LED1=1;
LED2=1;
ONE++;
}
}
else if(ONE==5)
{
if(++q>350) //0.7s
{
q=1;
LED1=(!h);
LED2=h;
h=(!h);
ONE--;
}
}
}
else if(TMR2IF==1) //定时中断
{
TMR2=0x12;
TMR2IF=0;
if(++check>(250*60)) //4000us中断一次,再计次250次后就是1000毫秒,乘60就是1分钟
{
check=0;
if(t==1) Beng=1;
t--;
}
}
}
void main(void)
{
TRISD=0B11111000;
TRISB=0B00000000;
PORTB=0B00000000;
PORTD=0B00000000;
TRISC=0B11000000;
PORTC=0B00110000;
T2CKPS1=1;
T2CKPS0=1;
TMR2=0X12;
TOUTPS3=0;
TOUTPS2=0;
TOUTPS1=0;
TOUTPS0=0;
TMR2IF=0;
TMR2IE=1;
PEIE=1;
T0CS=0;
PSA=0;
PS0=0;
PS1=1;
PS2=0;
TMR0=0X13;
T0IF=0;
T0IE=1;
GIE=1;
while(1)
{
if(P1==0)
{
t++;
Delay1602(25000);
while(P1==0)
{
t++;
Delay1602(15000);
if(t>99) t=0;
}
if(t>99) t=0;
}
if(P2==0)
{
t--;
Delay1602(25000);
while(P2==0)
{
t--;
Delay1602(15000);
if(t<0) t=99;
}
if(t<0) t=99;
} //定时程序
if(t!=0)
{
TMR2ON=1;
Beng=0;
} //判断是否定时到时
else
TMR2ON=0;
}
}
因为在主函数里个人没办法让数码管有足够的刷新频率从而显示无闪烁的定时,所以想在中断中实现,但是如题,在中断中加入数码管显示的几句语句就造成程序出现了问题,现象就是数码管显示的定时周期远大于1分钟,愣是没看出问题出在哪
帮顶一下。虽然搞不定
谢谢分享 先学习下
这是用哪个PIC单片机?Timer2寄存器是多少位的?这个250*60是不是超了?