打印

8051 定时器 1s钟的程序

[复制链接]
44032|87
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
nicker88|  楼主 | 2010-9-23 21:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void time1() interrupt 3
{
    EA=0;
    t++;
    if(t==20)
    {   
        t=0;
        LED=~LED;
        TH1=(65536-50000)/256;
        TL1=(65536-50000)%256;
        ET1=1;
        TR1=1;
    }
    EA=1;   
}
我是每次计50ms,计满20个50ms就1s了
这样有错吗 ,我觉得没有,但是好像时间比1s长了点,晶振是12M

相关帖子

沙发
strang| | 2010-9-23 23:15 | 只看该作者
本帖最后由 strang 于 2010-9-23 23:18 编辑

unsigned int t;
void timer1(void) interrupt 3
{
  if(++t>=20)
  {
    LED=~LED;
    t=0;
  }
  TH1=0x3c;
  TL1=0xb0;
}
void main(void)
{
  TMOD=0x10;
  TH1=0x3c;
  TL1=0xb0;
  t=0;
  TR1=1;
  ET1=1;
  EA=1;
  while(1);
}
LZ ,你这样试试。。。。

使用特权

评论回复
板凳
nicker88|  楼主 | 2010-9-24 00:58 | 只看该作者
2# strang

使用特权

评论回复
地板
nicker88|  楼主 | 2010-9-24 00:59 | 只看该作者
也没改什么啊

使用特权

评论回复
5
singleywy| | 2010-9-24 11:17 | 只看该作者
前面代码占用时间,需要进行修正的

使用特权

评论回复
6
singleywy| | 2010-9-24 11:26 | 只看该作者
void timer0()interrupt3 {
    #pragma ASM
    PUSH ACC   
    PUSH PSW ;
    MOV A,#(60536 MOD 256) ;default worth is 5ms
    CLR TR0
    ADD A,TL0
    ADDC A,#08H
    MOV TL0,A
    MOV A,TH0
    ADDC A,#(60536 /256)
    MOV TH0,A
    SETB TR0
    POP PSW
    POP ACC
#pragma ENDASM
   if(++t>=20)
  {
    LED=~LED;
    t=0;}
}

使用特权

评论回复
7
singleywy| | 2010-9-24 11:27 | 只看该作者
本帖最后由 singleywy 于 2010-9-24 11:29 编辑

上面打错了,应该是15536,不是60536,否则是5MS,哈,还有是TL1,TH1,不是TH0,TL0,呵呵打击了

使用特权

评论回复
8
nicker88|  楼主 | 2010-9-24 12:40 | 只看该作者
TH1=(65536-50000)/256;
        TL1=(65536-50000)%256;
这个太消耗时间是吧

使用特权

评论回复
9
xwj| | 2010-9-24 12:47 | 只看该作者
好的编译器会自动优化的,但不排除某些编译器给你编译成除法或别的指令的可能:lol

使用特权

评论回复
10
nicker88|  楼主 | 2010-9-24 13:17 | 只看该作者
这句耗多少时间啊        LED=0;
这句呢    TH1=(65536-50000)/256;

使用特权

评论回复
11
流行音乐| | 2010-9-24 18:39 | 只看该作者
这就体现出减小软件误差的重要性了。

使用特权

评论回复
12
singleywy| | 2010-9-24 18:52 | 只看该作者
我在上面写的程序可以将误差控制在1us内,不妨LZ看看,

使用特权

评论回复
13
冷漠| | 2010-9-24 20:03 | 只看该作者
没那么复杂。
1、书上早就写了:改用T2自动重载,什么都不用考虑。精度必然和晶振一样!
2、如果一定要用T1程序重载,那么Intel已经计算过,每次T1中断重载开销+7!
   请参考Intel源程序。

使用特权

