【51单片机】点亮LED之经典流水灯

开发环境

  1. 开发板:普中51-单核-A2
  2. 单片机:STC89C52RC(双列直插40引脚 DIP40)
  3. Keil uVision5 v9.61

最新版破解方法自行百度,相关文档和视频资料很多,我自己将这一操作记录下来当做博客发布,CSDN以版权问题审核不通过。在这里插入图片描述

入门学习单片机的第一个教学程序基本都是点灯,无论是51单片机还是STM32,点灯程序在单片机学习的地位无异于其他编程语言学习的"hello,world"程序。点灯程序简单且效果明显,很容易上手,学过单片机的人人都能成为点灯大师。

思路分析

  1. 查看开发板原理图,找到LED模块
    在这里插入图片描述
    如图,D1到D8这8个发光二极管的阳极都连接到了VCC(开发板电源正极),这叫做共阳连接,阴极又分别串联一个电阻连接到P2口的0到7这8个引脚。根据二极管导通原理,要让某个LED亮,对应的引脚就业输出低电平(即输出0)。

编码

点亮一个LED

// Version 1: 点亮D1这一个LED
#include <REGX52.H>

void main()
{
    P2=0XFE;
    while(1)
    {
    }
}

8个LED呈现亮灭亮灭…的状态

// Version 2: 8个LED交替点亮
#include <REGX52.H>

int exitFlag = 0;

int main()
{
    while(1)
    {
        P2 = 0x55;
        if (exitFlag == 1)
        {
            goto EXIT;
        }
    }
EXIT:
    return 0;
}

大部分51单片机教程代码的main函数都是声明为void类型,但是学过C语言的都知道标准的C语言的main函数都是int型的,return 0;是返回给操作系统,告诉系统程序正常执行完毕。但是现在写的点灯程序51单片机没有上操作系统,直接写void main也是有道理的,写成int main(void)纯属我个人习惯,而单片机return 0;又不能写作while(1)里面,否则执行一次就退出,死循环不就失效了,写在循环后面编译又会有一个警告,如下图:
在这里插入图片描述
因此只能使用goto语句加标号,去除这个警告,这也纯属个人习惯。虽然初学C语言的时候,被告知少用goto语句,因为会使得程序执行流程非常混乱,但实际上可以灵活应用,只要有把握就好,尽信书,不如无书,goto被发明出来就一定有用得到的地方。
在这里插入图片描述

流水灯

延时函数

实现流水灯,就不得不提延时函数了,因为单片机执行程序太快,不加延时看不出流水灯效果,需要加延时,让人眼观察到才行。而STC-ISP就可以生成软件延时代码。
从原理图可以看到开发板载的晶振是12Mhz,所以系统频率也选择12Mhz。指令集选STC-Y1,不同指令集件右边描述适用于哪些系列,正如右边所显示:STC-Y1指令集使用于本开发板的单片机系列。
在这里插入图片描述
将生成的代码拷贝到Keil的源代码中。
在这里插入图片描述

编写main函数实现主要功能

#include <REGX52.H>

void Delay100ms();

int exitFlag = 0;

int main()
{
    while(1)
    {
        P2=0xFE;//1111 1110
        Delay100ms();
        P2=0xFD;//1111 1101
        Delay100ms();
        P2=0xFB;//1111 1011
        Delay100ms();
        P2=0xF7;//1111 0111
        Delay100ms();
        P2=0xEF;//1110 1111
        Delay100ms();
        P2=0xDF;//1101 1111
        Delay100ms();
        P2=0xBF;//1011 1111
        Delay100ms();
        P2=0x7F;//0111 1111
        Delay100ms();
        if (exitFlag == 1)
        {
            goto EXIT;
        }
    }
EXIT:
    return 0;
}

/* 延时100ms的函数 */
void Delay100ms()       //@12.000MHz
{
    unsigned char i, j;

    i = 195;
    j = 138;
    do
    {
        while (--j);
    } while (--i);
}

程序升级-使用循环

#include <REGX52.H>

void Delay100ms();

int exitFlag = 0;

int main()
{
    int i;
    P2 = ~0x01; // 初始值,用于初始显示
    while(1)
    {
        for(i = 0; i < 7; i++)
        {
            P2 = ~(0x01 << i);
            Delay100ms();
        }
        
        if (exitFlag == 1)
        {
            goto EXIT;
        }
    }
EXIT:
    return 0;
}

/* 延时100ms的函数 */
void Delay100ms()       //@12.000MHz
{
    unsigned char i, j;

    i = 195;
    j = 138;
    do
    {
        while (--j);
    } while (--i);
}

任意毫秒的延时函数的实现

以上代码是以固定100ms的周期闪烁,很无聊!!其实可以用STC-ISP生成1ms延时函数,并利用这个1ms延时函数生成延时任意毫秒的函数方法。
在这里插入图片描述

