打印
[51单片机]

单片机求助

[复制链接]
1990|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 起名字烦死了 于 2013-9-21 23:09 编辑

1、变量tim的作用是什么?
2、两个定时器间的工作机制是怎样的。

/*******************************************************************/
/*                                                         
同时用两个定时器控制蜂鸣器发声,
定时器0控制频率,定时器1控制同个
频率持续的时间,间隔2s依次输出
1,10,50,  100,200,  400,  800,  1k(hz)的方波?
设晶振频率为12MHz。
*/
/*********************************************************/
#include<reg52.h>  //52单片机头文件
#include <intrins.h> //包含有左右循环移位子函数的库
#define uint unsigned int    //宏定义
#define uchar unsigned char  //宏定义
sbit beep=P2^3;
uchar tt;
uint tim,flag;

void main()                    //主函数
{
        tim=50000;
        beep=0;
        TMOD=0x11;//设置定时器0,定时器1为工作方式1
        TH0=(65536-tim)/256;
        TL0=(65536-tim)%256;
        TH1=(65536-50000)/256;
        TL1=(65536-50000)%256;
        EA=1;//开总中断
        ET0=1;//开定时器0中断
        ET1=1;
        TR1=1;
        TR0=1;//启动定时器0
        while(1);//等待中断产生
        
}

void timer0() interrupt 1   //定时器0中断
{
        TR0=0;    //进中断后先把定时器0中断关闭,防止内部程序过多而造成中断丢失
        TH0=(65536-tim)/256;
        TL0=(65536-tim)%256;
        tt++;
        if(flag<40)    //以下几个if分别用来选取不同的频率
                if(tt==10)
                        {
                                tt=0;
                                tim=50000;
                                beep=~beep;
                        }
        if(flag>=40&&flag<80)
                {
                        tt=0;
                        tim=50000;
                        beep=~beep;        
                }
        if(flag>=80&&flag<120)
                {
                        tt=0;
                        tim=10000;
                        beep=~beep;        
                }
        if(flag>=120&&flag<160)
                {
                        tt=0;
                        tim=5000;
                        beep=~beep;        
                }
        if(flag>=160&&flag<200)
                {
                        tt=0;
                        tim=2500;
                        beep=~beep;        
                }
        if(flag>=200&&flag<240)
                {
                        tt=0;
                        tim=1250;
                        beep=~beep;        
                }
        if(flag>=240&&flag<280)
                {
                        tt=0;
                        tim=625;
                        beep=~beep;        
                }
        if(flag>=280&&flag<320)
                {
                        tt=0;
                        tim=312;
                        beep=~beep;        
                }
        if(flag>=320&&flag<360)
                {
                        tt=0;
                        tim=156;
                        beep=~beep;        
                }
        TR0=1;
}
void timer1() interrupt 3  //定时器1中断用来产生2秒时间定时
{
        TH1=(65536-50000)/256;
        TL1=(65536-50000)%256;
        flag++;
        if(flag==360)
          {
            flag=0;
            tim=50000;
          }
}

相关帖子

沙发
s200522056| | 2013-9-21 23:55 | 只看该作者
tim用来设置Timer0的周期
Timer1周期固定用来计时:每个P2频率的持续时间
Timer0周期可变:改变P2的频率

使用特权

评论回复
板凳
起名字烦死了|  楼主 | 2013-9-22 08:12 | 只看该作者
s200522056 发表于 2013-9-21 23:55
tim用来设置Timer0的周期
Timer1周期固定用来计时:每个P2频率的持续时间
Timer0周期可变:改变P2的频率 ...

你所说的我能看得懂,我想知道的是,tim变量的在if语句中的各个值是如何确定的?

使用特权

评论回复
地板
lidongxin3| | 2013-9-22 08:58 | 只看该作者
起名字烦死了 发表于 2013-9-22 08:12
你所说的我能看得懂,我想知道的是,tim变量的在if语句中的各个值是如何确定的? ...

估计跟声音的声调有关系吧,怎么定还是不清楚

使用特权

评论回复
5
起名字烦死了|  楼主 | 2013-9-22 15:15 | 只看该作者
本帖最后由 起名字烦死了 于 2013-9-22 15:59 编辑
lidongxin3 发表于 2013-9-22 08:58
估计跟声音的声调有关系吧,怎么定还是不清楚

是用来去生成频率的,但是我不明白这些值是怎么确定的。。。

使用特权

评论回复
6
qxxgyz| | 2013-9-22 16:18 | 只看该作者
本帖最后由 qxxgyz 于 2013-9-22 16:28 编辑

tim=(1/f)*0.5*1000000   
f=1000Hz   tim=500ms
tim=312ms   f=1600Hz

使用特权

评论回复
7
很忙| | 2013-9-22 17:20 | 只看该作者
是用来去顶生硬频率的这个说法有问题,tim是改变Timer0的中断时间的,改变之后输出的方波频率就改变了。软件的功能就是在相同的时间间隔2S*40内,输出了9段频率不同的方波,这个频率也是可以计算得到的。
要知道tim怎么确认值,你需要知道Timer是怎么样产生中断的。
Timer是计数溢出时产生中断的。从定时器1中断用来产生2秒时间定时
  TH1=(65536-50000)/256;
  TL1=(65536-50000)%256;
设置可以看出Timer初值为65536-50000开始到65536产生一次中断,这个中断时间是2S.
也就是Timer计数50000次的时间是2S。
所以tim的值就好理解了。
tim=10000;   (10000/50000)*2s
tim=5000;    (5000/50000)*2s
tim=2500;    (2500/50000)*2s
tim=1250;    (1250/50000)*2s
tim=625;     (625/50000)*2s
tim=312;     (312/50000)*2s
tim=156;     (156/50000)*2s
这就是Timer0当前的中断时间了。

使用特权

评论回复
8
feng_ye| | 2013-9-23 11:53 | 只看该作者
这个很简单的啊,频率为12MHZ时,tim就是给出计数的数目(计的是内部晶振的脉冲)即50000us后定时器产生溢出中断,也就是定时50ms,其实就是50ms*361=?就是定时多少时间了。

定时其实就是计数,计的是内部晶振脉冲;实现方式有两种:查询方式和中断方式。查询方式不需要用到中断,因此不需要开中断,只是检测TF1或者TF0来判断是否定时是否完成。中断方式产生中断后(即单片机检测到TF?为1后),自行跳到定时中断处理程序执行。

使用特权

评论回复
9
浪浪云| | 2013-9-23 13:01 | 只看该作者
话说这个程序好熟悉啊,郭天祥老师的,另外同意七楼

使用特权

评论回复
10
lidongxin3| | 2013-9-26 10:57 | 只看该作者
起名字烦死了 发表于 2013-9-22 15:15
是用来去生成频率的,但是我不明白这些值是怎么确定的。。。

跟音乐有关吧

使用特权

评论回复
11
电子点名| | 2013-10-6 19:43 | 只看该作者
tim不就是一个中断延时的函数,用来调频率的啊

使用特权

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

本版积分规则

1

主题

3

帖子

0

粉丝