2018-12-14 09:50:35 qq_36622903 阅读数 8203
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3408 人正在学习 去看看 朱有鹏

单片机封装格式

单片机封装格式为LQFP44,封装图如下图所示:

 

       使用LQFP44封装形式的STC15W4K56S4单片机共有44个引脚,除14号引脚接电源,16号引脚接地外,默认情况下其余所有引脚都是I / O(INOUT / OUTPUT)口。

各引脚功能说明如下:

P0口:

引脚

引脚编号

可复用作功能

说明

P0.0

40

AD0

地址/数据总线

RXD3

串口3数据接收端

P0.1

41

AD1

地址/数据总线

TXD3

串口3数据发送端

P0.2

42

AD2

地址/数据总线

RXD4

串口4数据接收端

P0.3

43

AD3

地址/数据总线

TxD4

串口4数据发送端

P0.4

44

AD4

地址/数据总线

T3CLKO

定时器/计数器3的时钟输出

P0.5

1

AD5

地址/数据总线

PWMTLT_2

PWM异常停机控制引脚

T3

定时器/计数器3的外部输入

P0.6

2

AD6

地址/数据总线

PWM7_2

脉宽调制输出通道7

T4CLKO

定时器/计数器4的时钟输出

P0.7

3

AD7

地址/数据总线

PWM6_2

脉宽调制输出通道6

T4

定时器/计数器4的外部输入

 

 

 

 

 

 

 

 

 

 

 


                                                                                                                                   

 

 

 

 

 

引脚

引脚编号

复用功能

说明

P1.0

4

ADC0

8通道模/数转换器ADC输入口

CCP1

捕获/脉冲输出/脉宽调制通道1

RXD2

串口2数据接收端

P1.1

ADC1

8通道模/数转换器ADC输入口

CCP0

捕获/脉冲输出/脉宽调制通道0

TXD2

串口2数据发送端

P1.2

7

ADC2

8通道模/数转换器ADC输入口

SS

单片机用作SPI从机时的从机片选输入控制端

ECI

可编程计数阵列定时器的外部时钟输入

CMP0

比较器的比较结果输出端

P1.3

8

ADC3

8通道模/数转换器ADC输入口

MOSI

SPI主机输出,从机输入

P1.4

9

ADC4

8通道模/数转换器ADC输入口

味噌

SPI主机输入,从机输出

P1.5

10

ADC5

8通道模/数转换器ADC输入口

SCLK

SPI主机时钟输出或从机时钟输入

P1.6

11

ADC6

8通道模/数转换器ADC输入口

RxD_3

串口1接收端备用切换引脚

XTAL2

外部晶振输入端口

SysClkO_2

主时钟输出备用切换引脚

PWM6

脉宽调制输出通道6

P1.7

12

ADC7

8通道模/数转换器ADC输入口

TxD_3

串口1发送端备用切换引脚

XTAL1

外部晶振输入端口

PWM7

脉宽调制输出通道7

引脚

引脚编号

可复用作功能

说明

P2.0

三十

A8

地址总线

RSTOUT_LOW

通过程序下载软件设置上电复位后输出为高电平还是低电平

P2.1

31

A9

地址总线

SCLK_2

SPI时钟备用切换引脚

PWM3

脉宽调制输出通道3

P2.2

32

A10

地址总线

MISO_2

SPI主机输入,从机输出备用切换引脚

PWM4

脉宽调制输出通道4

P2.3

33

A11

地址总线

MOSI_2

SPI主机输出,从机输入备用切换引脚

PWM5

脉宽调制输出通道5

P2.4

34

A12

地址总线

ECI_3

可编程计数阵列定时器的外部时钟输入备用切换引脚

SS_2

SPI从机时的从机片选

PWMFLT

PWM异常停机控制引脚

P2.5

35

A13

地址总线

CCP0_3

捕获/脉冲输出/脉宽调制通道0备用切换引脚

P2.6

36

A14

地址总线

CCP1_3

捕获/脉冲输出/脉宽调制通道1备用切换引脚

P2.7

37

A15

地址总线

PWM2_2

脉宽调制输出通道二

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

引脚

引编号

可复用作功能

说明

P3.0

18

的的的的RxD

串口1数据接收端

外部中断4,只能执行下降沿中断

T2CLKO

T2时钟输出

P3.1

19

的的的TxD

串口1数据发送端

T2

定时器/计数器T2外部计数脉冲输入

