如何用pic单片机写用中断法,让TMR0的T0IF是否有溢出中断,让LED二极管一秒钟闪动
2个回答
展开全部
#include<pic.h>//用中断法,让TMR0的T0IF是否有溢出中断,让LED二极管一秒钟闪动,因为PIC单片机如果写有定时计数器则从一上电开始计时
//在使用定时计数器时一定要设置选项寄存器(OPTION_REG)和中断控制寄存器(INTCON)
#define uchar unsigned char
#define uint unsigned int
__CONFIG(0x3B31);
uint initnum;//定义一个溢出中断的变量
void init()//初始化接LED的RD端口为输出,及设置OPTION寄存器关闭TMR0定时计时器
{
TRISD=0;//输出状态
PORTD=0;//关闭
OPTION=0x07;//设置选项寄存器为00000111是设置PSA选择为0,PS2-PS0为111:分频比是1:256其他的为零
INTCON=0xa0;//设置中断控制寄存器为10100000,开总中断,开允许中断,和T0IF在初始化中还不能溢出
TMR0=61;//因为PIC单片机定时计数器从一上电开始计时了,我们设置它每50ms产生溢出中断即是50000除以256等于195,也就说加了195个数后就到50ms了,那么要溢出就得加满所以要先装256-195=61个数
}
void main()//在主函数里中断函数不需要调用和判断是否产生中断溢出标志T0IF,因为从一上电就自动运行,一到50ms中断会自动溢出加1
{
init();
while(1)
{
if(initnum==20)//它每50ms产生溢出中断,20次则是一秒
{
initnum=0;//到了1s后清零
RD0=!RD0;//取反,再到第二次溢出又取反电平
}
}
}
void interrupt time0()//定时器的程序,后面不用写和51单片机那样的序号,也不用就算写在主函数的后面也不用声明
{ //例如:如果是T0IF置位才能知用是TMR0定时器,如果是T1IF置位才能知道是TMR1定时器
T0IF=0;//先置零,同时知道是用TMR0定时器
TMR0=61;//也要重新装一次初值
initnum++;//加一
}
//在使用定时计数器时一定要设置选项寄存器(OPTION_REG)和中断控制寄存器(INTCON)
#define uchar unsigned char
#define uint unsigned int
__CONFIG(0x3B31);
uint initnum;//定义一个溢出中断的变量
void init()//初始化接LED的RD端口为输出,及设置OPTION寄存器关闭TMR0定时计时器
{
TRISD=0;//输出状态
PORTD=0;//关闭
OPTION=0x07;//设置选项寄存器为00000111是设置PSA选择为0,PS2-PS0为111:分频比是1:256其他的为零
INTCON=0xa0;//设置中断控制寄存器为10100000,开总中断,开允许中断,和T0IF在初始化中还不能溢出
TMR0=61;//因为PIC单片机定时计数器从一上电开始计时了,我们设置它每50ms产生溢出中断即是50000除以256等于195,也就说加了195个数后就到50ms了,那么要溢出就得加满所以要先装256-195=61个数
}
void main()//在主函数里中断函数不需要调用和判断是否产生中断溢出标志T0IF,因为从一上电就自动运行,一到50ms中断会自动溢出加1
{
init();
while(1)
{
if(initnum==20)//它每50ms产生溢出中断,20次则是一秒
{
initnum=0;//到了1s后清零
RD0=!RD0;//取反,再到第二次溢出又取反电平
}
}
}
void interrupt time0()//定时器的程序,后面不用写和51单片机那样的序号,也不用就算写在主函数的后面也不用声明
{ //例如:如果是T0IF置位才能知用是TMR0定时器,如果是T1IF置位才能知道是TMR1定时器
T0IF=0;//先置零,同时知道是用TMR0定时器
TMR0=61;//也要重新装一次初值
initnum++;//加一
}
来自:求助得到的回答
展开全部
PIC单片机初始化设置不说了,端口工作模式设为数字IO + 输出,timer设置,初始化,开TMR0中断,开外部中断、开总中断。
PIC单片机的中断函数比较特别一点,所有的中断入口只有一个,中断源在中断函数内自己判断,形式如下(interrupt是关键字)
void interrupt isr(void)
{
if(TMR1IF) //timer1中断 做系统基准定时
{
TMR1ON = 0;
asm("CLRWDT");
TMR1IF = 0;
TMR1H = 0xFF - (uchar)(((SYSTEMBASETICK-40)/(4*1000000/FOSC))/255);
TMR1L = 0xFF - (uchar)(((SYSTEMBASETICK-40)/(4*1000000/FOSC))%255);
GlobeTick++;
TMR1ON = 1;
}
if(INTE && INTF) //外部中断 INT
{
INTF = 0;
INTE = 0;
}
//if(RCIF) //串口接收中断,硬件冲突,未使用
//{
// tmp = RCREG;
// TXREG = tmp;
//}
//GIE = 1;
}
PIC单片机的中断函数比较特别一点,所有的中断入口只有一个,中断源在中断函数内自己判断,形式如下(interrupt是关键字)
void interrupt isr(void)
{
if(TMR1IF) //timer1中断 做系统基准定时
{
TMR1ON = 0;
asm("CLRWDT");
TMR1IF = 0;
TMR1H = 0xFF - (uchar)(((SYSTEMBASETICK-40)/(4*1000000/FOSC))/255);
TMR1L = 0xFF - (uchar)(((SYSTEMBASETICK-40)/(4*1000000/FOSC))%255);
GlobeTick++;
TMR1ON = 1;
}
if(INTE && INTF) //外部中断 INT
{
INTF = 0;
INTE = 0;
}
//if(RCIF) //串口接收中断,硬件冲突,未使用
//{
// tmp = RCREG;
// TXREG = tmp;
//}
//GIE = 1;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询