stm32产生方波驱动蜂鸣器播放不同音调的歌曲实现按键控制上下一曲暂停播放oled显示出来的程序?

stm32产生方波驱动蜂鸣器播放不同音调的歌曲实现按键控制上下一曲暂停播放oled显示出来的程序?,第1张

这个程序你可以分为两部分来做那一部分,你要先调试这个蜂鸣器音调歌曲的程序先调试好。然后你可以做一个指针来指向不同的存储期。通过按键实现自身的跳转就可以实现上下级的播放。这个程序你可以分为两部分来做那一部分,你要先调试这个蜂鸣器音调歌曲的程序先调试好。然后你可以做一个指针来指向不同的存储期。通过按键实现自身的跳转就可以实现上下级的播放。这个程序你可以分为两部分来做那一部分,你要先调试这个蜂鸣器音调歌曲的程序先调试好。然后你可以做一个指针来指向不同的存储期。通过按键实现自身的跳转就可以实现上下级的播放。这个程序你可以分为两部分来做那一部分,你要先调试这个蜂鸣器音调歌曲的程序先调试好。然后你可以做一个指针来指向不同的存储期。通过按键实现自身的跳转就可以实现上下级的播放。

如图所示:a为输入,b为输出,此电路能实现你要求的一个方波延迟电路,此电路的非门可用cd4069芯片或cd4011芯片都可以,须注意一点是:m点的充电时间比l点的充电时间要短,r1和r2可用滑动变阻器来调.

程序好写,但是和硬件相关。

一个历程,参考

下面给一个例程。该程序利用MAX518进行D/A转换,且从D/A0引脚输出一个正弦波形。可作为读者编制程序的参考。特别注意,在调试该程序时,把模板上的钮子开关S8拔向高电平,以免发生资源冲突。

#include <pic.h>

//本程序将通过PIC16F877的I2C方式驱动D/A转换器MAX518,使其D/A0通道输出

//一个连续的正弦波形(注:本程序并没对正弦波的频率进行控制)

const char table[ ] = {0X80,0X86,0X8D, 0X93,0X99,0X9F,0XA5,0XAB,

0XB1,0XB7,0XBC,0XC2,0XC7,0XCC,0XD1,0XD6,0XDA,0XDF,0XE3,0XE7,0XEA,0XEE,0XF1,0XF4,0XF6,0XF8,0XFA,0XFC,0XFD,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0XFD,0XFB,0XF9,0XF7,0XF5,0XF2,0XEF,0XEC,0XE9,0XE5,0XE1,0XDD,0XD8,0XD4,0XCF,0XCA,0XC5,0XBF,0XBA,0XB4,0XAE,0XA8,0XA2,0X9C,0X96,0X90,0X89,0X83,0X80,0X79,0X72,0X6C,0X66,0X60,0X5A,0X55,0X4E,0X48,0X43,0X3D,0X38,0X33,0X2E,0X29,0X25,0X20,0X1C,0X18,0X15,0X11,0X0E,0X0B,0X09,0X07,0X05,0X03,0X02,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0X02,0X04,0X06,0X08,0X0A,0X0D,0X10,0X13,0X16,0X1A,0X1E,0X22,0X27,0X2B,0X30,0X35,0X3A,0X40,0X45,0X4C,0X51,0X57,0X5D,0X63,0X69,0X6F,0X76,0X7C};

//以上的数组用于存放正弦表,在定义数组时,前面应该加上 const,

//以使数组存放于ROM中,而不至于占用太多的RAM

unsigned char i;

unsignedchar j;

unsignedchar n;

//I2C初始化子程序

void i2cint()

{

SSPCON = 0X08;//初始化SSPCON寄存器

TRISC3 =1; //设置SCL为输入口

TRISC4 =1; //设置SDA为输入口

TRISA4 = 0;

SSPSTAT=0X80;//初始化SSPSTAT寄存器

SSPADD=0X02;//设定I2C时钟频率

SSPCON2=0X00;//初始化SSPCON2寄存器

di(); //关闭总中断

SSPIF=0; //清SSP中断标志

RA4=0; //关掉74HC165的移位时钟使能,以免74HC165

//移位数据输出与I2C总线的数据线发生冲突

SSPEN=1; //SSP模块使能

}

//I2C总线输出数据子程序

void i2cout()

{

SEN=1; //产生I2C启动信号

for(n=0x02;--n;) continue;//给予一定的延时,保证启动

do {

RSEN=1;//产生I2C启动信号

}while(SSPIF==0); //如果没能启动,则反复启动,直到启动为止

SSPIF=0; //SSPIF标志清0

SSPBUF=0X58;//I2C总线发送地址字节

do {

}while(SSPIF==0); //等待地址发送完毕

SSPIF=0; //SSPIF标志清0

SSPBUF=0X01;//I2C总线发送命令字节

do {

}while(SSPIF==0); //等待命令发送完毕

SSPIF=0; //SSPIF标志清0

SSPBUF=j; //I2C总线发送数据字节

do {

}while(SSPIF==0); //等待数据发送完毕

SSPIF=0; //SSPIF标志清0

PEN=1; //产生停止条件

do {

}while(SSPIF==0); //等待停止条件产生

SSPIF=0; //SSPIF标志清0

}

//主程序

main ()

{

i2cint(); //I2C初始化

while(1){

for(i=0x00;i<=127;++i)

{

j=table[i]; //从数组中得到需要传输的数据量

i2cout(); //利用I2C总线方式送出数据

}

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12024806.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存