七天学会单片机Word文档下载推荐.docx

上传人:b****8 文档编号:21998487 上传时间:2023-02-02 格式:DOCX 页数:41 大小:883.27KB
下载 相关 举报
七天学会单片机Word文档下载推荐.docx_第1页
第1页 / 共41页
七天学会单片机Word文档下载推荐.docx_第2页
第2页 / 共41页
七天学会单片机Word文档下载推荐.docx_第3页
第3页 / 共41页
七天学会单片机Word文档下载推荐.docx_第4页
第4页 / 共41页
七天学会单片机Word文档下载推荐.docx_第5页
第5页 / 共41页
点击查看更多>>
下载资源
资源描述

七天学会单片机Word文档下载推荐.docx

《七天学会单片机Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《七天学会单片机Word文档下载推荐.docx(41页珍藏版)》请在冰豆网上搜索。

七天学会单片机Word文档下载推荐.docx

我们用“水平”来比喻“电平”如人们常说到张某工作很有水平、李某办事水平很差。

这样的话都知其含义所在。

即指“张某”与“李某”相比而言。

电平就是指电路中两点电量(“电量”可理解为电压)的比较。

学习单片机只需了解两种电平:

高电平和低电平,我们定义单片机输入与输出的为TTL电平,其中高电平为+5V,低电平为0V。

什么是TTL电平?

TTL电平采用二进制规定,+5V等价于逻辑“1”,0V等价于逻辑“0”。

这样一来,我们在编写程序中如果对某个引脚赋值为“1”那个引脚就输出高电平,同理,若我们赋值为“0”,对应的引脚就输出低电平。

2、二进制与十六进制逻辑运算

大家都知道,十进制的特点是“逢十进一,借一当十”。

同理,二进制的特点就是“逢二进一,借一当二”。

在二进制中只有“0”和“1”,比如11100101B(“B”为二进制后缀)就是二进制。

那么,二进制和十进制如何转化呢?

举个例子,二进制11010011B转化为十进制就是

十六进制与二进制大同小异,十六进制为“逢十六进一,借一当十六”。

十进制中0-15用十六进制表示为0-9,A,B,C,D,E,F,即十进制中10对应十六进制A,11对应B……当我们写的是十六进制时,要在前面加上0x(注意0是“零”不是字母O),举个例子,十六进制0x7f换算成二进制为“01111111”换算成十进制为715

十进制

二进制

十六进制

8

1000

1

9

1001

2

10

1010

A

3

11

1011

B

4

100

12

1100

C

5

101

13

1101

D

6

110

14

1110

E

7

111

15

1111

F

表1-1

逻辑运算

“与”运算是实现“必须都有,否则就没有”这种逻辑关系的运算,其运算符为“&

”,运算规则为:

0&

0=0,0&

1=1&

0=0,1&

1=1.

“或”运算是实现“只要其中之一有就有”这种逻辑关系的运算,其运算符为“|”,运算规则为:

0|0=0,0|1=1|0=1,1|1=1

“非”运算是实现“求反”这种逻辑关系的运算,其运算符为“!

0=1,!

1=0

3、单片机最小系统

很多初学者容易把单片机开发板误认作单片机,实际上这是不对的,单片机只是一块小小的集成芯片,但如果只是一块芯片无法实现其功能,我们要想要单片机运行起来,至少应该给它提供一个电源吧?

下面所讲的单片机最小基本电路就是一个单片机能运行的最基本条件。

我们平时所使用的单片机开发板,无非就是把这个基本电路和一些其他电路整合在一块电路板上,有了这些基本电路,你们自己都可以设计制作出单片机开发板。

图1-3

在上图中,除了单片机外实际上只有三个电路,分别是电源电路、晶振电路和复位电路,下面简单介绍这三个电路,大家只需要知道其作用就行了。

1)电源电路

电源电路非常简单,就是给单片机提供电源。

2)晶振电路

晶振电路的作用就是为系统系统提供基本的时钟信号,形象的说,晶振电路就像单片机的心脏一样,如果没有晶振,单片机就停滞在那里不能一步步执行程序。

3)复位电路