评论回复
14
singleywy| | 2010-9-24 20:41 | 只看该作者
13# 冷漠
大家都知道自动重载没有软件误差,不过那么短时间就中断一次你吃的消么,
T1程序,消耗的时间是固定的么,是7?笑话,根本不是那么回事,要看中断在什么时候发生的,如果遇到RET,或者MOV指令,这损耗的时间能一样么,请你把书看透了再来吧,不要口出狂言

使用特权

评论回复
15
daiy5210| | 2010-9-24 21:48 | 只看该作者
学习了,,还是用汇编写的好。

使用特权

评论回复
16
Andylue| | 2010-9-24 23:12 | 只看该作者
6# singleywy

我还没用过C里面嵌入汇编,能赐教下吗?

使用特权

评论回复
17
冷漠| | 2010-9-25 10:30 | 只看该作者

singleywy 不必大动肝火。

本帖最后由 冷漠 于 2010-9-25 15:51 编辑
T1程序,消耗的时间是固定的么,是7?笑话,根本不是那么回事,要看中断在什么时候发生的,如果遇到RET,或者MOV指令,这损耗的时间能一样么,请你把书看透了再来吧,不要口出狂言


14楼说话可能没给自己留后路:万一冷漠拿出了Intel写的51_RTOS汇编源程序,让你看了如梦初醒,那时你该怎么办?向冷漠道歉?还是自己认知自己……

提醒一句:T1中断软件重载是在定时器中断最开始前2条语句进行的!这2条语句的执行时间仅仅影响T0 / T1走时误差(需要修正的误差)。和你后面用户什么ISR开销多长时间根本无关,你爱RET还是MOV,随你自己的意愿,——这么简单的编程原则都不会用?
ORL  TL1,  #LOW(-50000)  
MOV TH1,  #HIGH (-50000)

……
// 呵呵,连+7(还是+8)都不用了,自动加上异常情况所可能耽误的时间误差。


冷漠是一个彻头彻尾的菜鸟,冷漠写的任何内容都是书上或者图书馆资料上拷贝来的;——冷漠基本上是一台复印机。一台机器,谈什么口出狂言?

如果14 楼认为自己比 Intel,比Keil 玩51还高明的话,冷漠除了建议多泡泡图书馆,也没什么办法,笑笑而已。

如今,想把自己拔高的人多了。建议多看看别人的签名。自己连个签名都没有,要别人都向自己学习是吗?冷漠先建议写下:“俺singleywy 是51首席玩家,建议大家向俺……。”

一个连阻塞、就绪概念都讲不清的人,写了一个RTOS?
要不要冷漠口出狂言“复印”几篇书上有关“阻塞,就绪,运行”的概念内容?

连这么小的“异议”都不能忍受,还大谈“欢迎拍砖”?自己上来寻找别人尊重呢吧。冷漠支持,继续把你的RTOS写下去,有什么不懂的多看看《操作系统概念》。  

       大三?奔三都过了吧,自己是什么没必要连年龄也要造假装嫩。……冷漠还要不要多说点什么背景故事?

http://scitech.people.com.cn/GB/12764061.html

使用特权

评论回复
18
冷漠| | 2010-9-25 15:42 | 只看该作者

LZ将下面2句修正一下误差即可:

本帖最后由 冷漠 于 2010-9-25 15:50 编辑

LZ将下面2句修正一下误差即可:
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;

修正为:
TL1 | = (-50000);       //   ORL   TL1, #0B0H ;误差校正
TH1=(65536-50000)/256;   //或者 TH1=(-50000)>>8;   //   MOV   TH1 , #03CH

使用特权

评论回复
19
yulri| | 2010-9-25 17:36 | 只看该作者
本帖最后由 yulri 于 2010-9-25 17:48 编辑

呵呵,一定要有签名才不算是菜鸟么?;P

使用特权

评论回复
20
冷漠| | 2010-9-25 20:15 | 只看该作者
没有签名的必是大牛。多是B型血型?LS可是B型血型?

有签名的不过是表现一种活着有目标,有激励的人。O,A 血型居多。不知冷漠说的可对?

使用特权

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

本版积分规则

0

主题

98

帖子

1

粉丝