51单片机小白零基础教程——点亮第一个小灯以及流水灯(附原理图、代码详细讲解)

一、LED灯电路图分析

(1)LED灯的描述

LED灯:LED全称为发光二级管,可以将电能转换为光能,可以将电信号转为光信号的发光器件。
在这里插入图片描述
此图片中LED1-LED8为单片机开发板上的0603型号的贴片LED灯。
在这里插入图片描述
此图片为LED灯在电路图中的符号,要想导通LED就必须给二极管正向流过工作电流,LED的基本工作特性为正向导通,反向截止。

(2)LED灯在电路图中的分析

在这里插入图片描述
J9:跳线帽,只有合上跳线帽,2引脚和1引脚才相通,拔掉J9,5V的电压只能在2引脚,到不了1引脚。

RL6、RL7:限流电阻,防止流过LED灯的电流太大,而导致LED灯的烧毁。

我们从图中可以发现LED灯的阳极连接在一起,这种接法被称为共阳极接法

共阳极接法:几个二极管的阳极接在一起,通常情况下,连接在一起接VCC(高电平)。所以我们想要点亮二极管,只要在对应的二极管的阴极上接上一个低电平就可以。

(3)主控电路分析

在这里插入图片描述
由于从图中我们可以看出二极管对应主控芯片上的网络编号为P10到P17,实际上连接的是主控芯片上的P1.0~P1.7引脚,由于二极管是共阳极二极管,所以给P1口给一个低电平,就能导通


二、如何利用Keil uVision4创建一个程序

(软件如何下载在这篇博客中https://editor.csdn.net/md/?articleId=115553027

2.1 双击之前下载好的软件Keil uVision4
在这里插入图片描述

2.2 点击Project 选择里面的New Vision Project 然后新建一个文件夹
在这里插入图片描述
2.3 在弹出的窗口中选择Atmel
在这里插入图片描述

2.4 选择AT89c52芯片(这个根据自己单片机型号去选择,我这里是AT89c52)
在这里插入图片描述

2.5 这里点击否
在这里插入图片描述

2.6 点击图中1:新建一个文件;然后点击2:保存
在这里插入图片描述

2.7 点击图标上的第一步;直接在文件名中加上.c 然后第二步保存
在这里插入图片描述

2.8 点击Target1旁边的+
在这里插入图片描述

2.9 双击Source Group 1
在这里插入图片描述

2.10 单击led.c 然后文件名以.c为后缀即可
在这里插入图片描述

2.11 第一步点击图中所示的1;第二步修改Xtal(MHz)中的数据为11.0592(这个根据自己单片机上的晶震自行修改)
在这里插入图片描述

2.12 第一步点击Output;第二步勾选Great HEX File(为了能够烧录到单片机中去);第三步点击OK
在这里插入图片描述
至此一个程序的编译环境已经搭建好,下一步可以进行编译程序。

2.13 在图示1中区域进行单片机代码的编写;编写完成之后在图中2处进行编译;在图中3处进行代码检测,看到生成一个文件,而且没有错误,没有警告就说明可以准备烧录进单片机
在这里插入图片描述

三、Stc-isp烧录软件的使用

3.1 双击打开Stc-isp软件
在这里插入图片描述
3.2 第一步:根据自己单片机的型号进行选择 我的单片机是stc89c52
第二步:选择自己usb的串口号(串口号可以百度怎么查 不知道怎么查 私信我)
第三步:选择内部扩展RAM可用
第四步:勾选所圈出的地方(2个地方都圈出来)
第五步:打开之前在Keil uVision4中建立好的文件
第六步:点击下载/编程就可以烧录进单片机了
在这里插入图片描述


四、LED灯程序编写

(1)点亮第一个LED灯

第一种方法:采用位定义的方法

# include <reg52.h>	//52单片机头文件(学过c语言的这一点肯定理解)
  sbit LED1 = P1^0;  //sbit是单片机中的位定义 一般格式为:sbit标识符 = 地址值 根据原理图可以发现LED1对应的是P1.0口
  void main()	 //主函数
  {
	LED1 = 0; //点亮LED1   //用来注释   /* */这个也可以用来注释
    while(1); //让程序在该处停止,这样一个程序有头有尾
  }

第二种方法:采用P1口直接控制

# include <reg52.h>	 //52单片机头文件(学过c语言的这一点肯定理解)
  void main()	  //主函数
  {
	P1 = 0xfe; //0x可以理解为16进制的表示方法,这里有8个LED灯,LED灯是从低位排到高位的,所以代表的是1111 1110
	while(1); //让程序在该处停止,这样一个程序有头有脑
  }

从图中我们发现LED1灯被点亮
在这里插入图片描述

(2)LED灯的闪烁

#include<reg52.h>  //52单片机头文件(学过c语言的这一点肯定理解)
#define uint unsigned int //define为宏定义,后面不能加分号,它是预处理指令,不是语句,这里用uint代替了unsigned int

uint i;	//定义了i这个变量
void main()	 //主函数
{
while(1) //这里使用while(1){}语句,由于while里表达式是1,永远为真,所以程序会一直执行{}中的内容
{
	P1 = 0xaa;  //aa转为二进制数为1010 1010 就是代表着第1 3 5 7  4个LED灯亮
	i = 65535;
	while(i--);	 //用于延时
	P1 = 0xff;	 //ff转为二进制数为1111 1111 就是代表着1 2 3 4 5 6 7 8   8个LED灯全灭
	i = 65535;
	while(i--);	 //用于延时
}  //大括号中的内容大致意思为 灯点亮了 延时一会 灯灭了 再延时一会 灯亮了 延时一会这样根据人的视觉效果就会显示出LED灯的闪烁
} 

从图中我们看出第1 3 5 7个LED灯在闪烁
在这里插入图片描述

(3)LED流水灯

#include <reg52.h>
#include <intrins.h> //循环移位函数的标准库函数

#define uint unsigned int
#define uchar unsigned char //宏定义

uchar temp;  //定义LED灯相关变量
void delay(uint z)
{
uint x,y;
for(x = z;x>0;x--)
	for(y = 144;y>0;y--);
}  //毫秒延时函数定义  
void delay(uint z);  //先进行声明延时函数
void main()	 //main函数自身就会循环
{
	temp = 0xfe; //fe 代表的是二进制的1111 1110就是代表第1个灯亮
	P1 = temp;
	delay(100);	 //调用延时函数
	while(1)
{
	temp = _crol_(temp,1);	//循环左移动函数 这里的1代表每次左移一个单位
	P1 = temp;
	delay(100);	  //调用延时函数
}
}

从图片中我们看到了LED1从右边往左边进行闪烁,像流水一样进行。
在这里插入图片描述
注意:单片机的开发是硬件的开发,大家一定要多进行实践,多看现象,这样才能更快的掌握单片机的技巧。

  • 16
    点赞
  • 116
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值