pic单片机定时器0问题
用PIC16F685这个型号,发现定时器0没有开启停止位(第一次玩这个单片机),而且写了个代码,发现定时器溢出标志一直没置位。用中断方式,中断也进不去大家给看看。#include <pic16f685.h>
unsigned int i;
void Init_Fosc(void)
{
OSCCON=0x67;//内部时钟 4M
}
void Init_GPIO(void)
{
PORTC =0;
TRISCbits.TRISC1=0; //RC1口设置成输出 用来控制继电器
PORTCbits.RC1=0;
}
void Init_Timer0(void)
{
OPTION_REG=0x87; //预分频为256
}
/*void interrupt isr(void)//中断程序,interrupt是个关键字说明该函数,是中断函数。
{
i++;
if(i==20)
{
PORTCbits.RC1=1;
i=0;
}
INTCONbits.T0IF=0;//清零中断标志位 如果在离开中断程序前没有清零,程序将不停的中断。
TMR0=61;//给TMR0付初始值61 ,开始下一个50ms计时做准备。
}*/
void main()
{
unsigned char i;
Init_Fosc();
Init_GPIO();
Init_Timer0();
//INTCONbits.GIE=1;//开启总中断
INTCONbits.T0IF=0;//清零TMR0溢出中断标志位
//INTCONbits.T0IE=1;//开启TMR0溢出中断
TMR0=61;//50ms
while(1)
{
if(T0IF==1)
{
i++;
T0IF=0;//清除T0IF中断标志位
TMR0=61;//设置中断初始值61为下次50ms定时做准备
if(i==20)
{
i=0;
RC1=0;
}
else
{
RC1=1;
}
}
}
} i++;
if(i==20)
{
PORTCbits.RC1=1;
i=0;
}
INTCONbits.T0IF=0;//清零中断标志位 如果在离开中断程序前没有清零,程序将不停的中断。
TMR0=61;//给TMR0付初始值61 ,开始下一个50ms计时做准备。
if(T0IF==1)
{
i++;
T0IF=0;//清除T0IF中断标志位
TMR0=61;//设置中断初始值61为下次50ms定时做准备
if(i==20)
{
i=0;
RC1=0;
}
else
{
RC1=1;
}
中断程序和main循环程序同时操作中断标志位、RC1口? 楼主怎么确认没有进中断,没有置溢出标志位的?
还是在线调试看看的好,提醒下,PORTC口的要设置为数字模式,模拟关掉 任何一个中断都是指向同一个中断向量,要在中断里面判断是哪个产生的 中断 如TMR0IF 你确认主程序里的while有用吗?用MPLAB仿真一下吧,RC1总是等于1,中断里已经把T0IF清零了。 szxszx 发表于 2015-3-17 20:04
i++;
if(i==20)
{
中断服务函数前面我有注释了,不好意思没删掉 yklstudent 发表于 2015-3-17 21:58
楼主怎么确认没有进中断,没有置溢出标志位的?
还是在线调试看看的好,提醒下,PORTC口的要设置为数字模式 ...
用示波器看RC1的电平状态的,不用定时器,用软件延时可以RC1可以实现方波。用这个程序,先将RC1置1,然后用定时器定时的方法,在定时到了以后置0,用示波器看没置0,所以确定没执行if(T0IF==1),没置位中断也就进不去了,我原来一直在找是不是需要开启定时器,但是这款单片机好像没有这个功能 xinbihui 发表于 2015-3-17 23:05
任何一个中断都是指向同一个中断向量,要在中断里面判断是哪个产生的 中断 如TMR0IF ...
这个是的,这里的程序我没用中断,这款单片机好像中断是用interrupt这个关键字进入的 chenweigang 发表于 2015-3-18 08:35
用示波器看RC1的电平状态的,不用定时器,用软件延时可以RC1可以实现方波。用这个程序,先将RC1置1,然后 ...
确认引脚端口设置为数字模式,否则没法设置高、设置低的 yklstudent 发表于 2015-3-18 08:42
确认引脚端口设置为数字模式,否则没法设置高、设置低的
嗯,试过单独置高置低可以的 本帖最后由 szxszx 于 2015-3-18 09:20 编辑
当i=20时,RC1=0,当i=1~19时,RC1=1,所以RC1=0只能维持50ms时间,继电器无法动作 szxszx 发表于 2015-3-18 09:18
当i=20时,RC1=0,当i=1~19时,RC1=1,所以RC1=0只能维持50ms时间,继电器无法动作 ...
现在不是功能有没有实现,而是RC1现在没有输出50ms的低电平 RC1上电默认为模拟输入,要对ANSEL进行初始化 szxszx 发表于 2015-3-18 10:00
RC1上电默认为模拟输入,要对ANSEL进行初始化
不用定时器的时候,能正常输出高低,端口配置没问题的
页:
[1]