P3.2

20

INT0

外部中断0,上升沿,下降沿中断均可执行

P3.3

21

INT1

外部中断1,上升沿,下降沿中断均可执行

P3.4

22

T0

定时器/计数器T0外部计数脉冲输入

T1CLKO

T1时钟输出

ECI_2

可编程计数阵列定时器的外部时钟输入备用切换引脚

P3.5

23

T1

定时器/计数器T1外部计数脉冲输入

T0CLKO

T0时钟输出

CCP0_2

捕获/脉冲输出/脉宽调制通道0备用切换引脚

P3.6

24

外部中断2,只能执行下降沿中断

RxD_2

串口1数据接收端备用切换引脚

CCP1_2

捕获/脉冲输出/脉宽调制通道1备用切换引脚

P3.7

25

外部中断3,只能执行下降沿中断

TxD_2

串口1数据发送端备用切换引脚

PWM2

脉宽调制输出通道2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

引脚

引脚编号

可复用作功能

说明

P4.0

17

MOSI_3

SPI主机输出,从机输入备用切换引脚

P4.1

26

MISO_3

SPI主机输入,从机输出备用切换引脚

P4.2

27

扩展外部数据存储器时的写控制端

PWM5_2

脉宽调制输出通道5

P4.3

28

SCLK_3

SPI时钟备用切换引脚

P4.4

29

扩展外部数据存储器时的读控制端

PWM4_2

脉宽调制输出通道4

P4.5

38

ALE

扩展外部数据存储器时利用此引脚锁存低8位地址

PWM3_2

脉宽调制输出通道3

P4.6

39

RxD2_2

串口2数据接收端备用切换引脚

P4.7

6

TxD2_2

串口2数据发送端备用切换引脚

 

 

 

 

 

 

 

 

 

 

 

 

 

引脚

引脚编号

可复用作功能

说明

P5.4

13

RST

外部复位引脚

SysClkO

可编程主时钟输出

SS_3

SPI作从机,从机片选输入端备用切换引脚

CMP-

比较器负极输入端

P5.5

15

CMP +

比较器正极输入端

VCC

14

接电源

GND

16

接地

 

2017-09-22 15:47:00 weixin_34128411 阅读数 82
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3408 人正在学习 去看看 朱有鹏

以下包含:三个文件,main.c、gpoi.c、gpio.h

 1 /*
 2 *主函数
 3 */
 4 
 5 #include <reg52.h>
 6 #include <gpio.h>
 7 
 8 void main()
 9     
10 {
11   P2 = 0;
12     setBit(GPIO_2,3);//GPIO_2意思是选择P2端口,3意思是选择P2.3这个位
13     while(1);
14 }

 

 

 1 /*
 2 *gpio.c文件
 3 */
 4 
 5 
 6 #include <GPIO.h>
 7 #include <reg52.h>
 8 
 9 void setBit(unsigned char gpio,unsigned char pin)
10 {
11         unsigned char i = 1;//0000 0001
12       i = i<<pin;//做移运算,pin对应的位为1,其他为0
13     switch(gpio)//选择P0 P1 P2 P3
14     {
15         case 0:
16             P0 |=i;
17         break;
18         case 1:
19             P1 |=i;
20         break;
21         case 2:
22             P2 |=i;
23         break;
24         case 3:
25             P3 |=i;
26         break;
27         
28     }
29 }
30 void resetBit(unsigned char gpio,unsigned char pin)
31 {
32 unsigned char i = 1;                                                                                                    //0000 0001
33     i = i<<pin;//做移运算,pin对应的位为1,其他为0    假如:pin输入3          0000 0100
34     i = ~i;//取反                                                                                                                    1111 1011
35     switch(gpio)
36     {
37         case 0:
38             P0 &=i;//按位与运算 有两个1才是1   1111 1011  所以第三为肯定为0,输出低电平
39         break;
40         case 1:
41             P1 &=i;
42         break;
43         case 2:
44             P2 &=i;
45         break;
46         case 3:
47             P3 &=i;
48         break;
49         
50     }
51 }

 

 1 /*
 2 *gpio.h文件 
 3 */
 4 
 5 #ifndef _GPIO_H_
 6 #define _GPIO_H_
 7 //枚举  0 1 2 3 表示P0 P2 P3 P4
 8 enum gpio{
 9     GPIO_0 = 0,GPIO_1 = 1,
10     GPIO_2 = 2,GPIO_3 = 3
11     };
12 /*
13     *把某个引脚设置为高电平
14     *@param gpio:枚举常量gpio
15     *@param pin:各IO寄存器对应的引脚有序号
16     */
17 
18 void etBit(
19     unsigned char gpio,
20     unsigned char pin);
21         
22     void resetBit(
23         unsigned char gpio,
24     unsigned char pin);
25     #endif

 

