求助,一个简单的蜂鸣器程序,有地方不懂。。。

飝鱼 2012-01-14 08:31:45
Q1:TH1=(65536-50000)/256;
TL1=(65536-50000)%256;表示的是一秒吧?

Q2:TH1=(65536-50000)/256;
TL1=(65536-50000)%256;的意思是不是产生第一个中断(定时器1)来触发之后的定时器0中断循环?

Q3:对于定时器1,我设置了初值后并没有打开定时器TR1开关,他怎么自己启动了?

#include"reg51.h"

sbit beep=P1^5;
int num=0;

void main(){
TMOD=0x01;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
while(1);}

void beeper() interrupt 1{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
if(++num==20){
beep=~beep;
num=0;}
}
...全文
333 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
overmind 2012-01-28
  • 打赏
  • 举报
回复
这个确实应该看晶振的周期,如果12mhz的话,没有问题。
开了中断之后自动倒计时吧 每次进了中断之后再重新把计时数字设定好,50000个1ms,也就是50个微秒。。。
幻氵落 2012-01-28
  • 打赏
  • 举报
回复
#include"reg51.h"

sbit beep=P1^5;
int num=0;

void main(){
TMOD=0x01;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1;
ET0=1; //你一打开定时器0他就会开始计时,只不过开始第一次的中断的时间比较久,是从TH0跟
TR0=1; //TL0都等于0开始,直到产生中断进入中断服务程序
while(1);}

void beeper() interrupt 1{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
if(++num==20){
beep=~beep;
num=0;}
}
宋哥 2012-01-19
  • 打赏
  • 举报
回复
主程序中给timer1赋初值估计是笔误,应该是给timer0赋初值,TMOD=0x01也是说明timer0工作在模式1,即16位模式,而timer1是工作在模式0,8位模式。
宋哥 2012-01-19
  • 打赏
  • 举报
回复
蜂鸣器的循环实际是timer0完成的,timer1根本没起作用,虽然一开始主程序中timer1赋了个初值,但也仅此而已,timer0虽然没有赋初值,但每次中断之后是赋了值的(如果你的晶振是12M的话,赋的值就是50ms,在用num计数20次,就是1000ms),所以不影响蜂鸣器的输出。
飝鱼 2012-01-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 iamlaosong 的回复:]

蜂鸣器的循环实际是timer0完成的,timer1根本没起作用,虽然一开始主程序中timer1赋了个初值,但也仅此而已,timer0虽然没有赋初值,但每次中断之后是赋了值的(如果你的晶振是12M的话,赋的值就是50ms,在用num计数20次,就是1000ms),所以不影响蜂鸣器的输出。
[/Quote]

我将这段注释了:
//TH1=(65536-50000)/256;
//TL1=(65536-50000)%256;

发现还是会响的。虽然EA=1;
ET0=1;
TR0=1;
这些开关都打开了,但是主程序中timer0并没有设置初值啊,他能启动定时器0并触发中断程序吗?

O(∩_∩)O谢谢
windyboy47 2012-01-19
  • 打赏
  • 举报
回复
开始有笔误,上面的已经说了。

#include"reg51.h"

sbit beep=P1^5;
unsigned char num=0;

void main()
{
beep = 1;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1; //可以注释了看看还会不会响
while(1);
}

void beeper() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
if(++num==20)
{
beep=~beep;
num=0;
}
}

一步一步调试肯定会出来的
飝鱼 2012-01-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 pallee 的回复:]

对于Q1:
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;貌似应该是50ms吧,如果你的晶振是12M的话。

对于Q2:
没太看明白,你贴的程序中没有出现定时器1的中断,TMOD=0x01,定时器1工作在方式0,8位定时器,赋初值是这样的?不对吧。

对于Q3:
不明白。

仅供参考。
[/Quote]
关于Q2,因为蜂鸣器的循环是由中断程序和timer0完成的,但是触发这个中断程序是不是靠主程序中的timer1?由此引出Q3:定时器启动是要设置ET和ER的,我没有给timer1信号,他会开始定时吗?
O(∩_∩)O谢谢
另:工作方式2才是8位定时器
AnYidan 2012-01-14
  • 打赏
  • 举报
回复
看看手册中 timer 的设定
palleexu 2012-01-14
  • 打赏
  • 举报
回复
对于Q1:
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;貌似应该是50ms吧,如果你的晶振是12M的话。

对于Q2:
没太看明白,你贴的程序中没有出现定时器1的中断,TMOD=0x01,定时器1工作在方式0,8位定时器,赋初值是这样的?不对吧。

对于Q3:
不明白。

仅供参考。

27,382

社区成员

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

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