打印

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

[复制链接]
3686|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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 的时候。。。
楼主好好想想

使用特权

评论回复
5
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();
        }
}
补充下,为什么不好用呢。。。。。

使用特权

评论回复
6
wbwr345|  楼主 | 2011-11-10 12:16 | 只看该作者
3# ayb_ice
请帮忙看下刚写的计数程序

使用特权

评论回复
7
wbwr345|  楼主 | 2011-11-10 12:16 | 只看该作者
4# Lynnplay
请帮忙看下刚写的计数程序

使用特权

评论回复
8
刘前辈| | 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();
        }
}




、、

使用特权

评论回复
9
yegucheng123| | 2011-11-10 13:51 | 只看该作者
对中断进行计数即可

使用特权

评论回复
10
pineapple2009| | 2011-11-10 15:28 | 只看该作者
LZ程序没有while(1)啊

使用特权

评论回复
11
nie11kun| | 2011-11-10 16:04 | 只看该作者
每次进中断将一个变量+1,加够20次让灯亮就行了

使用特权

评论回复
12
wbwr345|  楼主 | 2011-11-10 16:59 | 只看该作者
意思明白了,但是怎么写的不懂。。。谁能给出点宝贵时间,发个最短的C程序?

使用特权

评论回复
13
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 程序好用,只是第二行注释没写,我仔细研究 ...
14
zhang@long| | 2011-11-10 20:51 | 只看该作者
学习中!

使用特权

评论回复
15
joysunny666| | 2011-11-10 21:02 | 只看该作者
好贴!

使用特权

评论回复
16
2009gxs| | 2011-11-10 21:41 | 只看该作者
这个单片机的书应该都有些 不是太难 楼主加油 哪里有不明白的可以提出来再问

使用特权

评论回复
17
lwslws201| | 2011-11-11 11:01 | 只看该作者
:victory:

使用特权

评论回复
18
寅辰思瑜| | 2011-11-27 10:12 | 只看该作者
:victory:............

使用特权

评论回复
19
流行音乐| | 2011-11-27 15:06 | 只看该作者
我记得我初学单片机时,这些简单的问题都不是问题,只要稍微思考一下就能找到解决办法。

使用特权

评论回复
20
rgb258| | 2011-11-29 12:33 | 只看该作者
对中断计数20次不就到1S了吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

32

帖子

1

粉丝