#include <REGX52.H>

void Delay1ms();
void DelayXms(int xms);

int exitFlag = 0;

int main()
{
    int i;
    P2 = ~0x01; // 初始值,用于初始显示
    while(1)
    {
        for(i = 0; i < 7; i++)
        {
            P2 = ~(0x01 << i);
            DelayXms(500);  // 以500ms为周期运行流水灯
        }
        
        if (exitFlag == 1)
        {
            goto EXIT;
        }
    }
EXIT:
    return 0;
}

/* 延时1ms */
void Delay1ms()     //@12.000MHz
{
    unsigned char i, j;

    i = 2;
    j = 239;
    do
    {
        while (--j);
    } while (--i);
}

// 传入多少参数,就延时多少毫秒
void DelayXms(int xms)
{
    int i;
    for(i = 0; i < xms; i++)
    {
        Delay1ms();
    }
}

这样之前的延时100ms的函数就可以用DelayXms(100);代替了,之前的延时100ms函数的代码就可以删除掉了。因为Keil C51的编译器检测到某些函数定义了却没被调用会报警告,如果对程序编译完报的warning很难受(强迫症),可以删除实际上没有被调用的无用函数,毕竟嵌入式开发非常看重内存资源,这一点没用的小代码也会占用一定的空间。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构强化】应用题打卡

应用题打卡 数组的应用 对称矩阵的压缩存储 注意&#xff1a; 1. 2.上三角的行优先存储及下三角的列优先存储与数组的下表对应 上/下三角矩阵的压缩存储 注意&#xff1a; 上/下三角压缩存储是将0元素统一压缩存储&#xff0c;而不是将对角线元素统一压缩存储 三对角矩阵的…

King3399 SDK(ubuntu文件系统)编译简明教程

该文章仅供参考&#xff0c;编写人不对任务实验设备、人员及测量结果负责&#xff01;&#xff01;&#xff01; 0 引言 文章主要介绍King3399&#xff08;瑞芯微rk3399开发板&#xff0c;荣品&#xff09;官方SDK&#xff08;Ubuntu文件系统&#xff09;编译过程&#xff0c…

GaussDB关键技术原理:高弹性(六)

书接上文GaussDB关键技术原理&#xff1a;高弹性&#xff08;五&#xff09;从日志多流和事务相关方面对hashbucket扩容技术进行了解读&#xff0c;本篇将从扩容实践方面继续介绍GaussDB高弹性技术。 5 扩容实践 5.1 工具介绍 5.1.1 TPC-C TPC-C(全称Transaction Proces…

Leetcode 540. 有序数组中的单一元素

1.题目基本信息 1.1.题目描述 给你一个仅由整数组成的有序数组&#xff0c;其中每个元素都会出现两次&#xff0c;唯有一个数只会出现一次。 请你找出并返回只出现一次的那个数。 你设计的解决方案必须满足 O(log n) 时间复杂度和 O(1) 空间复杂度。 1.2.题目地址 https:…

[3.4]【机器人运动学MATLAB实战分析】PUMA560机器人逆运动学MATLAB计算

PUMA560是六自由度关节型机器人,其6个关节都是转动副,属于6R型操作臂。各连杆坐标系如图1,连杆参数如表1所示。 图1 PUMA560机器人的各连杆坐标系 表1 PUMA560机器人的连杆参数 用代数法对其进行运动学反解。具体步骤如下: 1、求θ1 PMUMA56

CSS 圆形边框与阴影

目录 1. 圆角边框 1.1 正圆 1.2 圆角矩形 1.3 任意圆角 1.4 某个圆角 2. 盒子阴影 3. 文字阴影 1. 圆角边框 1.1 正圆 1.2 圆角矩形 1.3 任意圆角 1.4 某个圆角 2. 盒子阴影 3. 文字阴影

Vue Mini基于 Vue 3 的小程序框架

新的小程序框架 https://vuemini.org/ Vue Mini 是一个基于 Vue 3 的小程序框架&#xff0c;它允许开发者利用 Vue 3 的强大功能来构建微信小程序。Vue Mini 的核心优势在于它的响应式系统和组合式 API&#xff0c;这些特性让开发者能够以一种更声明式、更高效的方式来编写和…

实景三维赋能城镇数字化规划

在数字化浪潮的推动下&#xff0c;城镇规划正经历着前所未有的变革。实景三维技术以其独特的优势&#xff0c;为城镇数字化规划提供了强大的技术支持。今天&#xff0c;我们将深入探讨实景三维技术如何赋能城镇数字化规划。 一、城镇规划面临的挑战 随着城镇化进程的加快&…

2024年研究生数学建模“华为杯”E题——肘部法则、k-means聚类、目标检测(python)、ARIMA、逻辑回归、混淆矩阵(附:目标检测代码)

