首页 / 更多教程 / 520了,用32做个简单的小程序
520了,用32做个简单的小程序
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了520了,用32做个简单的小程序,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含7089字,纯文字阅读大概需要11分钟。
内容图文
![520了,用32做个简单的小程序](/upload/InfoBanner/zyjiaocheng/621/20db883da6d54e7a802d0c7ecdf7babf.jpg)
520到了,看着朋友圈里的花式秀恩爱,平常午餐最爱吃的泡面都变得不那么香了。于是!突发奇想,突然就来了更新的想法,今天用32来做一个非常简单的小程序:
简单放个歌,再放个图
stm32f103c8t6
因为基本只用到两个外设,程序容量也很小,所以用c8t6就刚刚好无源蜂鸣器
这里要用的是无源蜂鸣器,其音调是可调的。库函数
我们先声明要用到的引脚以及相应的函数: #define beegpio gpio自选 #define bee gpio_pin_自选 void bee_init(void); //蜂鸣器初始化 void bee_test(void); //蜂鸣器测试 void play_music(void);//播放音乐void bee_init(void)
这个也非常好理解,和初始化引脚是一样的 。 void bee_init(void){ gpio_inittypedef gpio_initstructure; gpio_initstructure.gpio_pin = bee; gpio_initstructure.gpio_mode = gpio_mode_out_pp; //推挽输出 gpio_initstructure.gpio_speed = gpio_speed_50mhz; gpio_init(beegpio, &gpio_initstructure); gpio_writebit(beegpio,bee,(bitaction)(1)); }void bee_test(void)
在主函数演奏之前,我们先测试一下蜂鸣器好不好使,让它先响一声: void bee_test(void){ u16 i; for(i=0;i<200;i++){ gpio_writebit(beegpio,bee,(bitaction)(0)); delay_us(500); gpio_writebit(beegpio,bee,(bitaction)(1)); delay_us(500); } } 为了给下文的演奏做铺垫,发出声响的原理现在要着重强调一下: (delay函数是已经写好的,有us、ms、s等等单位,这里用的是us) 在这个for循环里,先后两次的delay_us(500)加在一起构成了一个周期,这个周期的时间长是1000us,也就是1ms。在这1ms的时间里,一半的时间蜂鸣器不响,另一半的时间响,如此重复200次,就成为了我们人类耳朵听到的一个时间约为200ms的响声。乐谱(简谱)
以一个非常简单的粉刷匠为例:(希望我没有记错谱子哈哈哈)- c调中音12345对应的声音频率分别是:523、587、659、698、784hz。所以我们就可以把简谱中的数字依次替换(c调其他音对应频率见文末注脚1)
- 每个音都是要持续一定时间的,以ms为单位,比如“2432”的声音要保持一致,而“5-”要持续略长的时间
以“2432|5-”为例,我们把音调与对应的时间 两两一组,放到一个数组里:
uc16 m_24325[10]={//奇数项为频率,偶数项为持续时间(ms)
587,300,
698,300,
659,300,
587,300,
784,750,
};
我在测试的时候发现如果严格按照音调对应频率的话,听起来反而与想象中的音乐差了不少(难道是蜂鸣器的事?)所以稍微改了一下频率。
void play_music(void)
void play_music(void){ u16 i,j; for(i=0;i<5;i++){ for(j=0;j<m_24325[i*2]*m_24325[i*2+1]/1000;j++){ gpio_writebit(beegpio,bee,(bitaction)(0)); delay_us(500000/m_24325[i*2]); gpio_writebit(beegpio,bee,(bitaction)(1)); delay_us(500000/m_24325[i*2]); } } } 因为在前文的乐谱中,记了10个数据,5对音调与时间,所以令i=0;i<5在第二个for循环中,先后两次delay_us(500000/music1[i*2]),使得周期变为1000 000/频率而 joled模块(7脚64*128)
买到oled模块以后,商家往往都会附赠配套程序的,不过往往都会赠iic的程序。这里把我以前用的spi程序放上。模拟spi
.h
#define oled_cmd 0 #define oled_data 1 #define oled_clk paout(4) #define oled_mosi paout(3) #define oled_rst paout(2) #define oled_dc paout(1) void oled_spi_init(void); void spi_writebyte(uint8_t addr,uint8_t data); void writecmd(unsigned char cmd); void writedata(unsigned char data);.c
void oled_spi_init(void) { gpio_inittypedef gpio_initstructure; rcc_apb2periphclockcmd(rcc_apb2periph_gpioa ,enable); gpio_initstructure.gpio_pin=gpio_pin_1|gpio_pin_2|gpio_pin_3|gpio_pin_4; gpio_initstructure.gpio_mode=gpio_mode_out_pp; gpio_initstructure.gpio_speed=gpio_speed_50mhz; gpio_init(gpioa,&gpio_initstructure); } void spi_writebyte(unsigned char data,unsigned char cmd) { unsigned char i=0; oled_dc =cmd; oled_clk=0; for(i=0;i<8;i++) { oled_clk=0; if(data&0x80)oled_mosi=1; else oled_mosi=0; oled_clk=1; data<<=1; } oled_clk=1; oled_dc=1; } void writecmd(unsigned char cmd) { spi_writebyte(cmd,oled_cmd); } void writedata(unsigned char data) { spi_writebyte(data,oled_data); }oled
.h
void oled_init(void); void oled_on(void); void oled_off(void); void oled_refresh_gram(void); void oled_clear(void);.c
u8 oled_gram[128][8]; void oled_dly_ms(unsigned int ms) { unsigned int a; while(ms) { a=1335; while(a--); ms--; } } void oled_init(void) { oled_spi_init(); oled_clk = 1; oled_rst = 0; oled_dly_ms(100); oled_rst = 1; writecmd(0xae); writecmd(0x00); writecmd(0x10); writecmd(0xd5); writecmd(0x80); writecmd(0xa8); writecmd(0x3f); writecmd(0xd3); writecmd(0x00); writecmd(0xb0); writecmd(0x40); writecmd(0x8d); writecmd(0x14); writecmd(0xa1); writecmd(0xc8); writecmd(0xda); writecmd(0x12); writecmd(0x81); writecmd(0xff); writecmd(0xd9); writecmd(0xf1); writecmd(0xdb); writecmd(0x30); writecmd(0x20); writecmd(0x00); writecmd(0xa4); writecmd(0xa6); writecmd(0xaf); oled_clear(); } void oled_refresh_gram(void) { u8 i,n; for(i=0;i<8;i++) { writecmd(0xb0+i); writecmd(0x00); writecmd(0x10); for(n=0;n<128;n++)writedata(oled_gram[n][i]); } } void oled_clear(void) { u8 j,t; for(t=0xb0;t<0xb8;t++){ writecmd(t); writecmd(0x10); writecmd(0x00); for(j=0;j<132;j++){ writedata(0x11); } } }显示16*16的字符
这个是仿照商家的iic例程改成spi的写法,其实驱动oled的方法都是一样的,只不过iic和spi略有不同而已(3个输入参数会在稍后讲到) void oled_display_16x16(u8 x,u8 y, u16 w){ u8 j,t,c=0; y=y-14; for(t=0;t<2;t++){ writecmd(0xb0+x); writecmd(y/16+0x10); writecmd(y%16); for(j=0;j<16;j++){ writedata(m_16[(w*32)+c]); c++;}x++; } writecmd(0xaf); } 第一个参数x:字符的行:0、2、4、6共4行(4*16=64,把64个像素分为4行)第二个参数y:字符的列:共128列(像素),但是因为字符是16*16的,所以用n * 16代替,便于计算第三个参数w:对应库中的第几个字符库:m_16(在倒数第5行),这个内容马上就讲到 比如:oled_display_16x16(4,8*16,8),在oled屏幕第3行的第8列,显示库中的第9个字符字符/图片库,取模
这个库是需要咱们自己建立的,可以由取模软件自动生成每个字符对应的16进制数据。 我们用到的取模软件是:pctolcd2002 配置如图: 用它生成数据以后就可以把数据放到一个单独的.h文件中,作为我们自己的字符库。这里以两个16*16的空白为例 uc8 m_16[] = { //" " 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //" " 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, };这个软件还是很好用的,而且像素也可以自定,比如用64 * 128的图片铺满oled等等。详见生日快乐(b站投稿)。这里用的就是杜洋老师的开发板,我最初学32的时候就是学习杜洋老师的教程,虽然后来我又学了野火的32,正点原子的linux…(我很专一的/doge)
跑题了,这里只是举了一个16 * 16字符的例子,还有8 * 16字符、字符串、64 * 128图片等等,就请各位自己研究了/doge
我是康,希望做一名能帮助到各位的博主! 我不是本来要更机器学习的嘛? 在做了在做了(0%)预计下周会发布,欢迎感兴趣的小伙伴与我共同学习,一起进步!
C调低音 | 频率(Hz) | C调中音 | 频率(Hz) | C调高音 | 频率(Hz) |
---|---|---|---|---|---|
1 | 262 | 1 | 523 | 1 | 1046 |
1# | 277 | 1# | 554 | 1# | 1109 |
2 | 294 | 2 | 587 | 2 | 1175 |
2# | 311 | 2# | 622 | 2# | 1245 |
3 | 330 | 3 | 659 | 3 | 1318 |
4 | 349 | 4 | 698 | 4 | 1397 |
4# | 370 | 4# | 740 | 4# | 1480 |
5 | 392 | 5 | 784 | 5 | 1568 |
5# | 415 | 5# | 831 | 5# | 1661 |
6 | 440 | 6 | 880 | 6 | 1760 |
6# | 466 | 6# | 932 | 6# | 1865 |
7 | 494 | 7 | 988 | 7 | 1976 |
内容总结
以上是互联网集市为您收集整理的520了,用32做个简单的小程序全部内容,希望文章能够帮你解决520了,用32做个简单的小程序所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。