单片机开发和学习

[toc]

单片机吹水

1.学习哪种单片机

51、AVR、MSP430、STM8、STM32、DSP、linux、FPGA

2.学习单片机的最佳办法

  • 鹦鹉学舌
  • 照葫芦画瓢
  • 他山之石,可以攻玉
  • 理论和实践相结合,温故而知新

3.学习单片机的准备工作

  • 要有信心、恒心和耐心
  • 完善的配套流程
  • 计算机一台
  • 51开发板一块

芯片学习

51单片机是对所有兼容Intel8031指令系统的单片机的统称,这一系列的单片机的始祖是Intel的8031单片机,后来随着flash ROM技术的发展,8031单片机取得了长足的进展成为了应用最广泛的8bit单片机之一,他的代表型号就是ATMEL公司的AT89系列。

安装单片机开发环境

安装keil

KEIL C51 软件获取

要在电脑上成功安装 KEIL C51,首先必须要有安装包,我们可以通过万能的百度,搜索关键字“KEIL C51 下载”,上面会有很多下载渠道,也可以在KEIL的官网上下载: https://www.keil.com/download/product/,打开界面如下图所示。

image-20220728220612959

不过我们资料内已经给大家提供了下载好的软件,在资料“\5–开发工具\1-KEILC51 软件”内,直接使用即可,省去了查找下载的时间。我们使用KEIL C51 是 9.01 版本, 如果后面出了更高的版本选择性升级即可,不过也没有必要使用最新的,用习惯了一个软件就行。 使用我们提供下载好的软件包,其内部含有如下图所示文件。

image-20220728220739858

C51V901.exe:是 KEIL C51 软件的安装文件。

keygen_new2032.zip:KEIL C51 破解软件,在 KEIL C51 不破解的情况下只能编译 2K 大小文件,如果工程超过 2K,编译即会报错,因此需要破解。有的电脑系统会误认为该文件是病毒文件,所以这里把它压缩存放。

KEIL C51 软件安装

软件包下载完成之后,我们双击 C51V901.exe 这个应用程序,弹出如下所示对话框。

image-20220728223545240

点击 Next 按钮。 弹出如下对话框。

image-20220728223846155

在红框 2 中勾选上,点击 Next 按钮。弹出如下对话框。

image-20220728224107252

**点击红框 4 选择软件安装的路径,我们这里在 磁盘盘内新建一个文件夹,命名为 KEILC51,将其安装到该文件夹内,方便软件的管理。特别要注意: **

**(1)软件安装保存路径不能出现中文或者特殊字符,否则会出现很多奇怪的错误,到时候很难找问题。 **

(2)不要将 KEIL5 软件和 KEIL4 或者 51 的 KEIL 安装在一个文件夹内。然后点击 Next。弹出如下对话框。

image-20220728225157414

在红色框 6 和 7 中我们随便输入一些东西, 我们这里输入数字11,当然也可以输入空格, 但是一定要输入, 否则红色框 8 就一直是灰色状态,输入完成后点击 Next, 弹出如下对话框。

image-20220728225336184

说明 KEIL C51 软件正在安装,只要等一段时间即可,安装完成以后会出现如下界面。

image-20220728225539980

点击 Finish 按钮完成 KEIL C51 软件的安装过程。KEIL C51 安装完成后在电脑桌面上一般会有一个快捷方式,如下所示:

image-20220728225655136

KEIL C51 软件破解

上一节我们已经安装好了 KEIL C51 编程软件,可以使用它来编译51 单片机一些代码量小于 2K 的工程。但是有时候我们开发的项目可能比较大,程序代码超过了 2K,编译后会报错,因此就需要破解 KEIL C51。下面就来介绍下如何破解。

(1)首先打开 KEIL C51 软件,点击 File/License Management,复制红色框 3 中的 CID。 操作步骤如下:

image-20220728231058888

image-20220728235716845

然后我们打开之前下载的 KEIL C51 软件包,里面还有一个keygen 压缩文件,该压缩文件内含有 keygen_new2032.exe 文件,此文件用于破解。因此需要解压,解压后电脑会误认为该文件为病毒文件,会隔离掉,因此我们需要在弹出病毒隔离窗口时点击找回文件即可。

