完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
今天做了一个题,结果不会做,看答案也木有看懂T_T,
![]() 题目:同时用两个定时器控制蜂鸣器发声, 定时器0控制频率, 定时器1控制同个频率持续的时间, 间隔300ms依次输出1,10,50,100, 200,400,800,1k(hz)的方波。 小白的问题: 1.“定时器1控制同个频率持续的时间,间隔300ms依次输出1,10,50,100,200,400,800,1k(hz)的方波。”该如何理解(用通俗易懂的语言) 2.如何理解if语句的作用是用来选取不同的频率? 答案如下: #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) { tt=0; fre=50000; beep=~beep; } if(flag>=40&&flag<80) { tt=0; fre=50000; beep=~beep; } if(flag>=80&&flag<120) { tt=0; fre=10000; beep=~beep; } if(flag>=120&&flag<160) { tt=0; fre=5000; beep=~beep; } if(flag>=160&&flag<200) { tt=0; fre=2500; beep=~beep; } if(flag>=200&&flag<240) { tt=0; fre=1250; beep=~beep; } if(flag>=240&&flag<280) { tt=0; fre=625; beep=~beep; } if(flag>=280&&flag<320) { tt=0; fre=312; beep=~beep; } if(flag>=320&&flag<360) { 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; } } 小白再次再次感谢各路大神 ![]() 评分 |
|
相关推荐
9 个讨论
|
|
首先,你的题目和程序不对应(你下载试过吗?)程序实现不了你所说的要求!题目更改如下:
题目:同时用两个定时器控制蜂鸣器发声, 间隔2s依次输出1,10,50,100,200,400,800,1k(hz)的方波。 更改代码如下: #include #define uint unsigned int //宏定义 #define uchar unsigned char //宏定义 ***it beep=P3^7; //蜂鸣器的接口我照着51start改了 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(tt==10) { tt=0; fre=50000; beep=~beep; } if(flag>=40&&flag<80) { tt=0; fre=50000; beep=~beep; } if(flag>=80&&flag<120) { tt=0; fre=10000; beep=~beep; } if(flag>=120&&flag<160) { tt=0; fre=5000; beep=~beep; } if(flag>=160&&flag<200) { tt=0; fre=2500; beep=~beep; } if(flag>=200&&flag<240) { tt=0; fre=1250; beep=~beep; } if(flag>=240&&flag<280) { tt=0; fre=625; beep=~beep; } if(flag>=280&&flag<320) { tt=0; fre=500; 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; } } 1.“定时器1控制同个频率持续的时间,间隔300ms依次输出1,10,50,100,200,400,800,1k(hz)的方波。”该如何理解(用通俗易懂的语言) 首先说一下方波的概念,那1hz为例,就是周期为1s的一种波,其中0.5s为高电平,0.5s为低电平。再拿10hz为例:就是周期为0.1s(也就是100ms)的一种波,其中50ms为高电平,50ms为低电平。然后题目中所说的间隔300ms,意思是每种方波的持续时间为300ms。按照题目的描述,你的波形应该是: 高电平(持续0.5s)—>低电平(持续0.5s)—>......这种状态持续300ms的时间,完了之后进入下一状态—>高电平(持续50ms)—>低电平(持续50ms)—>......这种状态持续300ms的时间,完了之后进入下一状态——>.................明白了吗?(说明:题目里应该为2s的间隔才对,2s跟你的程序对应) 2.如何理解if语句的作用是用来选取不同的频率? 定时器1的作用是每50ms产生一次中断,每产生一次中断,就把flag加1.flag的范围是0-320,总共16s,每种方波持续时间为2s,总共8种方波。 flag为0-40时,为前2秒,这时应该是方波1:1hz。 flag为41-80时,为次之的2秒,这时是方波2:10hz; ......... 看明白了吗? |
|
|
|
|
|
推荐你看“张飞电子工程师速成视频教程”
这份视频教程讲解了电子世界从入门到精通的核心内容。主讲人以自己实际完成的项目为讲解对象,摒弃了传统教学方式-即对书本的一而再、再而三的复读。由易而难地讲解了原理图的设计,每一个元器件的作用及从工程和经验的角度教大家怎么去理解设计中的每一个元器件、教大家怎么去入手一个新项目,怎么去设计和架构原理图,怎么让设计的产品在市场上充满竞争力等。无论多深奥的理论通过讲解一听便懂并运用,同时逻辑严密、环环相扣,收听者会得到很大提升,不再似是而非、一知半解。更重要的是提升了自己独立做项目的能力。 视频教程在优酷网、土豆网上搜索“张飞电子工程师速成视频教程” 视频主讲人张飞老师是模电行业的专家,有着深厚的模电设计经验,需要高清版可以联系其本人。张老师QQ#437521793,邮箱songshanguiren1314@163.com 如需要深入学习,到淘宝购买高级教程,搜店铺“上海飞昌速达电子”或者“张飞电子工程师速成视频教程(第二部和第三部) (所有看过视频的朋友都一致好评) 另外, 中级版 硬件工程师学习视频即将隆重推出,大家敬请期待。 |
|
|
|
|
|
只有小组成员才能发言,加入小组>>
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-9-1 14:41 , Processed in 0.787680 second(s), Total 82, Slave 63 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191