复位电路就是让单片机能够进行清零复位,让单片机重新开始从头开始执行程序(从头工作),它分为上电复位和按键复位两种,也就是说,当你刚刚给单片机通电时,它就进行了一次复位,当有电时你按下复位键,它也能进行复位。

第二天I/O口介绍及其应用

一、什么是I/O口

我们的单片机能接收到外部的输入信号(包括数据、指令等),并能对其进行处理,再输出信号,控制其外围连接电路,以实现我们想要实现的功能。

但单片机怎样与外围电路进行通讯呢?

这就需要用到I/O。

什么又是I/O口呢?

它的中文全称叫作输入与输出端口,也就是说我们的数据是通过I/O口传输的。

单片机包括四个I/O口,分别是P0,P1,P2,P3,每个口有8个引脚。

什么又是引脚呢?

所谓单片机的引脚,就是连接单片机内部电路和外部电路的桥梁,就像电阻的两支管脚。

但单片机的引脚不止2个,我们较常用的AT89C51型号的单片机就有40个引脚(如图2.1)。

图2-1AT89C51单片机的引脚

以AT89C51型号的单片机为例(较常用的都是40支引脚的51单片机,但也有20,28,32,44等不同引脚数的51单片机,这些大家在以后的学习过程中也要了解,不要只见了40引脚的芯片才认为它是51单片机)。

四个I/O口,共32支引脚。

其余8支引脚有着其他的功能,如电源引脚(VCC,GND)、时钟引脚(XTAL1、XTAL2)等。

在这儿,我们主要了解I/O口引脚。

二、I/O口的工作原理

I/O口它们是怎样工作的呢?

单片机是一种数字集成芯片,而数字电路只认两种电平:

高电平(二进制代码为1)、低电平(二进制代码为0)。

我们就是通过给I/O口赋高低电平来控制外围电路。

举个点亮发光二极管的简单例子来说明I/O口的工作原理。

大家都知道二极管具有单向导电性,只有当二极管正极电压高于负极电压,发光二极管才能发光。

如图:

图2-2单片机控制发光二极管电路

二极管的正极连在电源上,负极接在单片机的P2.0引脚上,若此时P2.0为低电平(0V),则二极管导通,二极管发光。

若P2.0为高电平(+5V),二极管不能导通,则不能发光。

从点亮一个发光二极管的例子,我们了解到,通过给单片机的一个I/O口的引脚赋高、低电平这种控制手段,我们可以使单片机控制一个简单的外围电路(发光二极管电路)。

但我们怎么来控制复杂的外围电路呢?

上面的例子怎么才用到32支I/O口引脚中的一支呢?

4个I/O口共32个引脚,试想,一个引脚控制一个简单的外围电路,一个外围电路不外乎就两种情况,引脚为高电平或低电平。

4个I/O口(32个引脚)同时用上,用排列组合的知识就可以算出,这4个I/O口控制的结果将会是多少种情况,控制的电路将会是多么的复杂,由此我们也可以看出单片机的功能是多么的强大。

上面说了这么多,我们可以将其归根到一点,就是:

我们是通过给I/O口赋值(赋1或0),使I/O口输出高、低电平,从而控制外围电路。

三、怎样使用I/O口

上面我们介绍了什么是I/O口及其工作原理,下面我们就来实践演练一下。

1、先来看点亮一个发光二极管的实例,硬件连接如图

图2-3LED连接图

分析:

二极管负极连在P1.0上,我们只需给P1.0一个低电平即可点亮它。

程序如下:

#include<

reg52.h>

//52系列单片机头文件

sbitled1=P1^0;

//声明单片机P1口的第一位

voidmain()//主函数

{

Led1=0;

/*点亮发光二极管*/

}

也许大家看到这个简单的C程序,也是一头雾水。

它为什么要声明单片机P1口的第一位P1.0呢?

(注:

P1.0口在C程序中是用P1^0来表示的)。

为什么不直接使P1^0=0呢?

这是因为我们若要控制某个发光二极管(上图是D1),也就是要控制单片机I/O口的某一位(上图是P1.0),必定要声明这一位,否则单片机不知道我们要操作的是什么东西,所以我们在程序中声明了单片机P1口的第一位(sbit是一个声明位的操作,相当于C程序中要用到整型时,用int来声明)。

