嵌入式51单片机01-开发版介绍与LED流水灯系列

news2024/11/27 20:58:30

文章目录

      • 1. STC89C52单片机介绍
      • 2. 单片机预备知识
      • 3. LED灯操作系列
        • 1. 点亮LED
          • (1)LED原理图连接方式
          • (2) proteus接线图
          • (3)keil代码
        • 2. LED灯闪烁
          • (1)实验电路图
          • (2)keil源代码
          • (3)实验结果
        • 3. switch条件判断和开关控制流水灯
          • (1)实验电路图
          • (2)keil源代码
          • (3)实验效果
        • 4. switch条件判断流水灯
          • (1)keil源代码
          • (2)实验结果
        • 5. 位运算实现流水灯
          • (1)keil源代码
        • 6. 按键控制流水灯
          • (1)实验电路图
          • (2)keil源代码
          • (3)实验结果

1. STC89C52单片机介绍

  • 所属系列:51单片机系列

  • 公司:STC公司

  • 位数:8位

  • RAM:512字节

  • ROM:8K(Flash)

  • 工作频率12MHz

  • 单片机版型
    请添加图片描述

  • 单片机开发板具体结构
    请添加图片描述

    1. 超声波模块接口
    2. NRF24L01无线模块接口
    3. 无源蜂鸣器
    4. DS18B20温度传感器接口
    5. 红外接收头
    6. 电源开关
    7. 自动下载电路(CH340转换芯片)
    8. miniUSB接口(供电或下载程序或串口通信)
    9. ISP下载接口(为AT及AVR系列单片机下载)
    10. 复位按键
    11. LCD12864模块接口
    12. LCD1602模块接口
    13. 数码管模块(2个四位一体共阴数码管)
    14. DS1302时钟模块
    15. LED模块(8个LED)
    16. 独立按键模块(4个独立按键)
    17. 单片机所有IO口(方便用户外扩功能模块)
    18. 单片机紧缩座
    19. 矩阵按键模块
    20. LED点阵模块
    21. 74HC245芯片(驱动数码管模块)
    22. 步进电机模块(五线四项步进电机,驱动芯片ULN2003,也可以驱动直流电机)
    23. 74HC138译码器芯片(控制数码管位选)
    24. EEPROM模块(24C02芯片)
    25. 74HC595模块(内含8个LED)
    26. AD/DA模块

2. 单片机预备知识

  • 电平特性

    • 数字电路中只有两种电平:高电平和低电平

      • 高电平:5V或3.3V,取决于单片机电源;
      • 低电平:0V。
    • RS232电平:计算机串口的电平

      • 高电平:-12V;
      • 低电平:12V。
    • 所以当我们用单片机跟电脑通信的时候,我们要通过各种元器件将单片机的电平转换为计算机可识别的电平才能跟电脑进行通信。

  • 8051单片机内部结构图
    请添加图片描述

    • 总线:是计算机各部件之间传送信息的公共通道。微机中有内部总线和外部总线两类。内部总线是CPU内部之间的连线;外部总线是CPU与其他部件之间的连线。外部总线有三种:数据总线、地址总线、控制总线。

    • CPU:由运算和控制逻辑组成,同时还包括中断系统和部分外部特殊功能寄存器。

    • RAM:用于存放可以读写的数据,如运算的中间结果、最终结果以及欲显示的数据。

    • ROM:用以存放程序、一些原始数据和表格。

    • I/O口:四个8位并行I/O口,既可以用作输入又可以用作输出。

    • T/C:两个定时器/计数器,既可以工作在定时模式,也可以工作在计数模式。

    • 五个中断源的中断控制系统。

    • 一个全双工UART的串行I/O口,用于实现单片机之间或单片机与微机之间的串行通信。

    • 片内振荡器和时钟产生电路,石英晶体和微调电容需要外接。最高振荡频率取决于单片机型号及性能。

  • 单片机工作的基本时序

    • 时钟周期:也称振荡周期, 是指为单片机提供时钟脉冲信号的振荡源的周期,我们开发板上为12MHz。

    • 状态周期:每个状态周期为时钟周期的 2 倍, 是振荡周期经二分频后得到的。

    • 机器周期:一个机器周期包含 6 个状态周期S1~S6, 也就是 12 个时钟周期。 在一个机器周期内, CPU可以完成一个独立的操作。

    • 指令周期:它是指CPU完成一条操作所需的全部时间。 每条指令执行时间都是由一个或几个机器周期组成。MCS - 51 系统中, 有单周期指令、双周期指令和四周期指令。

  • 单片机IO口的结构
    在这里插入图片描述

    • 上拉电阻就是将不确定的信号通过一个电阻拉到高电平,同时此电阻起到一个限流的作用,下拉就是下拉到低电平。

    • 作用

      1. OC门要输出高电平,外部必须加上上拉电阻

      2. 加大普通IO的驱动能力

      3. 起到限流的作用

      4. 抵抗电磁干扰

  • C-51数据类型扩充定义

    • sfr:特殊功能寄存器声明

      sfr   变量名=地址值;
      
    • sbit:特殊功能位声明

      sbit  变量名=地址值;
      
    • bit:位变量声明

    • #ifndef…#endif :条件编译,常用于头文件的定义还有一些程序条件编译

      #ifndef __LED_H
      #define __LED_H
      
      #endif
      
  • 单片机最小系统

    • 电源电路
    • 复位电路
    • 时钟电路
    • 下载电路