转载于:https://www.cnblogs.com/kinson/p/7575285.html

2019-07-19 11:59:04 qq_36369267 阅读数 253
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3408 人正在学习 去看看 朱有鹏

初衷:

学单片机时由于实验室单片机和自己买的单片机封装的电路不同下课了就没法调试了,实验课时有限,如果只靠在实验室学习感觉学习时间很紧,于是接触了Proteus来仿真实验,感觉很好用,但也花了很多时间去探索,所以想在这里大概介绍一下基本入门操作和一些坑,方便刚开始接触的小伙伴学习,更深的操作就靠大家自己找资料或者自己探索了。

 

在正式开始之前,先给大家介绍Keil的一个工具,能去掉每次提示的2K提醒,下载地址:

链接:https://pan.baidu.com/s/1_Y6j3blNOIbpqWLV7ENDiA 
提取码:zvqp 

右键keil图标以管理员身份运行,从file>>license management里复制CID到工具软件里,generate后复制得到的串码到new license ID code里点击添加后就OK了

下面正式开始:

一、下载Proteus

链接:https://pan.baidu.com/s/1yeeiTJhbq_jZGR-pKdMbsA 
提取码:6fjb 

解压缩后按照里面PDF文件的步骤安装,在此不再赘述。

二、Keil准备工作

因为要用到Keil,所以先讲一下Keil要做的准备工作(程序修改在Keil里,这里讲如何使用编译程序得到文件):

1)点击如图所示图标进行设置

 

 

2)在弹出的对话框中勾选创建16进制文件选项

记住得到的16进制文件所在位置(就在当前工程目录下)到时候调试proteus时会用到,到这里Keil的准备工作基本结束了,调试程序啥的就不讲了,如果有时间我再写写。

三、Proteus操作

1)创建工程

点击文件>>新建工程,自己选择工程位置和工程名(建议英文名),全部选择默认选项直到创建工程成功,得到一个空白工程

2)点击如图所示图标,搜索89c51,选择第一项,然后点击右下角确定按钮

3)点击鼠标左键,将51单片机芯片放到合适的位置,可以通过滚动滚轮调整视觉至合适大小。

4)选择元器件并连接电路,这里以我做的计时器为例(用八个LED小灯实现,高两位是分钟数,低六位是秒数,最大到3分59秒后置零重新开始计时,P3.5连接一个开关,用于暂停和继续计时)介绍一下常用的元器件怎么选择:

接地、高电平、信号源、示波器等直接在最左侧模型工具选择栏进行选择:

示波器:

注:1.如果不小心点击了关闭下次调试弹不出来,只需要点击调试>>恢复弹出窗口即可在下次调试恢复。

2.点击示波器弹出的窗口右键图形选择print>>print to PDF即可打印出图形信息,就像我所写的示例这样:

信号源:

电源、接地:

其他元器件(如LED灯、开关等)点击图中的“P”图标(pick的意思),进入搜索对应的元器件,如搜索led,switch等,本文最后附有元器件库:

 

 

连接电路:

点击引脚连接电路,如果要拐弯可以左键点击一下再转。右键元器件可以对元器件进行旋转等操作,双击对元器件属性进行设置。选择好元器件并连接好电路如图:

双击51单片机,设置晶振频率和程序,程序就是选择keil准备工作生成的HEX文件。

然后点击左下角的调试按钮(依次是运行、单步运行、 暂停、 停止)即可进行仿真:

注:如果要改程序之类的一定要关闭调试,不然Proteus调试运行太久会自动崩溃闪退

我所写程序运行的样子:

代码详见:https://blog.csdn.net/qq_36369267/article/details/95859196

附:        Proteus 元件库

Proteus中常用的元器件被分成了25大类,为了方便快速地查找到相应器件,在Pick Devices(拾取元器件)对话框中,你应该首先选中相应的大类,然后使用关键词进行搜寻。

Proteus的这25大类元器件分别为:

Analog ICs  模拟IC

CMOS 4000 series   CMOS 4000系列

Data Converters  数据转换器