以管理员模式打开此破解软件 keygen_new2032.exe,将刚才从KEIL C51中复制的 CID 码粘贴到下面红色框 4 中,并且在红色框 5 选择C51,然后点击红色框 6,生成破解码,将此破解码即红色框 7 内容复制到KEIL C51 软件内LIC框中,点击 Add LIC 即可破解,如果破解成功则会显示。操作步骤如下:

image-20220729002023233

image-20220729003425413

如 果 破 解 失 败 , 请 确 认 是 否 使 用 管 理 员 模 式打开KEIL C51 软件和keygen_new2032.exe 破解工具。管理员模式打开方式:选择右键:RunAsAdministrator ,中文系统应该是“以管理员权限运行”,然后就可以正常加licence 了。建议所有用户,都以管理员身份运行,以避免重复破解。至此,我们就将 KEIL C51 软件安装和破解成功。后面就可以使用该软件来编写我们的 51 单片机程序。

实验课程_创建模板

创建文件夹

创建一个名为单片机工程模板的文件夹

image-20230828204727638

创建项目

打开keil,创建项目

image-20230828205007098

然后,选择创建的文件夹,写好文件名

image-20230828205235145

选择Vendor

选择Atmel里面的AT89C52基础数据

image-20230828205501446

image-20230828205701135

然后,掉下面选项

image-20230828205848976

创建main.c代码文本文件

image-20230828210954625

点完后,按ctrl + s,设置文本文件名字为main.c即可

image-20230828211035648

image-20230828211155706

添加main.c到工程文件

image-20230828211557693

image-20230828211659633

image-20230828211714598

其他添加main.c方法

image-20230828212344216

实验课程_设置魔术棒

image-20230828212924815

image-20230828213144515

image-20230828213419473

编译工具栏

image-20230828220302930

  • 第一个是编译当前文件,而且不生成hex
  • 第二个是编译改动的文件,生成hex
  • 第三个是全部文件编译,生产hex

更改字体大小

image-20230828220657738

image-20230828220753881

reg52.h头文件

1
2
#include <reg52.h>   # 直接查C:\Keil\C51\INC里有没有REG52.H
#include "reg52.h" # 先查工程文件夹有没有REG52.H,没有再查C:\Keil\C51\INC

如果在C:\Keil\C51\INC里面没有REG52.H就会报错

image-20230828221740821

实验课程_使用PZ-ISP烧录器

如果我们使用的是STC89C516RD+的处理器,选择带RC的芯片类型,也就是说带RD的就选择带RC的芯片类型,如果不带RD的处理器选择不带RC的芯片类型

image-20230419163408643

实验课程_点亮LED灯

点亮一个LED_D1

LED灯的端口有四组,分别是P0,P1,P2,P3

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
/**************************************************************************************
实验名称:点亮第一个LED
接线说明:
实验现象:下载程序后“LED模块”的D1指示灯点亮
注意事项:
***************************************************************************************/
#include "reg52.h"

sbit LED1=P2^0; //将P2.0管脚定义为LED1

/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
LED1=0; //LED1端口设置为低电平
while(1)
{

}

}

点亮一个LED_D1_闪烁

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <reg52.h>

typedef unsigned int u16; //使用typedef来为用户自定义的数据类型取一个新的名字
sbit LED1 = P2^1;

void delay_10us(u16 ten_us) //当传2入ten_us=1时,大约延时10us
{
while(ten_us--);
}
void main()
{

while(1)
{
LED1 = 0; //点亮
delay_10us(50000);//大约450ms
LED1 = 1; //熄灭
delay_10us(50000);
}
}

点亮一个LED_D1_流水灯

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
/**************************************************************************************
实验名称:LED流水灯实验
接线说明:
实验现象:下载程序后“LED模块”的D1-D8指示左右点亮
注意事项:
***************************************************************************************/
#include "reg52.h"
#include "intrins.h"

typedef unsigned int u16; //对系统默认数据类型进行重定义
typedef unsigned char u8;

