完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
6个回答
|
|
定时器定时200us,中断里翻转接到蜂鸣器的IO 就行;
|
|
|
|
本帖最后由 xiangyu6 于 2013-7-13 20:38 编辑
采用定时器进行频率设置,1khz说明周期是1ms,那么设置高电平为500us,低电平为500us。 程序如下: #include ***it beep = P1 ^ 0; char num; void main() { TMOD = 0x01; // 设置定时器0为工作方式(M1M0为01) TH0 = (65536 - 500) / 256; //自动赋初值 最高位 定时0.5ms TL0 = (65536 - 500) % 256; // 最低位 EA = 1; //开总中断,CPU中断开 ET0 = 1; //定时器0中断 TR0 = 1; //启动定时器0 beep = 0x01 ; while(1) ; } //程序停止在这里等待中断发生 void T0_time(void) interrupt 1 // 定时/计数器0溢出中断 { TH0 = (65535 - 500) / 256; //重装初值 TL0 = (65535 - 500) % 256; num++; if(num == 1) //如果到了1次,说明0.5ms已到,num可以用来方便修改周期,间接修改频率 { num = 0; beep = ~beep; //让蜂鸣器状态取反 } } |
|
|
|
非常感谢啊~~看来还是要多用中断函数……总之很谢谢你 |
|
|
|
|
|
|
|
嗯,定时中断。
|
|
|
|
这个用中断函数的定时是十分准确的,但如果只是粗略的定时的话,毕竟蜂鸣器不需要那么准确的精度(毕竟你分辨不出来1khz和990hz的音频吧?)直接用一个延时函数,然后调用就好了。
贴出代码:: void delay500us() { unsigned char j; for(j=0;j<57;j++) //500us基准延时程序 { ; } } void beep() //产生1KHZ频率声音的函数 { fmq=0; delay500us(); fmq=1; delay500us(); } |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-初识设备树之设备组织架构
734 浏览 0 评论
582 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-初识设备树之设备树组成和结构
840 浏览 0 评论
【敏矽微ME32G070开发板免费体验】点亮WS2812B灯板
1039 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-Linux内核移植之内核启动流程
937 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12161 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-12 06:06 , Processed in 0.586098 second(s), Total 81, Slave 65 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号