Diodes  二极管

Electromechanical  机电设备(只有电机模型)

Inductors电感

Laplace Primitives   Laplace变换器

Memory ICs存储器IC

Microprocessor ICs    微处理器IC

Miscellaneous杂类(只有电灯和光敏电阻组成的设备)

Modelling Primitives模型基元

Operational Amplifiers运算放大器

Optoelectronics  光电子器件

Resistors电阻

Simulator Primitives  仿真基元

Switches & Relays  开关和继电器

Transistors三极管

TTL 74、74ALS、74AS、74F、74HC、74HCT、74LS、74S series 74系列集成电路

除此之外,你还应熟悉常用器件的英文名称,为您列举如下:

AND与门
ANTENNA天线
BATTERY直流电源(电池)
BELL铃,钟
BRIDEG 1整流桥(二极管)
BRIDEG 2整流桥(集成块)
BUFFER   缓冲器
BUZZER   蜂鸣器

 

CAP       电容
CAPACITOR电容
CAPACITOR POL      有极性电容
CAPVAR             可调电容
CIRCUIT BREAKER    熔断丝
COAX               同轴电缆
CON                插口
CRYSTAL            晶振
DB                 并行插口
DIODE               二极管
DIODE SCHOTTKY     稳压二极管
DIODE VARACTOR     变容二极管
DPY_3-SEG           3段LED
DPY_7-SEG           7段LED
DPY_7-SEG_DP        7段LED(带小数点)
ELECTRO            电解电容
FUSE               熔断器
INDUCTOR            电感
INDUCTOR IRON      带铁芯电感
INDUCTOR3          可调电感
JFET N              N沟道场效应管
JFET P              P沟道场效应管
LAMP               灯泡
LAMP NEDN          起辉器
LED                发光二极管
METER              仪表
MICROPHONE         麦克风
MOSFET              MOS管
MOTOR AC           交流电机
MOTOR SERVO        伺服电机
NAND               与非门
NOR                或非门
NOT                非门
NPN                 NPN三极管
NPN-PHOTO          感光三极管
OPAMP              运放
OR                 或门
PHOTO              感光二极管
PNP                 PNP三极管
NPN DAR             NPN三极管
PNP DAR            PNP三极管
POT               滑线变阻器
PELAY-DPDT        双刀双掷继电器
RES1.2            电阻
RES3.4            可变电阻

POT-LIN              滑动变阻器
BRIDGE            桥式电阻
RESPACK           电阻排
SCR                晶闸管
PLUG              插头
PLUG AC FEMALE     三相交流插头
SOCKET            插座
SOURCE CURRENT    电流源
SOURCE VOLTAGE     电压源
SPEAKER            扬声器
SW                 开关
SW-DPDY             双刀双掷开关
SW-SPST            单刀单掷开关
SW-PB             按钮
THERMISTOR        电热调节器
TRANS1            变压器
TRANS2            可调变压器
TRIAC             三端双向可控硅
TRIODE            三极真空管
VARISTOR          变阻器
ZENER             齐纳二极管

Proteus常用元件中英文对照表 元件名称 中文名 说明

7407 驱动门

1N914 二极管

74Ls00 与非门

74LS04 非门

74LS08 与门

74LS390 TTL 双十进制计数器

7SEG 4针BCD-LED 输出从0-9 对应于4根线的BCD码

7SEG 3-8译码器电路BCD-7SEG转换电路

ALTERNATOR 交流发电机

AMMETER-MILLI mA安培计

AND 与门

BATTERY 电池/电池组

BUS 总线

CAP 电容

CAPACITOR 电容器

CLOCK 时钟信号源

CRYSTAL 晶振

D-FLIPFLOP D触发器

FUSE 保险丝

GROUND 地

LAMP 灯

LED-RED 红色发光二极管

LM016L 2行16列液晶 可显示2行16列英文字符,有8位数据总线D0-D7,RS,R/W,EN三个控制端口(共14线),工作电压为5V。没背光,和常用的1602B功能和引脚一样(除了调背光的二个线脚)

LOGIC ANALYSER 逻辑分析器

LOGICPROBE 逻辑探针

LOGICPROBE[BIG] 逻辑探针 用来显示连接位置的逻辑状态

LOGICSTATE 逻辑状态 用鼠标点击,可改变该方框连接位置的逻辑状态

LOGICTOGGLE 逻辑触发

