目录
[1)addr2 addr1 addr0=110](#1)addr2 addr1 addr0=110)
[3)addr 3=1 及 enled=0;](#3)addr 3=1 及 enled=0;)
[5) 运行结果](#5) 运行结果)
☀
一,软件下载
俗话说,"工欲善其事必先利其器"。我先把需要用到的软件下载安装上,相关的软件都放到了网盘中,可通过链接下载👇
链接: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小灯的介绍的可下载网盘中的电子书自行阅读,接下来单片机的学习,我将不再详细地把其他知识写到博客里面(因为没必要做一个木得感情的打字机器,最主要的还是代码编写的思路,效果的呈现)。
更多资源可转到金沙滩官网查看。
三,点亮最右边的小灯
最右边的小灯所对应的网络标号为db0。那么就可以沿着相同的网络标号来找到其在单片机上所对应的端口,并给其相应的电平,使小灯能够点亮。
1,指出满足小灯点亮的有关网络标号的电平要求
1)addr2 addr1 addr0=110
按照下图的三步走让二极管正极有电压,即使三极管(作为开关)打开。如下👇
110为二级制显示,换算成十进制为6,为138译码器输出的y6,译码器的y6进而可控制基极的电平(因为译码器上的y6和三极管基极中的电平,两者的网络编号都是leds6,因此y6可以和基极相连并可以控制基极的电平)。138译码器有一个特点,就是输入只能指定对应的输出端为低电平,其他输出端口为高电平,即只有一个低电平输出。因此当 a2 a1 a0=110时,就表示了y6为低电平。
知道了addr2 ,addr1,addr0这三个译码器上的网络标号,我就可以通过【显示译码与步进电机的选择跳线】区域的图纸,来一一对应到单片机上:
- addr2=P1.2;
- addr1=P1.1;
- 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++);
}
}
如果文章哪里有错误,请在评论区留言或者是私信我,一定知错就改。
如果文章哪里有不懂,请在评论区留言或者是私信我,一定倾囊相助。