我是一个菜鸟,教科书上和网上怎么全是那种delay(xxx);的死等的延时函数,好多场合根本用不了,所以想用定时器做一个延时函数(直接调用的那种),写出来之后不知道怎么搞的这个程序延时10ms可以,但是时间长了就不行,但是加上红色字体的那几句就可以了(已测试),附件里面是开始的程序,为什么要加红色的那几句呢!(不加的话LED应该也会亮啊,)....各位看看....
#include <pic.h> //头文件在HI-TECH安装目录下\HI-TECH Software\PICC\std\9.60\include
#define uchar unsigned char
#define uint unsigned int
#define LED RB4
void IO_init(void);
uchar time_delay(uint x);
void timer1_init(void) ;
bank1 uchar time_flag;
bank1 uint time;
bank1 uchar flag;
//**********************IO初始化操作*************************************************
void IO_init(void)
{
TRISB=0x00;
PORTB=0xff;
TRISC=0x00;
PORTC=0x00;
TRISD=0x10;
PORTD=0xff;
TRISE=0x00;
PORTE=0x00;
TRISA=0x3F;
PORTA=0xFF;
ANSELH=0x00;
ANSEL=0x08;
}
uchar time_delay(uint x)
{
uchar i;
if(flag==0)
{
time_flag=1;
flag=1;
}
if(time>=x)
{
time_flag=0;
flag=0;
i=1;
}
return i;
}
//***********************************************************************************
void timer1_init(void) //fosc/4=4M/4所以计数周期为1us
{
T1CON=0X01; //16位定时方式
TMR1IF=0; //清timer1中断标志
TMR1IE=1; //timer1中断允许
TMR1H=(65536-1984)/256;
TMR1L=(65536-1984)%256;
PEIE=1; //允许外围中断
GIE=1; //开总中断
}
//****************************************************************************************
//--------------------------------定时器中断----------------------------------------
//***********************************************************************************
void interrupt ISR(void)
{
if(TMR1IF==1)
{
TMR1H=(65536-1984)/256; //中断一次对TMR1写入一个调整值。
TMR1L=(65536-1984)%256;
TMR1IF=0; //清timer1中断标志
if(time_flag==1)
{
time++; //1ms
}
else time=0;
}
}
//主函数
//***********************************************************************************
void main()
{
__CONFIG(XT&WDTDIS&LVPDIS);//配置,设置为晶振XT方式振荡,禁看门狗,禁低电压编程
IO_init(); //I/O口初始化
timer1_init(); //定时器初始化
while(1)
{
if(time_delay(1000)==1)//1后点亮LED_R
{
LED_R=0;
}
}
}
|