MASTERSWITCH 按钮 手动闭合,立即自动打开

MOTOR 马达

OR 或门

POT-LIN 三引线可变电阻器

POWER 电源

RES 电阻

RESISTOR 电阻器

SWITCH 按钮 手动按一下一个状态

SWITCH-SPDT 二选通一按钮

VOLTMETER 伏特计

VOLTMETER-MILLI mV伏特计

VTERM 串行口终端

Electromechanical 电机

Inductors 变压器

Laplace Primitives 拉普拉斯变换

Memory Ics  

Microprocessor Ics  

Miscellaneous 各种器件 AERIAL-天线;ATAHDD;ATMEGA64;BATTERY;CELL;CRYSTAL-晶振;FUSE;METER-仪表;

Modelling Primitives 各种仿真器件 是典型的基本元器模拟,不表示具体型号,只用于仿真,没有PCB

Optoelectronics 各种发光器件 发光二极管,LED,液晶等等

PLDs & FPGAs  

Resistors 各种电阻

Simulator Primitives 常用的器件

Speakers & Sounders

Switches & Relays 开关,继电器,键盘

Switching Devices 晶阊管

Transistors 晶体管(三极管,场效应管)

TTL 74 series  

TTL 74ALS series  

TTL 74AS series  

TTL 74F series  

TTL 74HC series  

TTL 74HCT series  

TTL 74LS series  

TTL 74S series  

Analog Ics 模拟电路集成芯片

Capacitors 电容集合

CMOS 4000 series  

Connectors 排座,排插

Data Converters ADC,DAC

Debugging Tools 调试工具

ECL 10000 Series

Device.lib           包括电阻、电容、二极管、三极管和PCB的连接器符号

ACTIVE.LIB       包括虚拟仪器和有源器件

DIODE.LIB         包括二极管和整流桥

DISPLAY.LIB       包括LCD、LED

BIPOLAR.LIB       包括三极管

FET.LIB           包括场效应管

ASIMMDLS.LIB     包括模拟元器件

VALVES .LIB       包括电子管

ANALOG.LIB       包括电源调节器、运放和数据采样IC

CAPACITORS.LIB   包括电容

COMS.LIB           包括 4000系列

ECL.LIB             包括ECL10000系列

MICRO.LIB           包括 通用微处理器

OPAMP.LIB         包括 运算放大器

RESISTORS.LIB     包括 电阻

FAIRCHLD .LIB     包括FAIRCHLD 半导体公司的分立器件

LINTEC.LIB           包括 LINTEC公司的运算放大器

NATDAC.LIB         包括 国家半导体公司的数字采样器件

NATOA.LIB           包括 国家半导体公司 的运算放大器

TECOOR.LIB         包括TECOOR公司的 SCR 和TRIAC

TEXOAC.LIB         包括 德州仪器公司的运算放大器和比较器

ZETEX .LIB           包括ZETEX 公司的分立器件

2019-06-28 12:32:05 weixin_40402375 阅读数 50
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3408 人正在学习 去看看 朱有鹏

零、前言

  面对浩瀚如海的各式单片机型号,曾经作为新手的我也是瑟瑟发抖的,随着经验的累积我也逐渐总结了一些规律,今天就分享给大家。

一、双列直插DIP

  顾名思义,DIP(双列直插)就是两排引脚(双列)可以直接插到电路上使用(直插),一般在后面还会跟一个数字比如“DIP40”表示一共有40个引脚。DIP的特点就是可以反复插拔使用(学习板上还会配上插座),不过相对其他封装制式其体积较大,一般用于实验、学习、手工焊接、需要反复插拔重复使用等场景。

二、贴片PLCC与TQFP

  PLCC与TQFP两种封装格式都是用于PCB贴片的封装,体积较DIP小很多,大部分都是正正方方的。二者的主要区别在于PLCC的引脚向内折叠(左图),TQFP引脚是向外折叠的(右图)。相对来讲PLCC便于重复利用(也可以配插座),TQFP更适合批量化生产。

三、DIP的小型化:SOP、TSOP

  SOP与DIP封装有点像,都是两排引脚,但SOP较DIP小很多,而且引脚也是向外折叠便于工业生产。TSOP是较SOP更小型化、更扁平化的封装。下图中左侧是SOP、右侧是TSOP。

 

四、超大规模封装PQFP

  前面说使用TQFP封装引脚向外折叠便于自动化生产,但TQFP一般只有数十个引脚,一些芯片可能有上百个引脚,此时使用的封装格式就叫PQFP(与TQFP类似引脚都是向外折叠的)。