#define LED_PORT P2 //使用宏定义P2端口

/*******************************************************************************
* 函 数 名 : delay_10us
* 函数功能 : 延时函数,ten_us=1时,大约延时10us
* 输 入 : ten_us
* 输 出 : 无
*******************************************************************************/
void delay_10us(u16 ten_us)
{
while(ten_us--);
}

/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
u8 i=0;

LED_PORT=~0x01;
delay_10us(50000);
while(1)
{
//方法1:使用移位+循环实现流水灯
// for(i=0;i<8;i++)
// {
// LED_PORT=~(0x01<<i); //将1右移i位,然后取反将结果赋值到LED_PORT
// delay_10us(50000);
// }

//方法2:使用循环+_crol_或_cror_函数实现流水灯
for(i=0;i<7;i++) //将led左移一位
{
LED_PORT=_crol_(LED_PORT,1);
delay_10us(50000);
}
for(i=0;i<7;i++) //将led右移一位
{
LED_PORT=_cror_(LED_PORT,1);
delay_10us(50000);
}
}
}

点亮一个LED_D1库函数实现_流水灯

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
/**************************************************************************************
实验名称:LED流水灯实验
接线说明:
实验现象:下载程序后“LED模块”的D1-D8指示左右点亮
注意事项:
***************************************************************************************/
#include "reg52.h"
#include "intrins.h"

typedef unsigned int u16; //对系统默认数据类型进行重定义
typedef unsigned char u8;

#define LED_PORT P2 //使用宏定义P2端口

/*******************************************************************************
* 函 数 名 : delay_10us
* 函数功能 : 延时函数,ten_us=1时,大约延时10us
* 输 入 : ten_us
* 输 出 : 无
*******************************************************************************/
void delay_10us(u16 ten_us)
{
while(ten_us--);
}

/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
u8 i=0;

LED_PORT=~0x01;
delay_10us(50000);
while(1)
{
//方法1:使用移位+循环实现流水灯
// for(i=0;i<8;i++)
// {
// LED_PORT=~(0x01<<i); //将1右移i位,然后取反将结果赋值到LED_PORT
// delay_10us(50000);
// }

//方法2:使用循环+_crol_或_cror_函数实现流水灯
for(i=0;i<7;i++) //将led左移一位
{
LED_PORT=_crol_(LED_PORT,1);
delay_10us(50000);
}
for(i=0;i<7;i++) //将led右移一位
{
LED_PORT=_cror_(LED_PORT,1);
delay_10us(50000);
}
}
}

实验课程_蜂鸣器之无源蜂鸣器

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
42
43
44
45
/**************************************************************************************
实验名称:蜂鸣器实验
接线说明:
实验现象:下载程序后蜂鸣器发出声音,一段时间后关闭
注意事项:
***************************************************************************************/
#include "reg52.h"

typedef unsigned int u16; //对系统默认数据类型进行重定义
typedef unsigned char u8;

sbit BEEP=P2^5; //将P2.5管脚定义为BEEP

/*******************************************************************************
* 函 数 名 : delay_10us
* 函数功能 : 延时函数,ten_us=1时,大约延时10us
* 输 入 : ten_us
* 输 出 : 无
*******************************************************************************/
void delay_10us(u16 ten_us)
{
while(ten_us--);
}

/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
u16 i=2000;

while(1)
{
while(i--)//循环2000次
{
BEEP=!BEEP;//产生一定频率的脉冲信号
delay_10us(100);
}
i=0;//清零
BEEP=0;//关闭蜂鸣器
}
}

实验课程_静态数码管

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
/**************************************************************************************
实验名称:静态数码管实验
接线说明:
实验现象:下载程序后“静态数码管模块”显示数字0
注意事项:
***************************************************************************************/
#include "reg52.h"

typedef unsigned int u16; //对系统默认数据类型进行重定义
typedef unsigned char u8;

#define SMG_A_DP_PORT P0 //使用宏定义数码管段码口

//共阴极数码管显示0~F的段码数据
u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
SMG_A_DP_PORT=~gsmg_code[0];//将数组第1个数据赋值给数码管段选口
while(1)
{

}
}