踩过的坑!!!红外接收模块输出接口和按键k3共用的p32引脚,所以有红外的时候单片机会误以为按了k3按键,测试的时候要把红外接收拔掉,蜂鸣器连接的IO口是P25(江科的是P15),之前学习的时候看弹幕说型号选stcc51rc2(但我这里的代码没改),就一直选的这个,蜂鸣器也能正常播放提示音,但到后面播放天空之城就会出现音调不准的情况,所以选stcc51就行,但一定要把P15改成P25!!!
蜂鸣器介绍
驱动方式不同,有源一般用在固定提示驱动简单,无源类似扬声器,普中有源,如何分辨有无源,正负极的判断
在电路中的符号
驱动原理
ULN2003
五线四相步进电机,左边(P15)为IO口,提供信号(普中新版开发板改成了P25,这里用的还是江科提供的PPT内容),BZ连接到蜂鸣器
驱动方式
自激蜂鸣器是直流电压驱动的,不需要利用交流信号进行驱动,只需对驱动口输出驱动电平并通过三极管放大驱动电流就能使蜂鸣器发出声音。
单片机驱动他激蜂鸣器的方式有两种:一种是PWM 输出口直接驱动,另一种是利用I/O 定时翻转电平产生驱动波形对蜂鸣器进行驱动。
PWM 输出口直接驱动是利用PWM 输出口本身可以输出一定的方波来直接驱动蜂鸣器。在单片机的软件设置中有几个系统寄存器是用来设置PWM 口的输出的,可以设置占空比、周期等等,通过设置这些寄存器产生符合蜂鸣器要求的频率的波形之后,只要打开PWM 输出,PWM 输出口就能输出该频率的方波,这个时候利用这个波形就可以驱动蜂鸣器了。
利用I/O 定时翻转电平来产生驱动波形的方式会比较麻烦一点,必须利用定时器来做定时,通过定时翻转电平产生符合蜂鸣器要求的频率的波形,这个波形就可以用来驱动蜂鸣器了。比如为100Hz 的蜂鸣器的驱动,可以知道周期为10000μs,这样只需要驱动蜂鸣器的I/O 口每5000μs 翻转一次电平就可以产生一个频率为100Hz,占空比为1/2duty 的方波,再通过三极管放大就可以驱动这个蜂鸣器了。
代码部分
main.c
#include <atc51RC2.h>
#include "key.h"
#include "smgshow.h"
#include "buzzer.h"
unsigned char keynum;
void main()
{
smgshow(1,0);
while (1)
{
keynum=key();
if(keynum)
{
smgshow(1,keynum);
buzzer_time(1000);
}
}
}
buzzer.c
#include <atc51RC2.h>
#include <INTRINS.H>
sbit buzzer=P2^5;
void Delay500us(void)
{
unsigned char data i;
_nop_();
i = 227;
while (--i);
}
void buzzer_time(unsigned int xms)
{
unsigned int i;
for(i=0;i<xms*2;i++)
{
buzzer=!buzzer;
Delay500us();
}
}