初学者问个问题关于51定时器

[复制链接]
 楼主| wbwr345 发表于 2011-11-10 10:53 | 显示全部楼层 |阅读模式
我刚开始学单片机1周多,在定时器中断的地方遇到了坎,现在用的是STC89C51RC,外部中断实验还算顺利,但我想用发光LED来显示定时中断,可是后来发现中断就65536个数,10.0592的晶体12个时钟周期为一个机器周期,那整个定时器也就只能技术65ms多点,连0.5秒都不到。
我现在不懂的是定时器中断函数应该怎么设置才能让我的LED发光二极管1s闪烁一次?
#include<reg51.h>
void main(void)
{
EA=1;
TMOD=0x01;
TH0=(65536-50000)%256;
TL0=(65536-50000)/256;
TR0=1;
接下来怎么让这个程序做到二极管1s闪烁,求助,十分感谢!!
如果能多两句讲解,不胜感激。
小弟已经卡了两三天了。
}
void INT0(void) interrupt 1
{
TH0=(65536-50000)%256;//高8位初始值
TL0=(65536-50000)/256;//低8位初始值
}
 楼主| wbwr345 发表于 2011-11-10 11:16 | 显示全部楼层
或者帮忙给个程序思路也好。。。。。
ayb_ice 发表于 2011-11-10 11:18 | 显示全部楼层
对中断再计数
Lynnplay 发表于 2011-11-10 11:22 | 显示全部楼层
比如:
中断时间为50ms
设置一个变量:uchar Time1sCount; (1秒计数器)
每进一次中断则:Time1sCount++;
当Time1sCount = 20 的时候。。。
楼主好好想想
 楼主| wbwr345 发表于 2011-11-10 12:13 | 显示全部楼层
#include<reg51.h>
unsigned char i=0;

void time0(void) interrupt 1
{
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        i++;
}
void delay()
{
        unsigned a,b,c;
        for(c=0;c<3;c++)
        for(a=0;a<222;a++)
        for(b=0;b<222;b++);
}
void main()
{

        EA=1;
        TMOD=0x01;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        TR0=1;
        if(i==20)
        {
                i=0;
                P0=0xfe;
                delay();               
        }
        else
        {
                P0=0xfb;
                delay();
        }
}
补充下,为什么不好用呢。。。。。
 楼主| wbwr345 发表于 2011-11-10 12:16 | 显示全部楼层
3# ayb_ice
请帮忙看下刚写的计数程序
 楼主| wbwr345 发表于 2011-11-10 12:16 | 显示全部楼层
4# Lynnplay
请帮忙看下刚写的计数程序
刘前辈 发表于 2011-11-10 12:37 | 显示全部楼层
本帖最后由 刘前辈 于 2011-11-10 12:40 编辑

现成的程序,看看“西安农民工”写的程序。

void t0(void) interrupt 1 using 0
{
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        TF0 = 0;
        TimerCount ++ ;
        if(TimerCount >= 10)         /* 1s任务调度一次 */
        {
             LED = ~LED;
             TimerCount = 0;
             TaskSwitch();
        }
}




、、
yegucheng123 发表于 2011-11-10 13:51 | 显示全部楼层
对中断进行计数即可
pineapple2009 发表于 2011-11-10 15:28 | 显示全部楼层
LZ程序没有while(1)啊
nie11kun 发表于 2011-11-10 16:04 | 显示全部楼层
每次进中断将一个变量+1,加够20次让灯亮就行了
 楼主| wbwr345 发表于 2011-11-10 16:59 | 显示全部楼层
意思明白了,但是怎么写的不懂。。。谁能给出点宝贵时间,发个最短的C程序?
chejun86 发表于 2011-11-10 17:35 | 显示全部楼层
#include<reg52.h>                                                   
sbit LED=P1^2;    //定义LED端口            
unsigned    char    cnt;用于计数1S
                                                   
/*------------------------------------------------
                    定时器初始化子程序            
------------------------------------------------*/
void Init_Timer0(void)                             
{                                                  
TMOD |= 0x01;          //使用模式1,16位定时器,使用"|"?
TH0=0x00;              //50000的初值你自己算
TL0=0x00;                                         
EA=1;            //总中断打开                     
ET0=1;           //定时器中断打开                 
TR0=1;           //定时器开关打开                 
}                                                  
/*------------------------------------------------
                    主程序                        
------------------------------------------------*/
main()                                             
{                                         
cnt = 0;         
Init_Timer0();                                    
while(1);    //这里是等待中断不做动作                                         
}                                                  
                                                   
/*------------------------------------------------
                 定时器中断子程序                  
------------------------------------------------*/
void Timer0_isr(void) interrupt 1 using 1         
{                                                  
TH0=0x00;                  //重新赋值                        
TL0=0x00;                                         
cnt++;
if(cnt>=20)            
  {
            LED=~LED;        //LED闪烁   
           cnt = 0;
  }         
}

评分

参与人数 1威望 +1 收起 理由
wbwr345 + 1 程序好用,只是第二行注释没写,我仔细研究 ...

查看全部评分

zhang@long 发表于 2011-11-10 20:51 | 显示全部楼层
学习中!
joysunny666 发表于 2011-11-10 21:02 | 显示全部楼层
好贴!
2009gxs 发表于 2011-11-10 21:41 | 显示全部楼层
这个单片机的书应该都有些 不是太难 楼主加油 哪里有不明白的可以提出来再问
lwslws201 发表于 2011-11-11 11:01 | 显示全部楼层
:victory:
寅辰思瑜 发表于 2011-11-27 10:12 | 显示全部楼层
:victory:............
流行音乐 发表于 2011-11-27 15:06 | 显示全部楼层
我记得我初学单片机时,这些简单的问题都不是问题,只要稍微思考一下就能找到解决办法。
rgb258 发表于 2011-11-29 12:33 | 显示全部楼层
对中断计数20次不就到1S了吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

32

帖子

1

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