打印

定时问题!

[复制链接]
2707|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sankyo_feng|  楼主 | 2010-6-5 10:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STC90C52      晶振22118400HZ
精确定时1秒钟闪烁LED
/////////////////第一段///////////////////////////
#define uchar unsigned char //定义一下方便使用
#define uint  unsigned int
#define ulong unsigned long
#include <reg52.h>     //包括一个52标准内核的头文件
sbit P10 = P1^0; //要控制的LED灯

//精确定时1秒钟闪烁LED
void main(void) // 主程序
{
RCAP2H =0x10; //赋T2的预置值0x1000,溢出30次就是1秒钟
RCAP2L =0x00;
TR2=1;   //启动定时器
ET2=1;    //打开定时器2中断
EA=1;     //打开总中断
while(1)  //程序循环
{  ;//主程序在这里就不断自循环,实际应用中,这里是做主要工作
}
}
//定时器2中断
timer2() interrupt 5  
{
static uchar t;
TF2=0;
t++;
if(t==30) //T2的预置值0x1000,溢出30次就是1秒钟,晶振22118400HZ
{
  t=0;
  P10=~P10; //反转LED灯的亮灭
}
}


////////////////////////////////////第两段


#define uchar unsigned char //定义一下方便使用
#define uint  unsigned int
#define ulong unsigned long
#include <reg52.h>     //包括一个52标准内核的头文件
sbit P10 = P1^0; //要控制的LED灯
bit m00=0;
int t;
//精确定时1秒钟闪烁LED
void main(void) // 主程序
{
RCAP2H =0x10; //赋T2的预置值0x1000,溢出30次就是1秒钟
RCAP2L =0x00;
TR2=1;   //启动定时器
ET2=1;    //打开定时器2中断
EA=1;     //打开总中断
while(1)  //程序循环
{  ;//主程序在这里就不断自循环,实际应用中,这里是做主要工作
   
               if(m00==1) //反转LED灯的亮灭
           t++;
               if(t==30) //T2的预置值0x1000,溢出30次就是1秒钟,晶振22118400HZ
               {
                t=0;
                P10=~P10;  
               }
        }
}
//定时器2中断
timer2() interrupt 5  
{

TF2=0;

m00=~m00;
}
}

为什么程序用第一段就可以,用第二段显示就不正常?谢谢!

相关帖子

沙发
tjx727| | 2010-6-5 17:19 | 只看该作者
按照楼主的程序,应该是1/ 30秒进一次定时器中断,但是在第二段程序中定义了一个m00的变量来控制计数标志t,第一次进定时器中断m00=1,但是第二次进定时器中断的话m00=0,需要第三次进中断才能m00=1,这样是不是需要进大概60次中断才能使t=30, 所以时间就为60*1/30秒。不知道显示不正常是不是这个原因,你可以将你要实现的功能弄出一个流程图来,然后按照流程图一步一步调试,不要想着一次性就能将程序写对。

使用特权

评论回复
板凳
NE5532| | 2010-6-5 19:58 | 只看该作者
每次看到精确定时,我就笑了,楼主,晶体频率准确么?多少PPM?

使用特权

评论回复
地板
tjx727| | 2010-6-6 13:50 | 只看该作者
估计是看着LED灯亮十下,看着秒钟动十下,就是精确定时了,呵呵……

使用特权

评论回复
5
sankyo_feng|  楼主 | 2010-6-6 18:47 | 只看该作者
#define uchar unsigned char //定义一下方便使用
#define uint  unsigned int
#define ulong unsigned long
#include <reg52.h>     //包括一个52标准内核的头文件
sbit P10 = P1^0; //要控制的LED灯
bit m00=0;
int t;
//精确定时1秒钟闪烁LED
void main(void) // 主程序
{
RCAP2H =0x10; //赋T2的预置值0x1000,溢出30次就是1秒钟
RCAP2L =0x00;
TR2=1;   //启动定时器
ET2=1;    //打开定时器2中断
EA=1;     //打开总中断
while(1)  //程序循环
{  ;//主程序在这里就不断自循环,实际应用中,这里是做主要工作
   
               if(m00==1) //反转LED灯的亮灭
           t++;
               if(t==30) //T2的预置值0x1000,溢出30次就是1秒钟,晶振22118400HZ
               {
                t=0;
                P10=~P10;  
               }
        }
}
//定时器2中断
timer2() interrupt 5  
{

TF2=0;

m00=~m00;
}
}

