51单片机实验01-点亮LED小灯

目录

一,软件下载

二,单片机概述

1,单片机内部资源

1)flash

2)ram

3)sfr

2,51单片机

3,单片机最小系统

三,点亮最右边的小灯

1,指出满足小灯点亮的有关网络标号的电平要求

[1)addr2 addr1 addr0=110](#1)addr2 addr1 addr0=110)

2)led=0

[3)addr 3=1 及 enled=0;](#3)addr 3=1 及 enled=0;)

4)编写代码

[5) 运行结果](#5) 运行结果)

四,实验-点亮LED小灯

1、实验的背景和意义

2、实验目的

3、实验任务及要求

4、实验仪器

5、实验步骤

6、实验报告撰写要求

1)按照学号末位和小灯编号相对应进行操作

①确定需要亮的led

②预打开三极管开关

③译码器使能,并打开开关

④指出满足小灯点亮的有关网络标号的电平要求

⑤实现效果

⑥代码

2)实现闪烁LED小灯的实验

①效果

②撰写本实验的完整c语言代码。


一,软件下载

俗话说,"工欲善其事必先利其器"。我先把需要用到的软件下载安装上,相关的软件都放到了网盘中,可通过链接下载👇

链接:https://pan.baidu.com/s/1QEDpuNhcYVB6lmxFNW2z4Q?pwd=6666

提取码:6666

--来自百度网盘超级会员V1的分享

下载后会有如下文件:

单片机开发,需要两个软件:编程软件(Keil uVision4)和下载软件(STC_ISP_V480 )

还有一个开发板串口驱动CH341SER(下载安装好就行,后期不需要手动打开该驱动,默认就有)

Keil uVision4软件界面:

STC_ISP_V480软件界面:

二,单片机概述

1,单片机内部资源

这里的单片机内部资源指的是单片机能够提供给读者可使用的东西。

单片机主要有三大类资源:flash,ram及sfr。

1)flash

flash资源是程序的存储空间。其优点在于:可重复擦写,容量大,成本低等。flash最大的意义就是断电后数据不会丢失(类似于电脑的硬盘,把电脑关机后,所有保存过的文件都在)。

早期的单片机是otprom一次可编只读存储器(one time programmable read-only memory)来存储单片机的程序,程序只能写入一次,如果写错了,只能换一片重新写入。

2)ram

ram全称为random access memory,随机存取存储器,也称为主存,是单片机的数据存储空间,用来存储程序运行过程中产生的和需要的数据(类似于电脑的的内存,最典型的应用就是计算器,一旦关机,数据不复存在)。

ram的优点:读写速度快,理论上可以无限次写入,即寿命无限,不管程序怎么运行和怎么读写,它都不会坏。

3)sfr

sfr全称为special function register,特殊功能寄存器。

单片机有很多功能,每个功能都会对应一个或多个sfr,用户就是通过对sfr的读写来实现单片机的多种多样的功能。

2,51单片机

我们通常所说的51单片机指的都是兼容了Intel mcs-51体系架构的一系列单片机。而51是它的一个通俗的简称。

在接下来的单片机航行中我选择的是宏晶科技的STC89C52单片机来进行学习。它是一款51内核的单片机,具有标准的51体系结构和功能,程序下载方式简单,方便学习。

它的资源情况:

  • flash程序空间是8k字节(1k=1024,1字节=8位)
  • ram数据空间是512字节
  • sfr后面会逐一用到并补充

3,单片机最小系统

单片机最小系统也称为单片机最小应用系统,是指用最少的原件组成可以工作的单片机系统。

单片机最小系统主要有三要素**:电源,晶振和复位电路**。如下图所示:

【图片取自《手把手教你学51单片机-C语言版》p12,有兴趣的可以去网盘下载电子板书本来看】

链接:https://pan.baidu.com/s/1QEDpuNhcYVB6lmxFNW2z4Q?pwd=6666

提取码:6666

--来自百度网盘超级会员V1的分享

如果想要详细了解其他的知识如:电源,晶振,复位电路和led小灯的介绍的可下载网盘中的电子书自行阅读,接下来单片机的学习,我将不再详细地把其他知识写到博客里面(因为没必要做一个木得感情的打字机器,最主要的还是代码编写的思路,效果的呈现)。

更多资源可转到金沙滩官网查看。

青岛金思特电子有限公司 (qdkingst.com)

三,点亮最右边的小灯

最右边的小灯所对应的网络标号为db0。那么就可以沿着相同的网络标号来找到其在单片机上所对应的端口,并给其相应的电平,使小灯能够点亮。

1,指出满足小灯点亮的有关网络标号的电平要求

1)addr2 addr1 addr0=110

按照下图的三步走让二极管正极有电压,即使三极管(作为开关)打开。如下👇

110为二级制显示,换算成十进制为6,为138译码器输出的y6,译码器的y6进而可控制基极的电平(因为译码器上的y6和三极管基极中的电平,两者的网络编号都是leds6,因此y6可以和基极相连并可以控制基极的电平)。138译码器有一个特点,就是输入只能指定对应的输出端为低电平,其他输出端口为高电平,即只有一个低电平输出。因此当 a2 a1 a0=110时,就表示了y6为低电平。