比如,我们想给P1.0一个高电平,我们直接给led1赋值1就行了。

由于LED正常发光时其两端的电压约为1.7V,如果不接限流电阻,LED两端的电压要么为5V,要么为0V,当5V时很可能烧坏LED,所以我们还得给它加上一个限流电阻R(一般为1K)。

2、点亮多个LED

如图,我们要控制第1,3,5,7个亮,第2,4,6,8个灭该怎么办呢?

当然,我们可以以上面的方法(单独控制一个引脚)来实现,下面我们介绍一种更为简单的方法(同时控制一个I/O口的8个引脚)。

图2-4单片机控制流水的电路图

P1口共8个引脚,每个引脚对应一个二进制位。

8个引脚即八个二进制位。

P1.0对应最低位,P1.7对应第8位。

如我们对P1口赋值10111110,则P1口的第一引脚和第七引脚为低电平,其它引脚为高电平。

上面的电路图我们只画了控制外围电路部分,而单片机自身的电源电路等都没画出来,但不等于没有,因为它也需要电源给其供电才能正常工作。

如上图所示,8个LED正极端已于+5V的直流电源相连(我们称之为共阳极接法),都获得了一个高电平,它们的负极端又分别与P1端口的8个引脚相连,只要我们控制P1端口八个引脚的电平输入,我们就能分别控制8个LED的亮与灭。

#include<

P1=0xaa;

/*对P1口的8个引脚进行位操作*/

注意区别上一个C程序,这里不再对P1口的某一位进行声明,而是在主函数中直接对单片机P1口的8个引脚进行操作,“0x”表示十六进制数,转换成二进制是10101010,那么对应的发光二极管负极端获得的高低电平如表1.4。

LED

D1

D2

D3

D4

D5

D6

D7

D8

负极端电平

表2-1

这就实现了1,3,5,7亮,2,4,6,8灭。

我们将0xaa转换成十进制后为170,也可以直接对P1口进行十进制数的赋值,如“P1=170;

”,其效果是一样的,只是麻烦了许多。

因为无论是几进制的数,在单片机内部都是以二进制数形式存在的,只要是同一个数值的数,其在单片机内部都是用二进制的同一种形态来表示。

上面介绍了如何点亮一个发光二极管,如何控制流水灯的亮与灭。

如果你能控制流水灯,使它们能按你的意愿亮与灭,可以这么说,你对单片机已经入门了。

第三天按键原理及其应用

一、什么是按键

提到按键大家都不会陌生,如图所示为51单片机开发板上的按键实物图和电路图,它可以通过跳帽(就是一根短接线)切换成独立按键或矩阵键盘两种模式,J11是由三根插针(图中标号1、2、3)组成。

当我们使用独立按键时,应该把跳帽跳到左端(相当于让1、2短接),当我们使用矩阵键盘时,应该把跳帽跳到右端(相当于让2、3短接)。

图3-1按键实物图

图3-2按键电路图

大家可能会问,什么又是独立按键和矩阵按键呢?

当我们使用独立按键时,只有S1、S2、S3、S4四个按键能够工作,其他按键是不工作的。

当我们需要多于四个按键的时候,我们可以使用矩阵键盘,也就是一共4*4=16个按键可以工作。

当然,矩阵键盘的程序要复杂的多。

二、按键是如何工作的

按键原理非常简单,当你用手按下时开关闭合,线路导通,松手时开关断开,线路断开。

它是如何与单片机联系起来,达到控制的目的呢?

这里我们就需要按键检测程序,我们知道,I/O口既可以做输入口又可以做输出口,在这里我们就要用到其输入功能,我们可以把按键的一端接地,另一端与单片机某个I/O口相连,开始时先给该I/O口赋一高电平(实际上如果没有对I/O口赋值,I/O口都默认为高电平),然后让单片机不断检测该I/O口是否变为低电平,当按键闭合时,即相当于该I/O口通过按键与地相连,变为低电平,一旦程序检测到I/O口变为低电平则说明按键被按下,然后执行相应的指令。

