不是跑飞的问题,其实是选择语句上的问题,回答者: 碱杯已经看出来了,他只是没指明掉
if(CGQ==0)
{
delay(100);
if(!CGQ); //注意这个分号,这里的意思是CGQ=0时候,空 *** 作次,继续执行后面的
{
alarm_silencer(); //该指令不管CGQ为何值,都会被执行
}
}
delay(1000);
}
另外,CGQ值对alarm_silencer();影响的逻辑关系有点乱,所以我没看alarm_silencer();,但发现了以下问题,希望对你有帮助
1中断服务不用判断,或加延迟判断,已经下降沿触发了,进入中断的时候INTF就已经是0了;
2延迟
void delay(uint x) //#define uint unsigned int定义过,最大可以到65355,原来的int知道32677
{
uint y;
for(x;x>0;x--) //注意这里是没有分号的,加分号时间上就错了
for(y=10000;y>0;y--);
}
一般PIC定时器都工作于同步模式,同步模式时单片机系统时钟和输入时钟是一致的。而定时器1异步模式一般用于休眠模式下唤醒单片机使用,这种模式在休眠模式下定时器继续运行,不需要经过同步检测,也就是说单片机系统时钟和输入时钟是不一致的,单片机系统可能不运行,但是定时器1通过异步模式可以运行来唤醒单片机。
一般情况下都是同步模式,只有休眠的时候设置成异步
你这那是后分频6啊,T2CON = 0X55,就是01010101,就是后分频为(1:11),打开定时器2,预分频为(1:4)
也就是说16M的时钟频率在输入到T2之前是16M/4=4M,1/4M=025微秒(即025微秒为一个指令周期)。而预分频是1:4,则定时器2在0254=1微秒的时间内自增一次TMR2。
则每90微秒内TMR2和PR2比较的结果相同并溢出一次。
再加上是后分频为11,则9011 = 990微秒 = 099毫秒。约等于1毫秒。
看清楚T2CON的位定义描述。
//__CONFIG(HS&WDTDIS&LVPDIS);//对熔丝位进行设置
这句改成:
//__CONFIG(INTOSCIO&WDTDIS&LVPDIS);//对熔丝位进行设置
在TRISA = 0x00这句之上插入
ANSELA=0x00;关闭PA口模拟功能
ADCON0= 0x00;关闭AD功能
ADCON1=0X03;
OSCCON=0x1C;选择4MHZ震荡
以上就是关于PIC单片机编程,程序运行总是出错,可能是程序跑飞了,求大虾指点迷津。还想加个定时器,全部的内容,包括:PIC单片机编程,程序运行总是出错,可能是程序跑飞了,求大虾指点迷津。还想加个定时器,、什么是pic单片机定时器1同步模式、pic用作PWM输出时定时器如何计算等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)