知道了addr2 ,addr1,addr0这三个译码器上的网络标号,我就可以通过【显示译码与步进电机的选择跳线】区域的图纸,来一一对应到单片机上:

  1. addr2=P1.2;
  2. addr1=P1.1;
  3. addr0=P1.0

在编写代码时,需要在main方法之前进行定义,如下👇

cpp 复制代码
sbit addr0=P1^0;
sbit addr1=P1^1;
sbit addr2=P1^2;

因为在单片机的编码中没有P1.x这种描述,无法识别,一般将P1.x写为P1^x。 (写多了就行)

2)led=0

要让最右边的led灯点亮,需要二极管的阴极为低电平。

二极管有一竖的位置为阴极,阴极的电平要比阳极低,二极管才能够导通,通过下图我们可以看到,二极管的阳极通过三极管开关接了5v的电压,一般而言5v可以视为高电平,因此,我们需要将二极管的阴极接入低电平。

"沿着"电路元件的网络标号来最终找到单片机电路上 ,由图可以看到,我们需要将P0.0输入低电平,因为P0.0在程序中使用led来代表,所以我们给led这个赋值为0。

因此led=0。

需要在main方法前声明,让led代表P0^0,如下👇

cpp 复制代码
sbit led=P0^0;

3)addr 3=1 及 enled=0;

要使138译码器能够工作,就需要让它使能,而138有三个使能端:e1,e2,e3,如下图👇:

因此,e3=1。

由于e2=0,e1=0,且e2与e1连一起了,两个的与为0,所以,enled=0。

依旧需要沿着网络标号找到单片机电路上所对应的端口,如下👇

并在main方法前面进行声明,如下:

cpp 复制代码
sbit addr3=P1^3;
sbit enled=P1^4;

4)编写代码

如上,所有的都分析完了之后,我开始写代码,编写代码如下:👇

cpp 复制代码
​
#include< reg52.h>  // 头文件,包含有众多寄存器的地址
sbit led=P0^0;
sbit addr0=P1^0;
sbit addr1=P1^1;
sbit addr2=P1^2;
sbit addr3=P1^3;
sbit enled=P1^4;
void main(){
enled=0;
addr3=1;
addr2=1;
addr1=1;
addr0=0;
led=0; 		 // led代表一个发光二极管。阴极输入低电平,发光二极管导通,	小灯点亮

while(1);   // 小灯常亮
}

​

5) 运行结果

值得注意的是,当我在同一个工程里面有多个c文件时,如果不修改每一次create生成的hex文件的文件名,那么该文件会指向哪个c文件,我就会无迹可寻。因此,当每次使用rebuild来编译不同的c文件时,都建议将对象文件的名字进行修改,如下👇,当然,如果文件不多的话,也可以不用改。

也可以将编译好的对象文件专门放到一个目录里面,如下👇

四,实验-点亮LED小灯

1、实验的背景和意义

单片机全称叫单片微型计算机,是一种集成在电路芯片,采用大规模集成电路技术把CPU、随机存储器RAM 、只读存储器ROM、多种输入输出口、定时器/ 计时器等功能集成到一块硅片上构成的一个小而完善的计算机系统。

目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的应用。大致可以分为以下几个范畴:

1、在智能仪器仪表上的应用,例如精确的测量设备;

2、在工业控制中的应用,例如用单片机可以构成形式多样的控制系统,与计算机互联网构成二级控制系统等;

3、在家用电器中的应用,可以从手机、电话机、小型程控交换机、楼宇自动通信呼叫系统、列车无线通信、再到日常工作中随处可见的移动电话、集群移动通信、无线电话对讲机等;

4、在医用设备中的应用,例如医用呼叫机、各种分析仪、超声诊断设备及病床呼叫系统等等;

5、在各种大型电器中的模块化作用,如音乐集成单片机,看似简单的功能,微缩在电子芯片中,就需要复杂的类似于计算机的原理。

本实验着重在于分析计算机软件和开发过程中的环节和步骤,并从实践经验出发做了详细的分析和研究。本实验就是充分利用了8051 芯片的I/O 引脚,实际采用STC89C52RC单片机为中心器件来实现点亮LED小灯和进行小灯闪烁实验。

2、实验目的

1、学习基本理论在实践中综合运用的初步经验,掌握电路设计的基本方法、设计步骤,培养综合设计与调试能力。

2、掌握c 语言程序设计方法。

3、培养实践技能,提高分析和解决实际问题的能力。

3、实验任务及要求

1、用发光二极管作为显示电路,KST-51开发板中的小灯从左到右分别为LED9、LED8、LED7、LED6、LED5、LED4、LED3、LED2共计8只小灯。按照学号末位和小灯编号相对应进行操作,如学号2132331217的同学完成对LED7小灯的操作,另外学号末位为0和1的同学分别完成对小灯LED9和LED8的操作。具体操作见本实验的后续要求。

2、实现点亮LED小灯的实验,编写完整代码。

3、实现闪烁LED小灯的实验,只编写和任务2中不同部分的代码。

