Linux下C51开发1:蜂鸣器

系列文章索引:Linux下C51开发系列教程索引

前言

单片机入门,我们从最简单的蜂鸣器开始。蜂鸣器如果一直加电就会长鸣,如果按照一定方式加电会类似于播放音乐。

开发

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <reg51.h> //包含单片机寄存器的头文件

sbit sound = P3 ^ 7; //将sound位定义为P3.7
/****************************************
函数功能:延时形成1600Hz音频
****************************************/
void delay1600(void) {
unsigned char n;
for (n = 0; n < 100; n++)
;
}
/****************************************
函数功能:延时形成800Hz音频
****************************************/
void delay800(void) {
unsigned char n;
for (n = 0; n < 200; n++)
;
}

/****************************************
函数功能:主函数
****************************************/
void main(void) {
unsigned int i;
while (1) {
for (i = 0; i < 830; i++) {
sound = 0; // P3.7输出低电平
delay1600();
sound = 1; // P3.7输出高电平
delay1600();
}
for (i = 0; i < 200; i++) {
sound = 0; // P3.7输出低电平
delay800();
sound = 1; // P3.7输出高电平
delay800();
}
}
}

编译

1
make test

编译结果

共计三种错误。

第一二行错误表示reg51.h在Linux平台上已经过时了,我们采用8051.h。
所以将

1
#include <reg51.h>

修改为

1
#include "/usr/share/sdcc/include/mcs51/8051.h"

第三行错误表示,Linux下标识符不能这样定义。
我们从sdcc的头文件中查看相关代码,
代码位置是

1
/usr/share/sdcc/include/mcs51/8051.h

我们可以看到

1
sbit sound=P3^7;

修改为

1
#define sound P3_7

也就是说Linux下与Windows下的开发以及定义有一定区别。

完整的正确代码是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include "/usr/share/sdcc/include/mcs51/8051.h" //包含单片机寄存器的头文件

#define sound P3_7 //将sound位定义为P3.7

/****************************************
函数功能:延时形成1600Hz音频
****************************************/
void delay1600(void) {
unsigned char n;
for (n = 0; n < 100; n++)
;
}
/****************************************
函数功能:延时形成800Hz音频
****************************************/
void delay800(void) {
unsigned char n;
for (n = 0; n < 200; n++)
;
}

/****************************************
函数功能:主函数
****************************************/
void main(void) {
unsigned int i;
while (1) {
for (i = 0; i < 830; i++) {
sound = 0; // P3.7输出低电平
delay1600();
sound = 1; // P3.7输出高电平
delay1600();
}
for (i = 0; i < 200; i++) {
sound = 0; // P3.7输出低电平
delay800();
sound = 1; // P3.7输出高电平
delay800();
}
}
}

编译结果为:

编译的结果文件:

格式转换

将ihx文件转换为hex格式文件

1
packihx 1.ihx > 1.hex

写入设备

使用stcflash工具(需要python-pyserial),原本想用Qt/C++自己写一个,后来发现技术有限,还是熟悉了再说。
Manjaro下直接安装

1
pacman -S stcflash

写入设备

1
stcflash 1.hex

运行结果

按照下图进行接线:

beep

蜂鸣器测试

蜂鸣器测试-B站

至此,Linux下单片机开发有一个良好的开始。

参考文档

[1]https://blog.csdn.net/thinkerleo1997/article/details/53145972