3. LED灯操作系列

1. 点亮LED

(1)LED原理图连接方式

在这里插入图片描述

​ LED的正极通过电阻连接到电源上,阴极连接P2口,此时只有给P2口低电平的时候,LED灯才会亮。

(2) proteus接线图

在这里插入图片描述

(3)keil代码
#include "reg52.h"  


//将单片机的P2.0端口定义为led
sbit led=P2^0;	   


void main()
{
	while(1)
	{
		//P2.0端口设置为低电平
		led=0;	
	}		
}

2. LED灯闪烁

(1)实验电路图

在这里插入图片描述

电路图与点亮LED灯的电路图相同,设置P2.0口输出低电平的时候,LED灯会点亮;设置P2.0口为低电平的时候,LED灯会熄灭。然后通过一定的延时,可以让LED灯出现闪烁的效果。

(2)keil源代码
#include <reg51.h>
#include "intrins.h"


//延时函数,会提供500ms的延时
void Delay500ms()		//@12.000MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 4;
	j = 205;
	k = 187;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}


void main()
{
	while(1)
	{
        //灯亮
		P2=0xfe;
        //延时
		Delay500ms();
        //灯灭
		P2=0xff;
        //延时
		Delay500ms();
	}
}
(3)实验结果

从结果可以看出,LED灯在闪烁,间隔500ms亮灭。

3. switch条件判断和开关控制流水灯

(1)实验电路图

在这里插入图片描述

(2)keil源代码
#include<AT89X51.h>
#include "intrins.h"


int t=0,j,i;


void Delay150ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 2;
	j = 13;
	k = 237;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void main()
{
	while (1)
	{	
		if (P3_1==0)
		{
			Delay150ms();	   //消振
			if (P3_1==0)
			{
				t++;
				if (t==9)
					t=1;
			}
		}
		
		switch(t)
		{
			case 1:P2=0xfe;break;
			case 2:P2=0xfd;break;
			case 3:P2=0xfb;break;
			case 4:P2=0xf7;break;
			case 5:P2=0xef;break;
			case 6:P2=0xdf;break;
			case 7:P2=0xbf;break;
			case 8:P2=0x7f;break;
			default :P2=0xff;break;
		}
	}
}
(3)实验效果

从实验结果可以看出,每次按键按下的时候,LED灯亮的位置会向右移动一位。

4. switch条件判断流水灯

(1)keil源代码
#include<AT89X51.h>

void delay(unsigned int n)
{
	unsigned int i,j;
	for (i=n;i>0;i--)
	for (j=110;j>0;j--);
}

void main()
{
	unsigned int t=0;
	while (1)
	{	
		switch(t)
		{
			case 0:P2=0xfe;delay(250);break;
			case 1:P2=0xfd;delay(250);break;
			case 2:P2=0xfb;delay(250);break;
			case 3:P2=0xf7;delay(250);break;
			case 4:P2=0xef;delay(250);break;
			case 5:P2=0xdf;delay(250);break;
			case 6:P2=0xbf;delay(250);break;
			case 7:P2=0x7f;delay(250);break;
			default :P2=0xff;delay(250);break;
		}
		t++;
		t=t%8;
	}
}
(2)实验结果

5. 位运算实现流水灯

(1)keil源代码
#include<AT89X51.h>
int i,j,t;
int a[8]={0,1,1,1,1,1,1,1};

void delay(int n)
{
	for (i=n;i>0;i--)
	for (j=150;j>0;j--);
}

void main()
{
	while(1)
	{	
		P2=0xff;
		delay(250);
		for (t=0;t<8;t++)
		{	
			P2=(P2<<1)+a[t];
			delay(250);
		}
	}
}

6. 按键控制流水灯

(1)实验电路图

在这里插入图片描述

(2)keil源代码
#include<AT89X51.h>

void delay(int n)
{
	unsigned int i,j;
	for (i=n;i>0;i--)
	for (j=150;j>0;j--);
}