按键连接方法很简单,如图所示,按键一端接地,另一端接与单片机任一I/O口相连,按键在被按下时,其触电电压变化过程如图

图3-3

从图中可以看出,在实际情况下,我们在按下和释放按键的瞬间都会有抖动现象,抖动时间一般在5-10ms。

在抖动的这段时间里电压是不稳定的,因此单片机在检测键盘是否按下时都要加上去抖动操作,也就是把抖动时间给排除掉,一般我们用软件延时的方法就能解决这个问题。

在编写按键程序时,需要在检测按下时加入去抖动的延时函数。

三、如何编写按键检测程序

如图所示为按键检测流程图

四、按键检测实例程序

图3-4按键控制LED电路图

如图3-4所示是一个用S1、S2两个按键控制LED亮灭的电路仿真图,它实现的功能是:

按下S1,LED亮,按下S2,LED灭。

我们结合这个电路的程序,让大家对按键有一个基本的认识。

//包含头文件,一般情况不需要改动,写在程序最前面

sbitS1=P1^0;

//定义按键S1位置,将S1与P1.0口相连

sbitS2=P1^1;

//定义按键S2位置,将S2与P1.1口相连

sbitLED1=P2^0;

//定义LED1位置,将其与P2.0相连

/*------------------------------------------------

延时子程序

------------------------------------------------*/

voiddelay(unsignedinti)

while(i--);

//循环i次,当i减小到0时跳出循环

主函数

main()

while

(1)

{

if(S1==0)//如果S1等于0,说明按键1被按下

delay(1000);

//进行去抖动处理

if(S1==0)LED1=0;

//检测按键确实按下,点亮LED1

}

if(S2==0)//如果S2等于0,说明按键2被按下

//去抖动处理

if(S2==0)LED1=1;

//检测按键确实按下,熄灭LED1

}

程序分析:

主程序进来就一个while

(1)死循环,循环中检测是S1还是S2按下,如果第一个按键S1按下,则S1等于0,然后延时一段时间再检测S1是否还等于0,即去抖处理,如果S1还等于0,说明S1确实按下,就点亮LED1。

如果第二个按键S2按下,则S2等于0,r然后延时一段时间再检测S2是否还等于0,即去抖处理,如果S2还等于0,说明S2确实按下,就熄灭LED1。

延时函数的原理就是,当单片机执行一个while(i--)循环语句时,就消耗了一部分时间,时间的多少有i的初始值决定。

第四天数码管介绍及其应用

一、什么是数码管

图4-1数码管实物图

数码管是单片机系统中常用的显示器件,每个数码管由8段LED构成,组合起来可以显示0,1,2,3,4,5,6,7,8,9和部分英文字母。

二、数码管的硬件结构

图(a)是数码管外观图,一位数码管含有10个引脚,a,b,c,d,e,f,g,dp,和两个GND,两个GND是连在一起的。

图(b)是数码管的内部结构图。

图(b)中又有两种接法,一种是将8段LED的阴极(负极)一起连在接地端,称为共阴极接法,一种是将8段LED的阳极(正极)一起连在+5V的电源上,称为共阳极接法。

三、数码管的显示原理

使用LED显示器时,要注意区分这两种不同的接法。

下面我们以共阳极数码管为例介绍数码管的编码原理。

假设我们要数码管显示2,那么就是要让a,b,d,e,g亮,其它的不亮。

若显示8,那么就让a,b,c,d,e,f,g亮,dp不亮。

为了显示数字或字符,必须对数字或字符进行编码。

七段数码管加上一个小数点,共计8段。

因此为LED显示器提供的编码正好是一个字节(8位)。

每一位控制一段LED,对应关系如下表:

dp

g

f

e

d

c

b

a

表4-1

其中,D1表示8位二进制位的第一位,D2表示8位二进制位的第二位,以此类推。

如果我们要数码管显示2,即a,b,d,e,g亮,其它的不亮。

因为数码管是共阴的,所以给a,b,d,e,g赋0才亮,即10100100,即0xa4。

如果显示8,即a,b,c,d,e,f,g亮,dp不亮。

