关于郭天祥教程一个课后习题。
时间:10-02
整理:3721RD
点击:
先上例题程序,有几个地方不懂希望大家能指点一下!
同时用两个定时器控制蜂鸣器发声,
定时器0控制频率,定时器1控制同个
频率持续的时间,间隔2s依次输出
1,10,50,100,200,400,800,
1k(hz)的方波?
设晶振频率为12MHz。
同时用两个定时器控制蜂鸣器发声,
定时器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 fre,flag;
- void main() //主函数
- {
- fre=50000;
- beep=0;
- TMOD=0x11;//设置定时器0,定时器1为工作方式1
- TH0=(65536-fre)/256;
- TL0=(65536-fre)%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-fre)/256;
- TL0=(65536-fre)%256;
- tt++;
- if(flag<40)(第一个2s) //以下几个if分别用来选取不同的频率
- if(tt==10)
- {
- tt=0;
- fre=50000;
- beep=~beep;
- }
- if(flag>=40&&flag<80)(4s)
- {
- tt=0;
- fre=50000;
- beep=~beep;
- }
- if(flag>=80&&flag<120)(6s)
- {
- tt=0;
- fre=10000;
- beep=~beep;
- }
- if(flag>=120&&flag<160)(8s)
- {
- tt=0;
- fre=5000;
- beep=~beep;
- }
- if(flag>=160&&flag<200)(10s)
- {
- tt=0;
- fre=2500;
- beep=~beep;
- }
- if(flag>=200&&flag<240)(12s)
- {
- tt=0;
- fre=1250;
- beep=~beep;
- }
- if(flag>=240&&flag<280)(14s)
- {
- tt=0;
- fre=625;
- beep=~beep;
- }
- if(flag>=280&&flag<320)(16s)
- {
- tt=0;
- fre=312;
- beep=~beep;
- }
- if(flag>=320&&flag<360)(18s)
- {
- tt=0;
- fre=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;
- fre=50000;
- }
- }
时钟源,定时器分频,需要查看定时器工作的具体描述
总体大概我懂,就是关于定时器0的频率问题,请问由什么计算出单片机定时中断多少次是1HZ?
恩,有点懂了!我在看看书自己理解一下,谢谢了哈!