首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

AT89C2051内的定时器怎么啦?[原创]

AT89C2051内的定时器怎么啦?[原创]

这两天,用汇编设计一个输出PWM波的程序,刚开始的想法是:采用定时器定时,输出口通过指令延时调节脉宽的方式产生。但想不到的事发生了,这个单片机定时器竟然不产生中断!


为了进一步验证其定时器的工作,我采用查询的方式查看TF0,TF1的状态,TF0,TF1竟然也一点反应也没有!


于是,我只好采用软件的方式,通过输出口置位延时,输出很不错的PWM波。


我有点奇怪了,AT89C2051内部,是不是没有计数器啊?

很好,很想加入,但好象有所限制
ORG 0000H
SJMP START
ORG 000BH
AJMP JJ0
ORG 001BH
AJMP PZ
ORG 0030H
START: MOV SP,#30h
MOV TMOD,#01H
MOV TH1,#1CH
MOV TL1,#18H
MOV TH0,#1CH
MOV TL0,#18h
SETB EA
SETB ET0
SETB ET1
MOV 79H,#20H
MVO 78H,#30H
MOV 77H,#20H
MOV 76H,#30H
SETB TR0
SETB P1.2 ;从P1.2输出一路PWM波
MOV R7,#10
DJNZ R7,$
SETB TR1
SETB P1.3 ;从P1.2输出二路PWM波
LOOP: JNB P3.0,ADD0
JNB P3.1,SUB0
MOV C,P1.2
ORL C,P1.3 ;判断输出端的状态,两者都零等等定时中断
JNC $
MOV A,R0
JZ LOOP0 ;判断R0的值,为0就跳转执行LOOP0
DEC R0
SJMP LOOP2
LOOP0: CLR P1.2
NOP ;补偿
NOP
LOOP2: MOV A,R1
JZ LOOP3
DEC R1
SJMP LOOP1
LOOP3: CLR P1.3
NOP
NOP
LOOP1: SJMP LOOP
ADD0: ACALL DELAY ;清除键抖
JB P3.0,LEAP1
CJNE 79H,#50,LEAP0
MOV 79H,#50
LEAP0: INC 79H
LEAP1: SJMP LOOP
SUB0: ACALL DELAY
JB P3.1,LEAP3
CJNE 79H,#0,LEAP2
MOV 79H,#0
LEAP2: DEC 79H
LEAP3: SJMP LOOP
DELAY: MOV R6,#200
LP0: MOV R5,#200
DJNZ R5,$
DJNZ R6,LP0
RET
JJ0: MOV TH0,#1CH
MVO TL0,#18H
JNB P1.5,BS0 ;反转
MOV 79H,R0
SJMP BS1
BS0: MVO R0,78H
BS1: SETB C ;等待结束
SETB TR0
SETB P1.2
RETI
PZ: MOV TH1,#1CH
MOV TL1,#18H
JNB P1.6,BS2
MVO R1,77H
SJMP BS3
BS2: MOV R1,76H
BS3: SETB C
SETB TR1
SETB P1.3
RET
END
很好,很想加入,但好象有所限制
是有问题的程序 还是没有问题的程序???
就是使用的这个程序,但定时器启动不了.
很好,很想加入,但好象有所限制
程序走到JNC $,处,等待定时中断,但就是中断不了.后来我又采用查询的方式,访问TF0,TF1.发现这两个位没有变化,但此推断,定时器没有启动,百思不得其解.
后来没有办法,只好用了如下程序:
......
LOOP:SETB P1.2
SETB P1.3
ACALL DELAY1
CLR P1.2
CLR P1.3
ACALL DELAY2
SJMP LOOP
.......
通过改变延时子程序内的循环值,还达到改变PWM的宽度,居然效果不错.
但是,我不知为什么它的定时器为什么不工作?




































很好,很想加入,但好象有所限制
2051的定时器肯定是没有问题的,我用过(c写的)。你不能产生中断肯定是你的程序在定时器初始化或中断初始化处有问题,仔细查查。
大家好
定时器初始化,我选的是01方式,初值我赋的是1C18H,置位EA,ET0,ET1,启动(置位(TR0,TR1),中断产生后,在中断程序里,重新赋值,重新开定时器,程序在就在二楼,请高手们指点一二.
很好,很想加入,但好象有所限制
你的程序好像没有问题哦,

你单独用定时器点亮个灯试试看你的定时器工作没有。
大家好
点不亮,我试过,也用查询的方式,访问过TF1及TF0,这两个位都没有变化.不知是不是我使用的单片机有问题?
很好,很想加入,但好象有所限制
我大致浏览了一下你的程序,已经发现了一些问题。虽然可能不是问题的症结,但是我们以后做任何事都要注意“认真”二字,这样才能少走弯路。
1: 有几处的MOV笔误为MVO
2: 定时器1中断服务程序的末尾返回指令应该为RETI而不应该写RET
3: 对TMOD赋值时01H,表示定时器0方式1(16位),定时器1方式0(13位),而初值却都是1C18H,显然也是错误,起码是笔误。因为8051很少有人用它的13位定时器,8051保留13位定时器仅仅是为了兼容早期的8048。
当否请见谅。
没有最高,只有更高
返回列表