历史上的今天
今天是:2025年08月17日(星期日)
2021年08月17日 | 51单片机-无源蜂鸣器鸣叫
2021-08-17 来源:eefocus
1.输出方波图解
我们现在要给单片机IO端口输出4khz的方波。
现在我们算出方波的周期:1/(4*1000)s=0.00025s=0.25ms
高电平时间:(0.25/2)ms=0.125ms 低电平时间:(0.25/2)ms=0.125ms

2.驱动代码
因为我们只写过最低延时1ms的函数,所以这里测试用“for(i=0;i<14;i++);”作为延时0.125ms,本节的单片机IO端口为开发板中的P1.6,无源蜂鸣器的硬件连接因为不像LED那样都接了很多其他器件来初始化,所以本节的代码就显得相当简短,下载进开发板蜂鸣器就一直鸣叫了
1 2 3 4 5 6 7 8 9 10 11 12 13 | #include sbit BEEP = P1^6; void main() { unsigned int i; while(1) { BEEP=1; for(i=0;i<14;i++);//延时接近0.125ms,给P1.6保持了0.125ms高电平时间 BEEP=0; for(i=0;i<14;i++);//低电平时间保持了0.125ms, 我们可以尝试把两个for语句里的14改大一点就会发现鸣叫的音调变得低沉一些了 } } |
3.代码书写新知识
我们现在引入新的代码书写知识“BEEP=!BEEP;”。
“!BEEP”是把此时自身的值非一下,比如当还没执行“BEEP =!BEEP;”语句时,假设此时的BEEP是等于1的。
当执行到“BEEP =!BEEP;”时,“!BEEP”是等于上一次的状态1变为0。
那现在的这条“BEEP =!BEEP;”就跟“BEEP=0;”是一样的了。
下一次再执行“BEEP =!BEEP;”时同理变为了“BEEP=1;”。
所以该语句实现的是来回变换赋给BEEP的值(0或1)。
这样我们就可以把上面的代码中while(1)部分简写为
1 2 3 4 5 | while(1) { BEEP=!BEEP; for(i=0;i<14;i++);//只需改变一次for语句中的14就可以实现不同音调的鸣叫了 } |
大家也可以回到第二章的第五讲改写为“LED2=!LED2”同样也可以实现LED闪烁的。
4.单片机IO端口初始电平
有同学会问,单片机的其他IO端口在程序里没有给0或1时,它们初始时是输出高电平还是低电平呢?
STC89C52RC这款芯片的P1,P2,P3这一共24个IO端口由于内部硬件的原因上电的时候都是输出高电平的,而P0一开始是一种不确定的状态(有时是高有时是低),但我们用的开发板已经把P0端口接了上拉电阻,所以开发板的P0.0~P0.7初始时也是输出高电平的(可参考《手把手教你学51单片机》文档2.4.1节的复位值和9.1节、9.2节的上下拉电阻了解一下,了解不了可暂时放一下,继续往下学)。
这也就解释了,当初点亮一盏灯的时候,代码没有写过P0.1,P0.2···这些内容,对应的这些灯都没有亮,只有在程序中写让P0.1输出0时灯才亮,所以其他灯不亮是因为IO端口已经默认输出了高电平。
这里我们先记住:所有的IO端口在程序初始时没有给0则全都是输出高电平这样的概念先。
上一篇:51单片机-蜂鸣器原理
下一篇:51单片机-无源蜂鸣器题目
史海拾趣
|
各位前辈好!想向大家请教一个问题,是这样的: 我在做OAL时,用IAR5.2调试,在startup.s的开头的几行定义如下: bl TT g_oalAddressTable_address   ...… 查看全部问答> |
|
我的单片机型号是MC9S08DZ60,求助CAN通讯波特率计算 我的单片机型号是MC9S08DZ60,所使用的晶振频率是4MHZ,谁能给我一个计算CAN通讯波特率的范例吗?谢谢你们啦!!!… 查看全部问答> |
|
7 月份编程语言排行 - Objective-C 超于 C++ IOBE 发布了 2012 年 7 月份的最新编程语言排行榜.这个月编程语言最大的变化是 Objective-C 超越 C++,成为仅次于 C 和 Java 的编程语言。Objective-C 和 C++ 都是1983年发明的,作为 C 语言的面向对象后代。在刚开始的时候,它们就在互相竞争成为 ...… 查看全部问答> |
|
replyreload += \',\' + 1364929;(注:以下观点可能有误) 这次易电源试用,TI送了板子又设大奖,目的是让大家体验易电源的优势,看看它的性能。 它们也就是拿个觉得“自豪”的产品,让你找找它具体在各方面的与众不同之处。那么,这次试的目的 ...… 查看全部问答> |
|
搭了个小车,无线收发模块出现了一些问题。单独测试,正常,组合到一起,遥控功能变得很差。接收距离缩短了百分之九十多。在后来的测试中,我改变了固封的可调电感,我意识到调坏了。原来的状态调不回去了。调到了一个相对好一点的状态,继续测试。 ...… 查看全部问答> |
|
我写的程序读写不能同时工作。我用板子上的例程直接下进去可以正常读写,而我写的程序却有问题; 我用我程序读例程写在地址1000处的字符串可以正确读出来,例程读我写在地址100处的也可以读出来; 而我用我自己的程序读自己写在地址100处的例程却 ...… 查看全部问答> |




