完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
题目为:同时用两个定时器控制蜂鸣器发声,定时器0控制频率,定时器1控制同个频率持续的时间,间隔300ms依次输出1,10,50,100,200,400,800,
1k(hz)的方波。 给出的代码为: #include #include #define uint unsigned int //宏定义 #define uchar unsigned char //宏定义 ***it 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) //以下几个if分别用来选取不同的频率 if(tt==10) //10个50毫秒是500毫秒,就是2HZ { tt=0; fre=50000; beep=~beep; } if(flag>=40&&flag<80) { tt=0; fre=50000;//50毫秒是20HZ beep=~beep; } if(flag>=80&&flag<120) { tt=0; fre=10000;//10毫秒是100HZ beep=~beep; } if(flag>=120&&flag<160) { tt=0; fre=5000;//5毫秒是200HZ beep=~beep; } if(flag>=160&&flag<200) { tt=0; fre=2500;//2.5毫秒是400HZ beep=~beep; } if(flag>=200&&flag<240) { tt=0; fre=1250;//1.25毫秒是800HZ beep=~beep; } if(flag>=240&&flag<280) { tt=0; fre=625;//0.625毫秒是1600HZ beep=~beep; } if(flag>=280&&flag<320) { tt=0; fre=312;//0.312毫秒约等于3200HZ beep=~beep; } if(flag>=320&&flag<360) { tt=0; fre=156;//0.156毫秒约等于6400HZ 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使蜂鸣器发生2,20,100,200,400,800,1600,3200,6400HZ,9种频率的声音,定时器1使每种声音持续响2秒 正确的代码应该为: /*同时用两个定时器控制蜂鸣器发声, 定时器0控制频率,定时器1控制同个频率持续的时间, 间隔300ms依次输出1,10,50,100,200,400,800, 1k(hz)的方波。*/ #include #include #define uint unsigned int //宏定义 #define uchar unsigned char //宏定义 ***it 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<6) //以下几个if分别用来选取不同的频率 { if(tt==20)//20个50毫秒是1秒,1秒对应1HZ { tt=0; fre=50000; beep=~beep; } } if(flag>=6&&flag<12) { if(tt==2)//两个50毫秒是100毫秒,100毫秒对应10HZ { tt=0; fre=50000; beep=~beep; } } if(flag>=12&&flag<18) { tt=0; fre=20000;//20毫秒对应500HZ beep=~beep; } if(flag>=18&&flag<24) { tt=0; fre=10000;//10毫秒对应100HZ beep=~beep; } if(flag>=24&&flag<30) { tt=0; fre=5000; beep=~beep; } if(flag>=30&&flag<36) { tt=0; fre=2500; beep=~beep; } if(flag>=36&&flag<42) { tt=0; fre=1250; beep=~beep; } if(flag>=42&&flag<48) { tt=0; fre=1000; beep=~beep; } TR0=1; } void timer1() interrupt 3 //定时器1中断用来产生300毫秒时间定时 { TH1=(65536-50000)/256; TL1=(65536-50000)%256; flag++; if(flag==48) { flag=0; fre=50000; } } 但是300毫秒太快,不好分辨,最好还是变成持续2秒能听出效果 /*同时用两个定时器控制蜂鸣器发声, 定时器0控制频率,定时器1控制同个频率持续的时间, 间隔2s依次输出1,10,50,100,200,400,800,1k(hz)的方波。*/ #include #include #define uint unsigned int //宏定义 #define uchar unsigned char //宏定义 ***it 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) //以下几个if分别用来选取不同的频率 if(tt==20)//20个50毫秒是1秒,1秒对应1HZ { tt=0; fre=50000; beep=~beep; } if(flag>=40&&flag<80) { tt=0; fre=100000;//100毫秒就是10HZ beep=~beep; } if(flag>=80&&flag<120) { tt=0; fre=20000; //20毫秒对应50HZ beep=~beep; } if(flag>=120&&flag<160) { tt=0; fre=10000;//10毫秒对应100HZ beep=~beep; } if(flag>=160&&flag<200) { tt=0; fre=5000;//5毫秒对应200HZ beep=~beep; } if(flag>=200&&flag<240) { tt=0; fre=2500;//2.5毫秒对应400HZ beep=~beep; } if(flag>=240&&flag<280) { tt=0; fre=1250; //1.25毫秒对应800HZ beep=~beep; } if(flag>=280&&flag<320) { tt=0; fre=1000;//1毫秒对应1K HZ beep=~beep; } TR0=1; } void timer1() interrupt 3 //定时器1中断用来产生2秒时间定时 { TH1=(65536-50000)/256; TL1=(65536-50000)%256; flag++; if(flag==320) { flag=0; fre=50000; } } |
|
|
|
只有小组成员才能发言,加入小组>>
2565 浏览 0 评论
763浏览 1评论
524浏览 0评论
276浏览 0评论
458浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-30 21:21 , Processed in 1.283010 second(s), Total 80, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号