void main()
{
	int t;
	while (1)
	{
		if (P3_1==0)
		{
			P2_0=0;	P2_1=0;
			delay(250);
			P2_0=1;	P2_1=1;
			delay(250);

		}
		if (P3_0==0)
		{
			for (t=0;t<2;t++)
			{
				P2_2=0;	P2_3=0;
				delay(250);
				P2_2=1;	P2_3=1;
				delay(250);
			}
		}

		if (P3_2==0)
		{
			for (t=0;t<3;t++)
			{
				P2_4=0;	P2_5=0;
				delay(250);
				P2_4=1;	P2_5=1;
				delay(250);
			}
		}

		if (P3_3==0)
		{
			for (t=0;t<4;t++)
			{
				P2_6=0;	P2_7=0;
				delay(250);
				P2_6=1;	P2_7=1;
				delay(250);
			}
		}
	}
}
(3)实验结果

从实验结果可以看出,用四个按键控制四组LED灯的闪烁,第一组使用按键P31,前面两个LED灯会闪烁一次;第二组使用按键P30,第三第四个LED灯会闪烁两次;第三组使用按键P32控制,第五第六个LED灯会闪烁三次;第四组使用按键P33控制,最后两个LED灯会闪烁四次(顺序从左向右)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/428819.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

每日一题104——转置矩阵

给你一个二维整数数组 matrix&#xff0c; 返回 matrix 的 转置矩阵 。 矩阵的 转置 是指将矩阵的主对角线翻转&#xff0c;交换矩阵的行索引与列索引。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[[1,4,7],[2,5,8],[3,6,9]] 示…

大佬们隔空互怼

阅读本文大概需要 1.14 分钟。1、最近国内各大互联网公司都在掀起一股大模型热潮&#xff0c;要想让这股热潮变得更持久更精彩&#xff0c;离不开互联网大佬们的添砖加瓦。比如上周搜狗的王小川跟百度的肖阳&#xff0c;两位互联网大佬隔空互怼的场景&#xff0c;一度让大家觉得…

时序分析 49 -- 贝叶斯时序预测(一)

贝叶斯时序预测&#xff08;一&#xff09; 时序预测在统计分析和机器学习领域一直都是一个比较重要的话题。在本系列前面的文章中我们介绍了诸如ARIMA系列方法&#xff0c;Holt-Winter指数平滑模型等多种常用方法&#xff0c;实际上这些看似不同的模型和方法之间都具有千丝万缕…

SpringBoot中处理日期的两种方式(消息转换器)

在Spring Boot中,我们通常会使用Jackson来序列化和反序列化Java对象到JSON。在进行日期序列化时,我们需要指定日期格式,否则Jackson会使用默认格式,这可能不是我们想要的。要指定日期格式,有两种方式: 如果没有处理按照默认的结果如下图: 所以我们需要通过一些手段来对日期进行…

总结一下Redis的缓存雪崩、缓存击穿、缓存穿透

缓存是提高系统性能的一种常见手段&#xff0c;其中Redis是一种常用的高性能缓存数据库。但是在使用缓存时&#xff0c;可能会遇到一些问题&#xff0c;比如缓存击穿、缓存穿透、缓存雪崩等问题&#xff0c;本文将介绍这些问题的概念、原因以及解决方案。 缓存击穿 缓存击穿指…

Jenkins——用户管理、授权策略配置以及Jenkins安全配置管理

这里写目录标题一、Jenkins用户管理1、进入系统管理界面2、创建用户3、编辑用户信息4、编辑用户信息5、删除用户信息二、Jenkins授权策略配置1、授权策略插件2、安装插件:Role-based Authorization Strategy3、管理角色a、全局角色 Global rolesb、项目角色 Item rolesc、节点角…

CVPR | 达摩院开源自监督学习框架CoKe, 单机8卡可训练

团队模型、论文、博文、直播合集&#xff0c;点击此处浏览 一、论文 论文链接: Unsupervised Visual Representation Learning by Online Constrained K-Means 代码链接&#xff1a;https://github.com/idstcv/CoKe 二、背景 虽然基于instance的自监督学习方法在ImageNet上…

注册claude AI账号 slack工作区账号

Claude 是建立在 slack工作区的一个AI人工助手&#xff0c;更像是将chatgpt集成到了会议模式&#xff0c;一个账号实际上拥有了你的会议室和你的AI助手&#xff0c;你可以让你的朋友和同事进入你的房间体验。 Claude是不是openai的产物&#xff1f;目前还不知道&#xff0c;不…

RS232/RS485/RS422 接线说明

RS232/RS485/RS422 接线 文章目录RS232/RS485/RS422 接线RS232RS485422RS232 设备A 和 设备B 没有硬件流控 设备A设备BTXDRXDRXDTXDGNDGND 设备A 和 设备B 使用RTS/CTS 做硬件流控 一般使用RTS/CTS都会由232芯片自动控制&#xff0c; 比如XR21V1414, 需要设备gpio mode 为00…