五、更小、更薄、更强大的BGA

  BGA封装将引脚放到了芯片底部,其优点除了体积更小、更薄,散热性能也更为优秀,但一般用于超大规模集成电路。

 

  与BGA类似的还有LGA、PGA,原理类似只是底部引脚不太一样。BGA是球状引脚、LGA是片状引脚、PGA是针型引脚。因为无法焊接BGA、LGA和PGA都需要配有相应的插座。

 

 六、总结

  实际应用中还会有一些变种的封装类型就不一一介绍了,但封装本身没有优劣之分,只是适用在不同场景下各有特点。但数种封装格式对新手来说有点蒙圈,所以这里我准备了51单片机各种封装格式的资料供大家对比学习。

  关注公众号“零基础爱学习”回复“51F”可获得下面的资料

  1、AT89C51中文使用说明

  2、AT89S52中文使用手册(包含DIP、PLCC、TQFP三种封装引脚图)

   后续还会继续补充更多学习资料,敬请关注“零基础爱学习​​​​​​​”!

​​​​​​​

2009-11-06 17:40:00 jiqiang01234 阅读数 1562
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3408 人正在学习 去看看 朱有鹏

 

     单片机的串口是经常使用的功能之一,封装起来也相对简单一些,让我们慢慢体会c语言中封装的含义......

 

    先看一下头文件的样子,如下:   

 

里面出现了一个陌生的头文件"oscfrequencydef.h",不过从名字上应该能看出来是干什么用的,其实这个头文件里面就一句宏定义,不过可不要小看哦,以后的定时器封装中还会出现它的身影。

      我写单片机程序的的原则很简单,就是要好看~_~不过这个“好看”的含义可是很广的,基本上可以概括为代码必须简洁、优美、高效

      有人也许会问,上来为什么先让看一个不知道函数内部细节的头文件,而不是直接给出具体实现?这个问题其实就需要用“封装”的本质来回答了:封装就是让调用端不用去关心具体的实现,从而达到信息的隐藏。注意:这里的“封装”是一种逻辑含义,是一种编程规范或准则。没有人可以约束你不去遵守。一看到头文件就能马上了解封装的这个功能模块提供了哪些功能,因为写程序就是需要通过合理的结构把各功能模块连接起来达到协调运作的过程。

     好了,大道理说了不少了,看看具体的东西吧。.c文件如下:

 

     又出现了一个新的头文件"chiptypedef.h",内容也是一句话,作用和"oscfrequencydef.h"一样强大。

注意:<at89x52.h>头文件是uvision3才有的,太早的keil版本没有。里面多了一些常量的定义,串口中断向量在里面已经有了宏定义SIO_VECTOR。

 

封装比较直观,代码里也有注释,就不多做解释了。下面说代码段是具体的用法。

 

      让我们看一看把串口经过封装后main()函数的程序流程,是不是很清晰呢?更重要的是,从主函数中根本看不到单片机底层的实现,完全像是在写上位机程序,这样的好处是可以全身心地注重程序的实现流程,而不要关心具体的实现细节。否则,错综复杂的东西都搅和到一块很影响程序功能的实现。毕竟人的脑子同时思考的事情有限。

      我的理解,程序就是通过抽象把易变的和不易改变的组合在一起。我们可以这样来思考程序:每一个单片机程序自身需要完成很多相对独立的功能。那么,什么是易变的呢?显然,各种功能的顺序流程是易变的,每个程序都不一样。那么,什么又是不易改变的呢?是各相对独立的功能模块,比如:串口功能、定时器功能、LDC显示功能......好了,现在我们已经把串口功能分离出来了,也就是把不易改变的功能分离了出来了。但仔细想想具体实现会发现,依然还有易变的因素在里面,比如:不同的波特率、晶振的频率。于是,我们想到了波特率可以作为函数的参数来适应不同的需求,把晶振频率分离出来单独的头文件以供该项目下所有的文件使用。最后,所有的易变因素都确定了下来,变成了为不易改变的因素,这样的功能封装基本上就达到可以“复用”的目的了。所以,我实现的这个串口封装可以适应所有51系列的单片机,原因也在于此。

      通过一个小小的串口功能封装体会一下博大精深的“封装”思想还是很不错的嘛~_~

没有更多推荐了,返回首页