关于51单片机的时间问题!

panyaoIT 2008-07-16 07:11:59
我编了个程序,想让10秒钟,LED的走马灯的方向改变一次,但是,实际上,我测试出来的实际是24秒,奇怪了!单片机的频率是12MHz
代码如下:

#include <reg52.h>

sbit L1=P0^0;
sbit L2=P0^1;
sbit L3=P0^2;
int y=1;
bit n=1;
void delay02s(void) //延时0.2秒子程序
{
unsigned char i,j,k;
for(i=20;i>0;i--)
for(j=20;j>0;j--)
for(k=248;k>0;k--);
}

void main(void)
{
RCAP2H=0x3c;
RCAP2L=0xb0;
TR2=1;
ET2=1;
EA=1;
while(1){
if(n){
L1=0;L2=1;L3=1;delay02s();
L1=1;L2=0;L3=1;delay02s();
L1=1;L2=1;L3=0;delay02s();
}else{
L1=1;L2=1;L3=0;delay02s();
L1=1;L2=0;L3=1;delay02s();
L1=0;L2=1;L3=1;delay02s();
}
}
}


PAN() interrupt 5 //在以TH1和TH2的时间开始循环,到溢出,执行函数一次!
{
y++;
if (y==200){
n=~n;
y=1;
}
}


为什么呢?各位大侠帮忙看看!我是用keil编写的!
...全文
93 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
lwz2008by 2009-09-28
  • 打赏
  • 举报
回复
应该在中断函数数的 y++之前加上 RCAP2H=0x3c; RCAP2L=0xb0; 两条。 重载初值就好了。
shuiyan 2008-07-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 panyaoIT 的回复:]
我加了,不过不是在中断程序中加的,听说RCAP2H=0x3c; RCAP2L=0xb0;可以在外面预设的,是吗?
[/Quote]

外面预设是第一次启动定时器。在定时器的最后代码之后,仍然要加一次,这样才能确保每次定时器的起始值一样,确保每次中断时间一样。

不过,没看到对定时器的配置呀,工作在什么模式?
steve_cys 2008-07-17
  • 打赏
  • 举报
回复
华邦的51单片机都是带流水的,应该是4个机器周期一条指令
titan1840 2008-07-17
  • 打赏
  • 举报
回复
51没有流水线,但是你那个for语句,执行几个时间周期?反汇编,对应的汇编语句是什么?
TheSaviour 2008-07-17
  • 打赏
  • 举报
回复
51的目前已经不能说是12个机器周期一条指令了,6个的、4个的、2个的、1个的好像都见过,但是,有流水线的51,的确没见过。
fouryu 2008-07-17
  • 打赏
  • 举报
回复
呵呵,延时0.2s你是怎么算的?要知道51单片机可不是一个时钟周期执行一条指令哦。而且现在的CPU都有流水线优化,你通过代码来延时是不可能精确的。

比如说51单片机是12个时钟周期一个指令周期,CPU有3级流水线,那平均下来就是4个时钟周期一条指令。

呵呵,这个要弄清楚才能用代码计时的。
panyaoIT 2008-07-17
  • 打赏
  • 举报
回复
我加了,不过不是在中断程序中加的,听说RCAP2H=0x3c; RCAP2L=0xb0;可以在外面预设的,是吗?
MADT88999 2008-07-16
  • 打赏
  • 举报
回复
你只需要在中断程序中加入 RCAP2H=0x3c; RCAP2L=0xb0; 两条。

27,377

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