如何用pic单片机写用中断法,让TMR0的T0IF是否有溢出中断,让LED二极管一秒钟闪动

如题所述

#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++;//加一
}来自:求助得到的回答
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-05-27
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代码中 timer0没有设置TMR0值,为什么可以计时呢?
在一些PIC单片机中,TIM0比较特殊,它的运行\/停止是不受控的。只要通电TIM0就会开始运行,中断中代码:if (T0IF&&T0IE) 所以在中断中不仅仅判断中断标志位,还必须判断中断允许位

PIC单片机 4M晶振 产生1秒延迟的原理
程序设计时用一个累计TMR0中断次数的变量T0_N,每中断一次T0_N+1,并判断其值>=20时就是1秒了。注意,TMR0中断时要清TMR0IF,并要重新对TMR0赋初值61。参考资料:北航:《PIC16F系列单片机C程序设计与PROTEUS仿真》

PIC单片机有定时器,没中断,怎么判断数据溢出
读TMR0IF就能知道T0是否溢出。if(TMR0IF){...}

PIC单片机编程的问题 刚学 不太懂
; INTCON,T0IF---TMR0 溢出 INTCON,INTF---GP2\/INT外部中断 ; INTCON,GPIF---GP5-GP0 引脚电平发生了变化 ; PIR1,EEIF---EEPROM 写操作完成 PIR1,ADIF---A\/D 转换完成 ; PIR1,CMIF---比较器输入已改变 PIR1,TMR1IF---TMR1 溢出 org 0004h ; 中断入口地址0x0004INTCON00 movwf W_TEMP ; W_...

PIC单片机汇编语言的中断程序 ,求人分析一下怎么运行的
很简单的。在main主程序里面 LOOP GOTO LOOP 这条程序,会不停的执行,到了TMR0溢出的时候就会执行中断程序 ORG 0004H为中断程序的地址

单片机求助,不用溢出不用中断,普通IO口 测量矩形波的周期?C语音写的
没有定时器中断,只能在主程序中循环查询定时器的值,一旦检测到矩形波有低电平(或高电平)时,就读出TMR0的值,就知道方波周期了。以下例程供参考,自己再稍作修改。include<pic.h> __CONFIG(0x0ffa);unsigned char timer ;\/\/ 计定时器值 \/\/PIC12F508硬件配置字,看门狗关,内部RC振荡,GO0\/GP1...

pic单片机时钟中断程序怎么执行的啊?初学,望赐教!帮忙解释一下这个程...
这是个流水灯程序,:\/定时器装初值 执行while(1)定时器标志位溢出时 程序就进入中断了 中断中 副初值 清除定时器中断的标志位 s加1 主函数while1中 如果s加到25(就是中断了25次) 就 清零s 将c口移位 你用什么型号的pic单片机啊 你确定程序可以运行么???

在LED显示汉字,怎么做到可以三个汉字循环显示?怎么添加代码?
TMR0H=0X67;\/*TMR0置初值,先写高字节,后写低字节*\/ TMR0L=0X69; INTCONbits.TMR0IE=1;\/*允许Timer0溢出中断*\/ T0CONbits.TMR0ON=1;\/*启动TMR0*\/ INTCONbits.GIE=1;\/*开全局中断*\/ while(1) { LED4_display(num);\/*完成4位数码管的一次动态扫描*\/ }}\/*0-F共阴字形码表*\/const rom...

PIC单片机 输出波形问题
建议你先检查一下I\/O口的配置。先写一段简单的测试代码,比如 PORTB_7=1(PORTB_7=0)将I\/O口拉高(拉低),用示波器测一下看看你的I\/O口是否受控。如果I\/O口是可以控制的,再检查你的定时器的设置是否正确。祝你早日调试成功!ps: 你的注释跟代码有出入,25us是25微秒,不是25毫秒 ...

为什么PIC单片机定时器0记满低8位不会向高8位进位?是不是要有特殊的配 ...
所以,你想看他是否有变化,需要在程序中读一下TMR0L。或者你看中断标志寄存器(不是叫你开中断)溢出后会自动置位INTCON的bit2位的TMR0IF。就是让你看看在TMR0L=0XFE的时候,单步运行一下,然后看TMR0IF是否被置位了。如果是,就说明你设置还是在8位定时器。

相似回答