单片机定时器中断

看看哪边有问题  void t_0(void) interrupt 1    //定时器0中断程序{    interval--;  TH0=0xff;                  //定时器0  定时0.1ms  TL0=0x9c;  }  void timer (void)    //间隔计时{    EA=1;    ET0=1;   TR0 = 1 ;  i=time_interval;  while(i)  {     for(;;)  } P2=0x00;  }   void up(ulong frequency)     //正转   {     frequency1=frequency; while(frequency1) { LA=1;  timer( );     //定时 LA=0; frequency1--; LB=1;    timer( ); LB=0; frequency1--; LC=1; timer( ); LC=0; frequency1--; LD=1; timer( );  LD=0; frequency1-- ;   }   P2=0x0f;  } 

#include <pic.h> //调用头文件,可以去PICC软件下去查找PIC16F87XA单片机的头文件
__CONFIG(XT&WDTEN&LVPDIS); //定义配置字,晶振类型:XT,启动开门狗,禁止低电压编程

#define HC138_A RE2 //定义U6、U7、U8的A为RE2端口
#define HC138_B RE1 //定义U6、U7、U8的B为RE1端口
#define HC138_C RE0 //定义U6、U7、U8的C为RE0端口

#define U6_E RA2 //定义U6_E为RA2端口,U6E=1时,U6使能否则失能
#define U7_E RA3 //定义U7_E为RA3端口,U7E=1时,U7使能否则失能
#define U8_E RA1 //定义U8_E为RA1端口,U8E=1时,U8使能否则失能

#define V1 RA5 //定义V1为RA5端口

unsigned int tmcon;

//---------------------------------------
//名称: 初始化函数
//日期:20101001
//-----------------------------------------
void init(void)
{
ADCON1=0X06; //所有IO均为数字口,模拟量输入禁止
OPTION=0x80; //关闭RB口电平变化功能
TRISA=0B11010001; //RA1,RA2,RA3,RA5置为输出,其他未用设置为输入
TRISB=0B11111111; //其他未用设置为输入
TRISC=0B11111111; //其他未用设置为输入
TRISD=0B11110011; //未用设置为输入
TRISE=0B11111000; //RE0,RE1,RE2置为输出,其他未用设置为输入
RD2=0; //关闭蜂鸣器
RD3=0; //关闭继电器
RA1=0; //关掉数码管、发光二极管
RA2=0; //关掉LED点阵屏左8列
RA3=0; //关掉LED点阵屏右8列
RBIE=0; //RB口电平变化中断禁止
}
//---------------------------------------
//名称: T0初始化函数
//日期:20100501
//-----------------------------------------
void timer0init(void)
{
T0CS=0; //TMR0工作于定时器方式
PSA=1; //TMR0不分频
T0IF=0; //清除TMR0中断标志
T0IE=1; //TMR0中断允许
TMR0=0x13; //赋初值,以便TMR0每250US中断一次
GIE=1;
}
//---------------------------------------
//名称: T0中断函数(250US)
//日期:20101001
//-----------------------------------------
void interrupt ISR(void)
{
if(TMR0IF==1) //250us
{
TMR0=0x13;
T0IF=0;
if(++tmcon>3999) //计数4000次后,为1秒
{
tmcon=0;
V1=!V1;
}
}
}
//---------------------------------------
//名称: 主函数
//日期:20101001
//-----------------------------------------
void main(void)
{
init();
timer0init();
V1=0; //熄灭V1

HC138_A=0; //使74HC138的Y0端为0,其他高阻
HC138_B=0; //使74HC138的Y0端为0,其他高阻
HC138_C=0; //使74HC138的Y0端为0,其他高阻

U6_E=0; //U6关闭
U7_E=0; //U7关闭
U8_E=1; //U8打开
while(1)
{
asm("CLRWDT");
}
}//[email protected]
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-12-24
你好 看来你想用定时器做延时用,用timer( );来启动定时器,其实你的程序中定时器都没按照你的意思运行,这样
void t_0(void) interrupt 1 //定时器0中断程序
{
TR0=0; //插入该行???????
interval--;
TH0=0xff; //定时器0 定时0.1ms
TL0=0x9c;
}
void timer (void) //间隔计时
{
EA=1; //放主程序开始处
ET0=1; // 放主程序开始处
TR0 = 1 ;
i=time_interval;
while(i)
{
for(;;)
}
P2=0x00; }
void up(ulong frequency) //正转
{
frequency1=frequency;
while(frequency1)
{ LA=1;
timer( ); //定时
LA=0;
frequency1--;
LB=1;
timer( );
LB=0;
frequency1--;
LC=1;
timer( );
LC=0;
frequency1--;
LD=1;
timer( );
LD=0;
frequency1-- ;
}
P2=0x0f; }
第2个回答  2011-12-23
这个延时好奇怪:
void timer (void) //间隔计时
{
EA=1;
ET0=1;
TR0 = 1 ;
i=time_interval;
while(i)
{
for(;;)
}
P2=0x00;
}
相似回答