Docker安装+利用docker安装MySQL(保姆级教程)

前言&#xff1a;本文基于docker安装MySQL&#xff0c;如果还没安装docker的童鞋&#xff0c;点击这里&#xff08;超大声&#xff09;安装卸载老版本docker&#xff08;超详细&#xff09; 一、在docker仓库搜你想要的镜像版本 docker镜像仓库 打开官网&#xff0c;在搜索框…

Docker 镜像制作 服务编排 私有仓库

DockerNginx部署Redis部署Dockerfile镜像制作容器转为镜像dockerfileDocker服务编排Docker ComposeDocker Compose安装使用docker compose编排nginxspringboot项目Docker私有仓库私有仓库搭建将镜像上传至私有仓库Nginx部署 案例&#xff1a;需求 在Docker容器中部署Nginx&…

【ARMv8 异常模型入门及渐进2 - 系统寄存器访问方法:op1,CRn,CRm,op2】

文章目录1.1 ARMv8 系统寄存器访问概要1.1.1 系统寄存器访问级别1.1.2 ARMv8 系统寄存器编码1.1 ARMv8 系统寄存器访问概要 ARMv8中&#xff0c;取消了协处理器&#xff0c;之前协处理器实现的功能&#xff0c;全部由系统寄存器来是实现。对于系统寄存器的访问&#xff0c;使用…

javaweb在校大学生贷款管理系统ns08a9

1系统主要实现&#xff1a;学生注册、填写详细资料、申请贷款、学校审核、银行审核、贷后管理等功能&#xff0c; (1) 学生注册&#xff1a;学生通过注册用户&#xff0c;提交自己的详细个人资料&#xff0c;考虑现实应用中的安全性&#xff0c;资料提交后不可修改&#xff1b;…

Springboot + MySQL+ JPA Ⅲ delete方法详解

一、deleteById(Id id) 和 delete(T entity) 为什么要把这两个方法放在一起呢&#xff1f;我们先看源码再说 deleteById源码&#xff08;通过id进行删除&#xff09; Transactional Override public void deleteById(ID id) {Assert.notNull(id, ID_MUST_NOT_BE_NULL);delet…

@爱打游戏的你,当游戏测试是什么感觉?

爱打游戏的你&#xff0c;当游戏测试是一种什么感觉&#xff1f; 去年《宝可梦朱紫》大火的那段时间&#xff0c;想必各位爱好游戏的友友们都刷到过这样的图吧&#xff1a;&#xff08;量子纠缠&#xff09;&#xff08;天怎么黑了&#xff09;&#xff08;弹簧巨怪&#xff09…

手敲Mybatis(九)-结果集处理器

1.前言-背景介绍 上节我们处理了参数处理器&#xff0c;本节我们处理结果集处理器&#xff0c;之前我们写了一个DefaultResultSetHandler&#xff0c;我们把返回结果获取对象&#xff0c;填充值什么的写到了一起&#xff0c;流程没有进行解耦&#xff0c;并且只接收了Object的…

不通过鲁大师进行硬件检测

文章目录简介dxdiag系统信息设备管理器任务管理器PowerShelldxdiag系统信息设备管理器任务管理器PowerShellTODO&#xff1a;CPU-ZTODO&#xff1a;Everest参考文献简介 不少二手电脑重装系统后发现是假配置&#xff08;特别是XP系统&#xff09;&#xff0c;可以使用系统自带…

基于Vue2实现滚动过程中数据懒加载

以下为实现滚动懒加载的过程&#xff1a; 1、在data对象中定义了items数组&#xff0c;用于存放已加载的item&#xff0c;loading状态&#xff0c;当前页数page&#xff0c;每页数量pageSize&#xff0c;以及距离底部的阈值threshold。 2、在mounted钩子函数中&#xff0c;首次…

Adaptive AUTOSAR——State Management(VRTE 3.0 R21-11)

状态管理是自适应平台服务中的一个功能集群。 在自适应平台中&#xff0c;状态决定了一组活动的自适应应用程序。 特定于项目的应用程序&#xff0c;即状态管理器&#xff0c;决定何时请求状态更改&#xff0c;从而更改当前活动的应用程序集。状态管理器是特定于项目的&#…

【Golang】三分钟让你快速了解Go语言为什么我们需要Go语言?

博主简介&#xff1a;努力学习的大一在校计算机专业学生&#xff0c;热爱学习和创作。目前在学习和分享&#xff1a;数据结构、Go&#xff0c;Java等相关知识。博主主页&#xff1a; 是瑶瑶子啦所属专栏: Go语言核心编程近期目标&#xff1a;写好专栏的每一篇文章 目录一、Go语…