小弟请教16F57定时器问题。

[复制链接]
5212|20
 楼主| hzocce 发表于 2010-3-26 13:16 | 显示全部楼层 |阅读模式
本帖最后由 hzocce 于 2010-3-29 14:03 编辑

#include<pic16f5x.h>

void main()
{
        TRISB=0;
        PORTB=0;     
        TMR0 =1;
        OPTION = 0b00000111;  
        while(1)
        {        
                 if (TMR0 > 250)
             {
                 TMR0 =1;
                 RB7=!RB7;
             }
        }
}



用的是12M的晶振。RB端攻接了8个LED。如上程序,应该是RB7端口翻转,相对应的LED 闪烁才对!可认为什么就没有反应呢 ?一直灭的????




但是发现初始化的时候,我把PORTB=0; 给成 PORTB=0xff; ,   那8个LED 却都奇怪的闪了起来,而且是当然闪的速度相当的快。



为什么呢? 我是哪里弄错了呢????????

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| hzocce 发表于 2010-3-27 17:02 | 显示全部楼层
没人理?
h304061981 发表于 2010-3-27 18:27 | 显示全部楼层
zhaoyu2005 发表于 2010-3-29 10:25 | 显示全部楼层
没有中断就查询呗,查询定时器的计数器的值,可以设定一个初值,计数到0将IO翻转并赋初值
xymxym 发表于 2010-3-29 10:30 | 显示全部楼层
这样子是没有人帮你写的。

你的意思是指如果这个单片机有中断,那你就知道怎么弄了吗?我建议,你就把它当成是有中断的,先把程序写出来,贴到这来,那时候得到的帮助会更多,也会更直接。
 楼主| hzocce 发表于 2010-3-29 11:05 | 显示全部楼层
没有中断,溢出了也没法查询
 楼主| hzocce 发表于 2010-3-29 11:08 | 显示全部楼层
#include<htc.h>

void main()
{
TRISA=0;
PORTA=0;
OPTION=0x07;
TMR0=1;
while(1)
        {       
         if(TMR0==255)
                {
                        TMR0=1;
                        RA0=!RA0;
                       
                }
       
       
        }
}
 楼主| hzocce 发表于 2010-3-29 11:10 | 显示全部楼层
是上面那样写吗?
根据楼上的给我的思路,就是那么写的,可是结果没有出来啊 ?

还是哪里的问题呢?请指导一下。
 楼主| hzocce 发表于 2010-3-29 11:14 | 显示全部楼层
附上图

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
qnmdsb2008 发表于 2010-3-29 11:22 | 显示全部楼层
查询就可以
xymxym 发表于 2010-3-29 11:53 | 显示全部楼层
没错了,就是这样,不过要把if(TMR0==255)改成if(TMR0>250)会更好,因为如果程序复杂点的话,跳到判断那一句的时候,TMR0可能已经从255变成0了,而造成漏检.

/*---------------------------------
模拟定时器,在主程序中循环扫描
每50ms处理事件一次
---------------------------------*/
void SimulateTimer(void)
{
     if (TMR0 > 250)
     {                             //为防止TMR0归0时漏检,在它归0之前的(256-250)*256=1.536ms内检测都有效
          TMR0 = 65;
               .....                //需要定时执行的程序
              .....
     }
}

/*------------------------------------
//主程序
------------------------------------*/
main()
{
     init();                       //器件初始化
     TMR0 = 65;                    //预设值,使TMR0在50ms左右归零一次
     OPTION = 0b00000111;          //分频器切换给定时器使用,分频比256   
     while(1)
     {
          SimulateTimer();         //模拟定时器中断,在主程序中不断扫描
          ....                          //可以是其它的程序,或者全部放在SimulateTimer中按时间执行
     }
 楼主| hzocce 发表于 2010-3-29 13:59 | 显示全部楼层
本帖最后由 hzocce 于 2010-3-29 17:49 编辑

#include<pic16f5x.h>

void main()
{
        TRISB=0;
        PORTB=0;     
        TMR0 =1;
        OPTION = 0b00000111;  
        while(1)
        {   
               
           if (TMR0 > 250)
             {
                 TMR0=1;
                  RB0=!RB0;
              }

        }
}



按照楼上的大哥给我的指导,我写了如上程序。用的是12M的晶振。RB端攻接了8个LED。如上程序,应该是RB7端口翻转,相对应的LED 闪烁才对!可认为什么就没有反应呢 ?一直灭的????

但是发现初始化的时候,我把PORTB=0; 给成 PORTB=0xff; ,   那8个LED 却都奇怪的闪了起来,而且是当然闪的速度相当的快。

为什么呢? 我是哪里弄错了呢????????
xymxym 发表于 2010-3-29 14:49 | 显示全部楼层
LED灯的限流电阻是多大?共阴还是共阳接**

另外,你清不清楚你用12M晶振时,TMR0初值为1,256分频,那么,多长时间RB7会被取反一次呢?
 楼主| hzocce 发表于 2010-3-29 15:56 | 显示全部楼层
本帖最后由 hzocce 于 2010-3-29 17:48 编辑

10K的电阻亮度搞好能接受!阻值小了,那灯太亮了,太刺眼;
共阴;
5V.


12M/4=3M。
时钟周期就是1/3 us.

(251-1)*256*(1/3)=250*256*(1/3)=6400*(1/3)=   大概是 21333us .  大概是22ms是这样吗?

程序再次更改后如上面 12楼 所示。
电阻也有10K换到了1K,但实验结果还是跟原来我所描述的一个样子。

说明了以下问题:

1.跟电阻无关;
2.跟延时时间也无关,假如是时间太快了,但至少给我们人眼的幻觉就是常亮,可出现的现象是灭!根本就没有亮!




到底是说明问题呢 ????????????????????????????????????????????
xymxym 发表于 2010-3-29 16:58 | 显示全部楼层
应该是(256-1)*256*0.33us=22ms.
:L是5V吗?10K的LED限流电阻?LED的驱动电流应该在5~10mA比较合适.

别折腾了,赶紧减小限流电阻,延长LED的显示时间.
 楼主| hzocce 发表于 2010-3-30 08:02 | 显示全部楼层
没人看???
xymxym 发表于 2010-3-30 09:49 | 显示全部楼层
出现这种情况,你自己的想法呢?

你确定你的程序在芯片肚里跑起来了吗?怎么确定的?
 楼主| hzocce 发表于 2010-3-30 14:23 | 显示全部楼层
呵呵,我现在找到问题了。我在CONFIGURE BIT 没有吧 WDT 关掉。


谢谢 xymxym 一直以来对我的指导!!!
电子三极管 发表于 2010-6-23 10:13 | 显示全部楼层
:shutup:
Mary_luo 发表于 2010-6-23 13:05 | 显示全部楼层
热心人还是蛮多的,创造美好环境,共同进步。:)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

133

主题

617

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部