[51单片机] 单片机求助

[复制链接]
2403|10
 楼主| 起名字烦死了 发表于 2013-9-21 23:07 | 显示全部楼层 |阅读模式
本帖最后由 起名字烦死了 于 2013-9-21 23:09 编辑

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

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

  17. void main()                    //主函数
  18. {
  19.         tim=50000;
  20.         beep=0;
  21.         TMOD=0x11;//设置定时器0,定时器1为工作方式1
  22.         TH0=(65536-tim)/256;
  23.         TL0=(65536-tim)%256;
  24.         TH1=(65536-50000)/256;
  25.         TL1=(65536-50000)%256;
  26.         EA=1;//开总中断
  27.         ET0=1;//开定时器0中断
  28.         ET1=1;
  29.         TR1=1;
  30.         TR0=1;//启动定时器0
  31.         while(1);//等待中断产生
  32.         
  33. }

  34. void timer0() interrupt 1   //定时器0中断
  35. {
  36.         TR0=0;    //进中断后先把定时器0中断关闭,防止内部程序过多而造成中断丢失
  37.         TH0=(65536-tim)/256;
  38.         TL0=(65536-tim)%256;
  39.         tt++;
  40.         if(flag<40)    //以下几个if分别用来选取不同的频率
  41.                 if(tt==10)
  42.                         {
  43.                                 tt=0;
  44.                                 tim=50000;
  45.                                 beep=~beep;
  46.                         }
  47.         if(flag>=40&&flag<80)
  48.                 {
  49.                         tt=0;
  50.                         tim=50000;
  51.                         beep=~beep;        
  52.                 }
  53.         if(flag>=80&&flag<120)
  54.                 {
  55.                         tt=0;
  56.                         tim=10000;
  57.                         beep=~beep;        
  58.                 }
  59.         if(flag>=120&&flag<160)
  60.                 {
  61.                         tt=0;
  62.                         tim=5000;
  63.                         beep=~beep;        
  64.                 }
  65.         if(flag>=160&&flag<200)
  66.                 {
  67.                         tt=0;
  68.                         tim=2500;
  69.                         beep=~beep;        
  70.                 }
  71.         if(flag>=200&&flag<240)
  72.                 {
  73.                         tt=0;
  74.                         tim=1250;
  75.                         beep=~beep;        
  76.                 }
  77.         if(flag>=240&&flag<280)
  78.                 {
  79.                         tt=0;
  80.                         tim=625;
  81.                         beep=~beep;        
  82.                 }
  83.         if(flag>=280&&flag<320)
  84.                 {
  85.                         tt=0;
  86.                         tim=312;
  87.                         beep=~beep;        
  88.                 }
  89.         if(flag>=320&&flag<360)
  90.                 {
  91.                         tt=0;
  92.                         tim=156;
  93.                         beep=~beep;        
  94.                 }
  95.         TR0=1;
  96. }
  97. void timer1() interrupt 3  //定时器1中断用来产生2秒时间定时
  98. {
  99.         TH1=(65536-50000)/256;
  100.         TL1=(65536-50000)%256;
  101.         flag++;
  102.         if(flag==360)
  103.           {
  104.             flag=0;
  105.             tim=50000;
  106.           }
  107. }

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语句中的各个值是如何确定的? ...

估计跟声音的声调有关系吧,怎么定还是不清楚
 楼主| 起名字烦死了 发表于 2013-9-22 15:15 | 显示全部楼层
本帖最后由 起名字烦死了 于 2013-9-22 15:59 编辑
lidongxin3 发表于 2013-9-22 08:58
估计跟声音的声调有关系吧,怎么定还是不清楚

是用来去生成频率的,但是我不明白这些值是怎么确定的。。。
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
很忙 发表于 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当前的中断时间了。
feng_ye 发表于 2013-9-23 11:53 | 显示全部楼层
这个很简单的啊,频率为12MHZ时,tim就是给出计数的数目(计的是内部晶振的脉冲)即50000us后定时器产生溢出中断,也就是定时50ms,其实就是50ms*361=?就是定时多少时间了。

定时其实就是计数,计的是内部晶振脉冲;实现方式有两种:查询方式和中断方式。查询方式不需要用到中断,因此不需要开中断,只是检测TF1或者TF0来判断是否定时是否完成。中断方式产生中断后(即单片机检测到TF?为1后),自行跳到定时中断处理程序执行。
浪浪云 发表于 2013-9-23 13:01 | 显示全部楼层
话说这个程序好熟悉啊,郭天祥老师的,另外同意七楼
lidongxin3 发表于 2013-9-26 10:57 | 显示全部楼层
起名字烦死了 发表于 2013-9-22 15:15
是用来去生成频率的,但是我不明白这些值是怎么确定的。。。

跟音乐有关吧
电子点名 发表于 2013-10-6 19:43 | 显示全部楼层
tim不就是一个中断延时的函数,用来调频率的啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

3

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部