完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
/*******************************/
/*同时用两个定时器控制蜂鸣器发声, T0控制频率,T1控制同个频率持续的 时间,间隔两秒依次输出1,10,50,100, 200,400,800?1000的方波,设晶振频率为12MHZ*/ /****************************************/ #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; TH0=(65536-fre)/256; TL0=(65536-fre)/256; TH1=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; ET0=1; TR0=1; ET1=1; TR1=1; while(1); } void T0_timer() interrupt 1 { TR0=0; TH0=(65536-fre)/256; TL0=(65536-fre)/256; tt++; if(flag<40) 这里的40怎么算出来的 { if(tt==10) { tt=0; fre=50000;以及这里为什么是50000 beep=~beep; } } if(flag>=40&&flag<80)这里的40 ,80怎么算出来的 { tt=0; fre=50000; beep=~beep; } if(flag>=80&&flag<120) { tt=0; fre=10000;这里的10000怎么算出来 beep=~beep; } if(flag>=120&&flag<160)这里的120 160怎么算出来 { tt=0; fre=5000;这里的5000怎么算出来 beep=~beep; } if(flag>=160&&flag<200) { tt=0; fre=2500;这里的2500怎么算出来的 beep=~beep; } if(flag>=200&&flag<240)这里的200 240怎么算出来 { tt=0; fre=1250;这里的1250怎么算出来的 beep=~beep; } if(flag>=240&&flag<280)这里的240 280 怎么算出来的 { tt=0; fre=625;这里的625怎么算出来的 beep=~beep; } if(flag>=280&&flag<320)这里的280 320怎么算出来 { tt=0; fre=312;这里的312怎么算出来的 beep=~beep; } if(flag>=320&&flag<360)这里的320 360 怎么算出来的 { tt=0; fre=156;这里的156怎么算出来的 beep=~beep; } TR0=1; } void T1_timer() interrupt 3 { TH1=(65536-50000)/256; TL0=(65536-50000)%256; flag++; if(flag==360) { flag=0; fre=50000; } } 哪位大神帮我讲解一下这个程序 |
|
相关推荐
11个回答
|
|
这个程序是有问题的 定时器1的TL1不是TL0 还有主函数写的也不规范 不知运行结果如何 不过应该会出错
|
|
|
|
你看一下定时器1的中断 你就会明白是怎么搞出来数字的啦 50000跟flag flag是用来形成方波的
|
|
|
|
那个TL0是手误 暂时不要管 我想知道那些个标的数字怎么算出来的 还有如果想将程序写的更规范的话 大神给指导一下 或是推荐本书看看也行 给指条明路 |
|
|
|
我根据这个定时时间反推了一下 验证是正确的 但还是模糊 在给出晶振频率以及要求的频率这两个条件下 就有点蒙圈了 大神能给讲解一下不 |
|
|
|
wr12306 发表于 2016-4-8 16:59 郭天祥的十天学会单片机 那本书的知识丰富 够用 |
|
|
|
1HZ等于1秒一个周期 1KHZ等于1毫秒一个周期 剩下的你自己想想试试 |
|
|
|
我就是在用郭的那本书 这是课后的一道题 重新看了定时器T1的初值计算,但还不是很透彻 |
|
|
|
可以这样通俗了讲 65536减多少就是定义后面那个数的小数点往前移两位毫秒如(65536-50000)就是定义50ms /这个符号是取整 %这个符号是取余 |
|
|
|
张大猛 发表于 2016-4-9 10:20 老大 我知道这个初值计算 只是不明白那个360怎么算出来的 还有就是为什么在小于40时是fre=50000; 在(flag>=320&&flag<360)时为什么fre=156; 以及在判断标志位前为啥 TR=0 |
|
|
|
开头不是产生方波的频率以次扩大二倍(从第三个开始)那不就是在它fre值上除以二吗 |
|
|
|
光于TRO是按照主函数语句顺序执行的 是防止溢出的 每次进去一次加一次关闭再打开 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
stm32f407+ksz8863rlli概率性ping不通
698 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-常见网络服务搭建之NFS服务搭建
374 浏览 0 评论
求助:辉芒微芯片 FDM B11GBMH 的信息及开发环境安装
375 浏览 0 评论
918 浏览 0 评论
嵌入式 学习-飞凌嵌入式ElfBoard ELF 1板卡-shell脚本编写之输入输出重定向
774 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11307 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-9-29 07:59 , Processed in 0.752563 second(s), Total 93, Slave 76 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号