80

帖子

0

TA的资源

一粒金砂(初级)

21
 

lgy198612
首先要计数准确的话不要用12M,要用11.0592M。用12M还不如用C写得了

------------------------------------------------------------

1  11.0592是用于波特率的特殊晶振,12M用于定时才是对的。
2  只要对编译器熟悉,C也可以写出很准确的定时程序的,而且可读性要强得多。


回复

75

帖子

0

TA的资源

一粒金砂(初级)

22
 
ORG 0000H
LJMP MAIN
ORG 000BH            ;外部中断0入口
SJMP IF0BREAK
  ORG 0030H            ;程序的开始地址
MAIN:
SETB EA              ;设置让外部中断0起作用,硬件初始化
SETB ET0            ;计数器0溢出中断设置
SETB PT0            ;设置为最高优先级

MOV TMOD,#01H        ;设置计数器0工作为方式1,16位计数器
MOV TL0,#0B0H        ;设置计数器0初值,12MHz频率,计数器50ms执行一次就溢出中断
MOV TH0,#3CH

MOV R0,#200        ;循环20次为1S,200次为10秒

SETB TR0
FINISH:  SJMP $

;子程序:IF0BREAK
;功能:计数器0溢出中断入口
IF0BREAK:
CLR ET0                    ;关闭中断响应
CLR TR0                    ;停止计数器
MOV TL0,#3CH
MOV TH0,#0B0H
DJNZ R0,EXIT              ;满10s就把P1.0位置反,方便查看结果
JB P1.0,SP1                ;如P1.0=1->SP1
SETB P1.0
LJMP STARV                ;跳转到赋初值的地方
SP1:
        CLR P1.0
STARV:                              ;200次完毕后重赋初值
MOV R0,#200
MOV TL0,#3CH
MOV TH0,#0B0H
EXIT:
        SETB TR0              ;启动定时器
        SETB ET0              ;启动中断
RETI

END

编译完后直接用proteus仿真运行,在我的机子上可以正常运行,P1.0每10秒翻转一次
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

23
 
由于时间10s很长,定时器需中断多次,时间精确性要求并不高,可以考虑使用软件延时,代码如下:

  1. sbit  P10 = 0x90;
  2. unsigned char i,j,k;
  3. for(i=100;i>0;i--)
  4. for(j=200;j>0;j--)
  5. for(k=247,k++;k>0;k--);  //进行简单补偿,使时间精度更高些
  6. P10 =!P10;
复制代码

延迟时间为10.000308秒,精度在大部分场合均可满足要求。
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

24
 
引用 20 楼 tcdzyq 的回复:
lgy198612
首先要计数准确的话不要用12M,要用11.0592M。用12M还不如用C写得了

------------------------------------------------------------

1? 11.0592是用于波特率的特殊晶振,12M用于定时才是对的。
2? 只要对编译器熟悉,C也可以写出很准确的定时程序的,而且可读性要强得多。



11.0592对通讯的波特率来说是定时很准确的,分频系数都是整数,但对于精确定时,12MHz更好用,在89c51上12MHz定时的最小分辨率为1us, 而11.0592MHz定时的最小分辨率为1.0850694444us
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

25
 
学习
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

26
 
KEIL仿真时间是不准的,若要在里面实时仿真需下插件,建议用proteus,最好用硬件。
程序基本无错,可定时十秒稍多一点,因你在每次进中断时均关闭定时器,而中断结束才开启,中程序实行是需要时间的,不过此时间极短,定时十秒无伤大雅,若要精确定时最好在定时器赋予初值时立即开启,而TL0的初值也需要做稍微调整。
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

27
 
楼上很对,要精确,则需考虑中断语句执行所占用的时间,计算每条指令占用的机器周期,重新计算初值。

没仔细看你的程序,可以烧录后看看实际情况
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

28
 
引用 27 楼 ceny123 的回复:
楼上很对,要精确,则需考虑中断语句执行所占用的时间,计算每条指令占用的机器周期,重新计算初值。

没仔细看你的程序,可以烧录后看看实际情况

楼上正解
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

29
 
C语言:
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;   //晶振12MHz  定时50ms
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

30
 
1.应该直接学C语言,汇编太费劲
2.中断要短,养成好习惯
3.定义变量,而不要用寄存器地址
mian:
..........
cc:
   jb t0_f,dd
   jmp cc
dd:
   clr t0_f
   djnz timer1,cc
   mov timer1,#200
   cpl p1.0
   jmp cc

   
   

IF0BREAK:
   setb t0_f  设置标志
   MOV TL0,#3CH              
   MOV TH0,#0B0H
reti
 
 
 

回复

101

帖子

0

TA的资源

一粒金砂(初级)

31
 
用定时器来定10S钟,为什么还要写入初值进去呢,直接等着他进中断就行了啊,你可以根据晶振的频率计算出每次定时器溢出的时间,然后溢出多少次就到十秒了嘛,哪有这么复杂!
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

32
 
顶10楼。
想定时准,得用11.0592MHz晶体而不是12MHZ。
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

33
 
考虑中断语句执行时间。在KEILL上仿真,观察语句执行时间。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表