打印

请教51单片机定时器精度问题

[复制链接]
1468|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jd吕凯|  楼主 | 2010-11-16 17:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
小弟在学习定时器写了一个10秒定时器的练习,程序是这样的:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
void delay_ms(t);
uint n=0;
uchar time=20;
int seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void main()
{TMOD=0x10;
TH0=0xcc;
TL0=0x00;
ET0=1;
EA=1;
TR0=1;
P0=seg[n];
while(1);
}
void delay_ms(t)
{int i,j;
for(i=t;i>0;i--)
for(j=115;j>0;j--){;}}
void Timer_INT() interrupt 1
{TH0=0xcc;
TL0=0x00;
ET0=0;
time--;
if(time==0)
{n++;
while(n==10)
{P1=~P1;
delay_ms(200);}
P0=seg[n];}
ET0=1;}

其中那个定时器赋初值50ms是按这样算的:50000us=(65536-N)*(12*1/11.0592),我是看教程上这么写的,得到的N换成16进制分别给定时器的高八位和低八位。指令周期是12个振荡周期,那他这样算的话是不是就说明定时器的每增加一位就相当于一个指令周期吗?我的程序出来的结果1s比实际的快很多。
同时我还看到另一种赋值的情况:void main()
{
  P0 = 0x3f;
P2 = 0x3f;
i = 0;
Second_Counts = 0;
Key_State = 1;
TMOD = 0x01;
TH0  = (65535-50000)/256;
TL0  = (65535-50000)%256;
EA=1;ET0=1;TR0=1;
}
void DSY_Refresh() interrupt 1
{
  TH0  = (65535-50000)/256;
TL0  = (65535-50000)%256;
if(++i==2)
{
   i = 0;
  ++Second_Counts;
  P0 = DSY_CODE[Second_Counts/10];
  P2 = DSY_CODE[Second_Counts%10];
  if(Second_Counts == 100) Second_Counts = 0;
}
}
这个是我截取的一部分,这个1s却很准,这下我彻底糊涂了。
诚恳请教前辈老师们指点批评!

相关帖子

沙发
ejack| | 2010-11-16 19:08 | 只看该作者
前面例子的定时器初值不对。
公式你都会列了,却不会算?

使用特权

评论回复
板凳
chunyang| | 2010-11-16 19:42 | 只看该作者
定时器由时钟源驱动,跟指令周期无关,建议楼主仔细阅读理解51教材中关于定时器原理的部份。

使用特权

评论回复
地板
jd吕凯|  楼主 | 2010-11-16 23:20 | 只看该作者
是我算错了!哎,这样的低级错误太丢人了……

使用特权

评论回复
5
skyliang| | 2010-11-16 23:29 | 只看该作者

使用特权

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

本版积分规则

0

主题

169

帖子

1

粉丝