文章目录 一、情况介绍二、思路情况二、代码展示三、感受 一、情况介绍 前几天也是参加了研究生数学建模竞赛&#xff08;也就是华为杯&#xff09;&#xff0c;也是和本校的两个数学学院的朋友在网上组的队伍。昨天&#xff08;9.25&#xff09;通宵干完论文&#xff08;一条…

计算机毕业设计 基于Python的热门微博数据可视化分析系统的设计与实现 Python+Django+Vue 可视化大屏 附源码 讲解 文档

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

计算机毕业设计Hadoop+Spark知识图谱体育赛事推荐系统 体育赛事热度预测系统 体育赛事数据分析 体育赛事可视化 体育赛事大数据 大数据毕业设计

《HadoopSpark知识图谱体育赛事推荐系统》开题报告 一、研究背景与意义 随着互联网技术的迅猛发展和大数据时代的到来&#xff0c;体育赛事数据的数量呈爆炸式增长。用户面对海量的体育赛事信息&#xff0c;常常感到信息过载&#xff0c;难以快速找到感兴趣的赛事内容。传统的…

软件管理【1.10】

软件管理【1.10】 13、软件管理13.1.包管理工具rpm13.2.yum和dnf13.2.1.配置yum源13.2.2.只下载安装包,不安装13.2.3.配置本地光盘ISO文件安装13.2.4.配置阿里云epel源13.2.5.base-for-centos7.repo13.2.6.base-for-rocky8.repo13.3.搭建私有yum仓库13.3.1.Apache实现网战功能…

Kafka和RabbitMQ区别

RabbitMQ的消息延迟是微秒级&#xff0c;Kafka是毫秒级&#xff08;1毫秒1000微秒&#xff09; 延迟消息是指生产者发送消息发送消息后&#xff0c;不能立刻被消费者消费&#xff0c;需要等待指定的时间后才可以被消费。 Kafka的单机呑吐量是十万级&#xff0c;RabbitMQ是万级…

sql-labs靶场第二关测试报告

目录 一、测试环境 1、系统环境 2、使用工具/软件 二、测试目的 三、操作过程 1、寻找注入点 2、注入数据库 ①Order by判断列数 ②判断回显地方 ③爆库&#xff0c;查看数据库名称 ④爆表&#xff0c;查看security库的所有表 ⑤爆列&#xff0c;查看users表的所有…

给出向量求叉乘(在垂直的时候可以简化)

1、可以用那个求行列式的方法求叉乘。 2、在两个向量垂直的时候&#xff0c;可以用简化方法&#xff0c;前面幅度相乘&#xff0c;然后ex叉乘ey是ez 注意叉乘结果无论原向量是不是垂直&#xff0c;叉乘结果都与两个向量垂直

HUAWEI New4.9G 与 2.6G 无法正常切换问题处理案例

HUAWEI New4.9G 与 2.6G 无法正常切换问题处理案例 在某地市的 XX 音乐节保障准备期间&#xff0c;为确保活动期间的网络质量&#xff0c;现场新开了 4.9G HUAWEI 室外基站。在网络优化和测试中&#xff0c;发现UE无法实现从 2.6G 到 4.9G 的正常切换。虽然现场具备 4.9G信号覆…

【STM32单片机_(HAL库)】4-5-1【定时器TIM】【感应开关盖垃圾桶】SG90舵机模块实验

1.硬件 STM32单片机最小系统SG90舵机模块 2.软件 sg90驱动文件添加main.c程序 #include "sys.h" #include "delay.h" #include "led.h" #include "sg90.h"int main(void) {HAL_Init(); /* 初始化HAL库 */…

【算法】链表:160.相交链表(easy)+双指针

系列专栏 《分治》 《模拟》 《Linux》 目录 1、题目链接 2、题目介绍 3、解法&#xff08;双指针&#xff09; 返回结果 算法正确性 时间复杂度 4、代码 1、题目链接 160. 相交链表 - 力扣&#xff08;LeetCode&#xff09; 2、题目介绍 ​ 3、解法&#xff08;…

Pikachu-xss防范措施 - href输出 js输出

总体原则&#xff1a; 输入做过滤&#xff0c;输出做转义 过滤&#xff1a;根据业务需要进行过滤&#xff0c;如&#xff1a;输入点要求输入手机号&#xff0c;则只允许输入手机号格式的数字&#xff1b; 转义&#xff1a;所有输出到前端的数据&#xff0c;都根据输出点进行转…

OpenCV计算机视觉库

计算机视觉和图像处理 Tensorflow入门深度神经网络图像分类目标检测图像分割OpenCVPytorchNLP自然语言处理 OpenCV 一、OpenCV简介1.1 简介1.2 OpenCV部署1.3 OpenCV模块 二、OpenCV基本操作2.1 图像的基本操作2.1.1 图像的IO操作2.1.2 绘制几何图像2.1.3 获取并修改图像的像素…