这个程序不正常,m00那不对,定时这样用不行,我不知道为什么?LED灯乱晃

使用特权

评论回复
6
NE5532| | 2010-6-6 18:51 | 只看该作者
溢出30次应该在中断里判断,主程序的服务时间是不确定的,这样做不可能“精确”。

使用特权

评论回复
7
NE5532| | 2010-6-6 18:52 | 只看该作者
其实你应该用32768的晶体来做,直接分到1秒的定时器溢出周期就“精确”了。

使用特权

评论回复
8
sankyo_feng|  楼主 | 2010-6-6 19:01 | 只看该作者
第二段程序,确实不行,我要测试十个输入点导通的时间,所以才想在主程序中让它一直跑个1秒的时间,输入点导通就直接记多少秒就行,可是程序这样做不行哦,怎么才可以实现?谢谢!

使用特权

评论回复
9
NE5532| | 2010-6-6 19:48 | 只看该作者

使用特权

评论回复
10
sankyo_feng|  楼主 | 2010-6-6 19:55 | 只看该作者
我用的精度不是太高

使用特权

评论回复
11
sankyo_feng|  楼主 | 2010-6-6 19:56 | 只看该作者
测试十个输入点导通的时间,怎么才可以实现?谢谢!

使用特权

评论回复
12
NE5532| | 2010-6-6 19:58 | 只看该作者
把你的应用条件给清楚,要测量什么时间,要求多高精度。

使用特权

评论回复
13
sankyo_feng|  楼主 | 2010-6-6 20:03 | 只看该作者
一种感应灯,测试灯亮的时间,一次测十个,十个灯亮不一定同时亮,亮时间30~50秒之间。

使用特权

评论回复
14
sankyo_feng|  楼主 | 2010-6-6 20:06 | 只看该作者
定时的精度不用很高,我写程序的时候发现,用定时无法实现一次测多个输入。就像1楼写的第二段程序无法实现。请给予帮助,非常感谢!

使用特权

评论回复
15
NE5532| | 2010-6-6 20:11 | 只看该作者
如果你没有其他高速应用,就把晶体频率降下来,做到定时器能做1秒中断的程度,在秒中断里直接读10个灯的状态并且记录判断就可以了。

使用特权

评论回复
16
NE5532| | 2010-6-6 20:14 | 只看该作者
你的程序错在主循环的执行速度远高于中断,就是说当m00=1的时候,t++已经不知道被执行了几千次,灯当然乱闪,在定时器中断里面处理多次中断计数,才是对的。不过建议你从根本上解决问题。

使用特权

评论回复
17
sankyo_feng|  楼主 | 2010-6-6 20:18 | 只看该作者
谢谢!因为用的输入点比较多,还要做一些其它的处理再有就是有一个LCD,所以我用了两个单片机做通信。

使用特权

评论回复
18
sankyo_feng|  楼主 | 2010-6-6 20:22 | 只看该作者
以前对单片机的定时没有做深入的了解,以为可以用一个定时,做成一个1秒的基准,然后十个输入有导通的就累加秒的个数就好了。没有想到。呵呵

使用特权

评论回复
19
NE5532| | 2010-6-6 20:25 | 只看该作者
注意多想想中断和主程序之间的执行关系就好了。呵呵。

使用特权

评论回复
20
sankyo_feng|  楼主 | 2010-6-6 20:43 | 只看该作者
本帖最后由 sankyo_feng 于 2010-6-6 20:44 编辑

非常感谢NE5532给予的帮助!谢谢!也谢谢各位的帮助,谢谢!

使用特权

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

本版积分规则

21

主题

203

帖子

1

粉丝