微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 关于郭天祥教程一个课后习题。

关于郭天祥教程一个课后习题。

时间:10-02 整理:3721RD 点击:
先上例题程序,有几个地方不懂希望大家能指点一下!
                                                      
同时用两个定时器控制蜂鸣器发声,
定时器0控制频率,定时器1控制同个
频率持续的时间,间隔2s依次输出
1,10,50,100,200,400,800,
1k(hz)的方波?
设晶振频率为12MHz。

  1. */
  2. /*********************************************************/
  3. #include<reg52.h>  //52单片机头文件
  4. #include <intrins.h> //包含有左右循环移位子函数的库
  5. #define uint unsigned int    //宏定义
  6. #define uchar unsigned char  //宏定义
  7. sbit beep=P2^3;
  8. uchar tt;
  9. uint fre,flag;
  10. void main()      //主函数
  11. {
  12. fre=50000;
  13. beep=0;
  14. TMOD=0x11;//设置定时器0,定时器1为工作方式1
  15. TH0=(65536-fre)/256;
  16. TL0=(65536-fre)%256;
  17. TH1=(65536-50000)/256;
  18. TL1=(65536-50000)%256;
  19. EA=1;//开总中断
  20. ET0=1;//开定时器0中断
  21. ET1=1;
  22. TR1=1;
  23. TR0=1;//启动定时器0
  24. while(1);//等待中断产生

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

复制代码


时钟源,定时器分频,需要查看定时器工作的具体描述

总体大概我懂,就是关于定时器0的频率问题,请问由什么计算出单片机定时中断多少次是1HZ?

恩,有点懂了!我在看看书自己理解一下,谢谢了哈!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top