4、实验仪器

计算机1台、KST-51开发板1套。

5、实验步骤

1、建立文件夹,按照三大步完成项目和文件的建立及关联。

第一步:建立一个项目;

第二步:新建一个文件(加上 .c);采用软件Keil uVision4等进行代码编写。

第三步:添加文件到项目中去。

2、编译生成 ***.hex 文件。

3、连接KST-51开发板,利用软件STC-ISP-v4.80等完成单片机程序"烧写"。

4、观察实验现象,进行有关记录。

6、实验报告撰写要求

1、认真研读教材附录D的KST-51开发板原理图,指出满足小灯点亮的有关网络标号的电平要求,写在实验报告中。

开发板原理图可在网盘中下载

链接:https://pan.baidu.com/s/1QEDpuNhcYVB6lmxFNW2z4Q?pwd=6666

提取码:6666

--来自百度网盘超级会员V1的分享

1)按照学号末位和小灯编号相对应进行操作

如学号2132331217的同学完成对LED7小灯的操作,另外学号末位为0和1的同学分别完成对小灯LED9和LED8的操作。

①确定需要亮的led

例如我学号末尾是4,因此我需要点亮led4,看图:

元件标号为led4的发光二极管的网络标号为db2。 之后开始沿着网络标号找到单片机:

之后写上代码👇

②预打开三极管开关

打开三极管开关相关的电平在点亮最右边的小灯中已经分析过了,并且打开开关的代码不变,写下来,如下👇

因为此时,还没有让译码器使能,138译码器并没有开始工作,开关没有真正的打开。接下来我让译码器使能开始工作。

③译码器使能,并打开开关

最后再加上

cpp 复制代码
while(1);

使灯长亮。

④指出满足小灯点亮的有关网络标号的电平要求

led=0; // 低电平

addr2=1; // 高电平

addr1=1;

addr0=0;

enled=0;

addr3=1;

⑤实现效果

如下,led4(从右数第三个)点亮👇

⑥代码
cpp 复制代码
#include<reg52.h> 
sbit led=P0^2;	 // 二极管阴极所接的端口
sbit addr0=P1^0;  // 138译码器低位输入
sbit addr1=P1^1; // 138译码器中位输入
sbit addr2=P1^2;// 138译码器高位输入
sbit addr3=P1^3; // 使能端es
sbit enled=P1^4; // 使能端 e1和e2
void main(){
	led=0;  // 二极管阴极需要低电平
	addr2=1;
	addr1=1;
	addr0=0;
	enled=0;
	addr3=1;
	while(1);
}

2)实现闪烁LED小灯的实验

之前我在main方法中的最后一行写了while(1);一个死循环让灯长亮。如果想要在灯能够一直一亮一灭的话,需要在while(1)死循环内加入两个for循环来控制led,一个for循环用于让灯亮一段时间,另一个for循环用于让灯灭一段时间,之后一直重复再重复的一亮一灭。效果如下👇:

①效果

闪烁一个小灯

②撰写本实验的完整c语言代码。
cpp 复制代码
#include<reg52.h> 
sbit led=P0^2;	 // 二极管阴极所接的端口
sbit addr0=P1^0;  // 138译码器低位输入
sbit addr1=P1^1; // 138译码器中位输入
sbit addr2=P1^2;// 138译码器高位输入
sbit addr3=P1^3; // 使能端es
sbit enled=P1^4; // 使能端 e1和e2
void main(){
    unsigned int i=0;
	addr2=1;
	addr1=1;
	addr0=0;
	enled=0;
	addr3=1; 
	while(1){
		led=0;  // 灯亮
	    for(i=0;i<50000;i++);     // 灯亮一段时间
		led=1;   // 灯灭
		for(i=0;i<50000;i++);
	}
}

如果文章哪里有错误,请在评论区留言或者是私信我,一定知错就改。

如果文章哪里有不懂,请在评论区留言或者是私信我,一定倾囊相助。

相关推荐
blessing。。2 分钟前
I2C学习
linux·单片机·嵌入式硬件·嵌入式
PandaCave5 分钟前
vue工程运行、构建、引用环境参数学习记录
javascript·vue.js·学习
yuwinter10 分钟前
鸿蒙HarmonyOS学习笔记(2)
笔记·学习·harmonyos
red_redemption32 分钟前
自由学习记录(23)
学习·unity·lua·ab包
幽兰的天空1 小时前
默语博主的推荐:探索技术世界的旅程
学习·程序人生·生活·美食·交友·美女·帅哥
嵌新程1 小时前
day03(单片机高级)RTOS
stm32·单片机·嵌入式硬件·freertos·rtos·u575
Lin2012301 小时前
STM32 Keil5 attribute 关键字的用法
stm32·单片机·嵌入式硬件
沐泽Mu2 小时前
嵌入式学习-C嘎嘎-Day05
开发语言·c++·学习
电工小王(全国可飞)2 小时前
STM32 RAM在Memory Map中被分为3个区域
stm32·单片机·嵌入式硬件
你可以叫我仔哥呀2 小时前
ElasticSearch学习笔记三:基础操作(一)
笔记·学习·elasticsearch