菜鸟请教叫个小程序,延时问题。

[复制链接]
3827|15
 楼主| hzocce 发表于 2010-1-3 18:23 | 显示全部楼层 |阅读模式
#include<reg52.h>
char j;
void main()
{
char i=0;
char code table[]={0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f};
P1=table;
j=0;
TMOD=0x01;                //设置定时器1为工作方式1
TH1=(65535-50000)/256;    //装初值
TL1=(65535-50000)%256;
EA=1;                //开总中断
ET1=1;               //开定时器1中断
TR1=1;               //启动定时器1
while(1)
{
  P1=table[i];
   if(j==10)
     {
   j=0;
   i++;
   if(i==8)
    i=0;
  }
}
}
void timer1() interrupt 3
{
TH1=(65535-50000)/256;    //重装初值
TL1=(65535-50000)%256;
j++;
}

程序如上,我的晶振是11.0592M,运行上面的程序,理论上是500ms 的,可实际结果为什么却不是呢? 实际上流水灯的流动时间估计只有100多毫秒,速度很快。
原野之狼 发表于 2010-1-3 18:38 | 显示全部楼层
一周期大约1US*15535*10 约等于168US 当然快了
原野之狼 发表于 2010-1-3 18:39 | 显示全部楼层
说错了 是168MS
 楼主| hzocce 发表于 2010-1-3 19:00 | 显示全部楼层
可15535不是初值吗?
给的初值,一直加满才中断一次。从15535加了50000之后再溢出。时间应该是50000us.

也就是 1*50000*10这样才对呀??????????????
原野之狼 发表于 2010-1-3 19:52 | 显示全部楼层
不好意思 是我算错了
你用的是什么单片机
周期是否为1US?
jaylondon 发表于 2010-1-3 19:53 | 显示全部楼层
这个和单片机的指令周期有关系的吧
 楼主| hzocce 发表于 2010-1-3 20:22 | 显示全部楼层
zhiyonghe 发表于 2010-1-4 10:30 | 显示全部楼层
TH1=(65535-50000)/256;    //装初值
TL1=(65535-50000)%256;

很多人喜欢这样子做,有那必要吗??现在哪里没有计算器??还非得要程序给你算??浪费程序的执行速度!!
老老实实 发表于 2010-1-4 11:59 | 显示全部楼层
你的工作方式设置错了吧!
应该是:TMOD=0X10;

改这个之后,你再试试
老老实实 发表于 2010-1-4 12:00 | 显示全部楼层
程序整体看似没什么问题!
lxyppc 发表于 2010-1-4 12:15 | 显示全部楼层
TH1=(65535-50000)/256;    //装初值
TL1=(65535-50000)%256;

很多人喜欢这样子做,有那必要吗??现在哪里没有计算器??还非得要程序给你算??浪费程序的执行速度!! ...
zhiyonghe 发表于 2010-1-4 10:30


编译器有个功能叫常量合并的,不管你的表达式有多复杂,只要是常量都是在编译时就算好了的。不会浪费“程序的执行速度”
gz04022167 发表于 2010-1-4 12:52 | 显示全部楼层
TMOD=0x01;                //设置定时器1为工作方式1
这里设置的是定时器0为方式1;所以如12楼所说,模式设置错误。
wgj_fly 发表于 2010-1-4 12:56 | 显示全部楼层
时钟,运行时钟,指令时钟,再重新看一下,也许对你有帮助
5880527 发表于 2010-1-4 12:58 | 显示全部楼层
13位?
stockering 发表于 2010-1-4 14:09 | 显示全部楼层
LZ的程序有点问题吧!用定时器1应该写成TMOD=0x10。
marshallemon 发表于 2010-1-13 12:47 | 显示全部楼层
恩,程序写的问题,SFR没搞清楚
您需要登录后才可以回帖 登录 | 注册

本版积分规则

133

主题

617

帖子

4

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