/*******************************************************************/ /* 同时用两个定时器控制蜂鸣器发声, 定时器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; } }
收藏0 举报
s200522056 发表于 2013-9-21 23:55 tim用来设置Timer0的周期 Timer1周期固定用来计时:每个P2频率的持续时间 Timer0周期可变:改变P2的频率 ...
起名字烦死了 发表于 2013-9-22 08:12 你所说的我能看得懂,我想知道的是,tim变量的在if语句中的各个值是如何确定的? ...
lidongxin3 发表于 2013-9-22 08:58 估计跟声音的声调有关系吧,怎么定还是不清楚
起名字烦死了 发表于 2013-9-22 15:15 是用来去生成频率的,但是我不明白这些值是怎么确定的。。。
本版积分规则 发表回复 回帖并转播 回帖后跳转到最后一页
人才类勋章
时间类勋章
发帖类勋章
1
3
0
扫码关注 21ic 官方微信
扫码关注嵌入式微处理器
扫码关注电源系统设计
扫码关注21ic项目外包
扫码浏览21ic手机版
本站介绍 | 申请友情链接 | 欢迎投稿 | 隐私声明 | 广告业务 | 网站地图 | 联系我们 | 诚聘英才
京公网安备 11010802024343号