编码10000000,即0x80。

以下是共阳极编码列表:

显示的数

编码

0xc0

0xf9

0xa4

0xb0

0x99

0x92

0x82

0xf8

0x80

0x90

表4-2

会编共阳的,就会编共阴的,共阴极编码列表如下:

0x3f

0x06

0x5b

0x4f

0x66

0x6d

0x7d

0x07

0x7f

0x6f

表4-3

四、程序示例

让数码管重复显示0,1,2…8,9。

数码管(共阳)接在P2口上。

硬件示意图如下:

图4-2数码管硬件电路图

我们控制数码管的显示,数码管的八个引脚是连在P2口的,所以就是对P2口赋值的过程。

voiddelay(intx)//延时函数

{

while(x--);

{

P2=0xc0;

//显示0

delay(8000);

//延时

P2=0xf9;

//显示1

P2=0xa4;

//显示2

P2=0xb0;

//显示3

P2=0x99;

//显示4

P2=0x92;

//显示5

P2=0x82;

//显示6

P2=0xf8;

//显示7

P2=0x80;

//显示8

P2=0x90;

//显示9

}

主程序中就一个大循环,循环为P2口赋值,从而显示0到9。

每两个数之间有个延时,为什么要延时呢?

是因为我们的单片机处理速度是非常快的,不延时我们根本没法看清数码管显示的是什么,所以必须要有延时。

五、数码管的动态扫描

上面我们只讲到了用一个I/O口控制1位数码管的显示,若是要控制两个数码管的显示呢?

很多人说用两个I/O口,这个是可以实现的,但我们要控制8个数码管呢,岂不是要8个I/O口吗?

51单片机只有4个I/O口,那不是不能控制8个数码管了?

所以为了节约51单片机的引脚资源,我们引入了数码管的动态扫描。

1、什么是动态扫描

数码管的动态扫描就是先让第一位数码管显示,然后第一位灭,再让第二位显示,然后第二位灭,……第n位数码管显示,然后第八位灭。

然后重复上述状态,当显示速度非常快的时候,我们看到的就是n位数码管同时显示。

2、怎么实现动态扫描

下面我们以四个数码管(共阳极)的显示为例讲述动态扫描的使用方法

四个数码管的引脚连接图如下:

图4-3四位数码管电路图

四个数码管的a脚连在一起,b脚连在一起,……dp脚连在一起,每个数码管的公共引脚(com)独立,com脚接在一个三极管(Q3)上,大家先不用管三极管是怎么用的,你只需知道扫描信号有高电平时,扫描信号的那个端子就与(com)连通了,如扫描信号的A端为高电平,那么A端就与第四个数码管的(com)接通了。

如果我们要第一个数码管显示1,第一个数码管显示2,第一个数码管显示3,第一个数码管显示4。

我们该怎么做?

用动态扫描的方法

第一步:

先让第一个数码管显示1,其它的关闭。

给a,b,c,d,e,f,g,dp赋值,即0xf9,再给D端一个高电平(打开第一个数码管),给ABC端低电平(关闭其它3个数码管)。

第二步:

先让第二个数码管显示2,其它的关闭。

给a,b,c,d,e,f,g,dp赋值,即0xa4,再给C端一个高电平(打开第二个数码管),给ABD端低电平(关闭其它3个数码管)。

第三步:

先让第三个数码管显示3,其它的关闭。

给a,b,c,d,e,f,g,dp赋值,即0xb0,再给B端一个高电平(打开第三个数码管),给ACD端低电平(关闭其它3个数码管)。

第四步:

先让第四个数码管显示4,其它的关闭。

给a,b,c,d,e,f,g,dp赋值,即0x99,再给A端一个高电平(打开第四个数码管),给BCD端低电平(关闭其它3个数码管)。

重复上面四步,这就实现了动态扫描。

3、应用实例

假设a,b,c,d,e,f,g,dp接在P2口,信号端ABCD分别接在P3.0,P3.1,P3.2,P3.3上,硬件连接如图所示:

图4-4四位数码管仿真电路图

实现动态扫描的源程序如下:

#inclu

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 材料科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1