单片机 | 51单片机实践
【金善愚】 单片机应用实践——基础篇 笔记整理
课程视频 :https://space.bilibili.com/483942191/channel/collectiondetail?sid=144001
仿真软件:Proteus 8.13
安装链接:https://pan.baidu.com/s/1-1fscykdvulV60xA4Hygaw?pwd=xeob
代码软件:Keil μvision V5.14.2
安装链接:https://pan.baidu.com/s/1MRdG2EkxORr6M6XH-n5ang?pwd=l2rm
文章目录
- 一、点亮LED 灯
- 1.仿真原理图
- 2.代码
- 2.软硬件关联
- 二、LED 闪烁
- 1.基本数据类型
- 2.代码
- 2.调试
- 二、LED 流水灯
- 1.用简单顺序语句的方法实现
- 2.用数组的方法实现(多文件)
- 3.用库函数的方法实现
- 4.用移位运算符的方法实现
- 三、蜂鸣器
- 总结
一、点亮LED 灯
1.仿真原理图

电阻 RES
电容 CAP
晶振 crystal
按键 button
2.代码
//包含单片机的头文件,建立软件和硬件的联系
#include<reg51.h>//sbit LED0 = P1^0; //位操作,取P1的0位命名为LED
//sbit LED1 = P1^1;
//sbit LED2 = P1^2;
//sbit LED3 = P1^3; void main()
{while(1) //保持循环执行{P1 = 0xF0; //P1.7 - P1.0 赋值 1111_0000//LED0 = 0;//LED1 = 0;//LED2 = 0;//LED3 = 0; //P1其他位默认为1}
}
2.软硬件关联
(1)生成HEX文件
a.点击图示的快捷图标

b.生成

c.编译

d.文件位置

(2)仿真中关联代码
a.双击单片机,找到HEX文件位置,关联代码

(3)开始仿真


二、LED 闪烁
1.基本数据类型

2.代码
(1)用循环语句方式
#include<reg5l.h>void main ( )
{unsigned int i;//无符号整形0~65535while (1){i =20000;P1 = 0xFO;//1111 0000while ( i--){}i = 20000;P1 = 0x0F;//0000 1111while ( i--);//for(i = 0 ; i<50000;i++) //用for语句}
}
(2)用延时函数方式
#include<reg51.h>void delay();//声明函数void main()
{while(1) {P1 = 0xf0;delay();P1 = 0x0f;delay(); }
}void delay()
{unsigned int ms = 500000;while(ms--){ }}
(3)用带参数的延时函数
/****************************************
功 能:带有参数的延时函数实现小灯的闪烁
时 间:****/**/**
****************************************/#include<reg51.h>//声明引脚
sbit LED = P1^7;//函数声明
void DelayXms(unsigned int xms);/****************************************
函数名: main
功 能: 主函数
参 数: 无
返回值: 无
****************************************/
void main()
{while(1) {LED = 0;DelayXms(1000);//调用函数LED = 1;DelayXms(1000); }
}/****************************************
函数名: DelayXms
功 能: 延时函数
参 数: unsigned int
返回值: 无
****************************************/
void DelayXms(unsigned int xms)
{unsigned int i,j; // 0 -65535 0000H - FFFFHfor(i = xms;i>0;i--){for(j = 124;j>0;j--){}}
}
2.调试
(1)设置
晶振和仿真


(2)进入调试模式

(3)时间等状态

(4)分步调试

①运行到鼠标所在位置
②单步运行
③进入函数
④运行全部(直至断点)
⑤设置断点
二、LED 流水灯
1.用简单顺序语句的方法实现
#include<reg51.h>void DelayXms(unsigned int xms); //函数声明,或者将延迟函数放在main()函数前面,否则会报错void main()
{while(1) {P1 = 0xfe; //1111 1110DelayXms(1000); //调用函数P1 = 0xfd; //1111 1101DelayXms(1000); P1 = 0xfb; //1111 1011DelayXms(1000);P1 = 0xf7; //1111 0111DelayXms(1000);P1 = 0xef; //1110 1111DelayXms(1000);P1 = 0xdf; //1101 1111DelayXms(1000);P1 = 0xbf; //1011 1111DelayXms(1000);P1 = 0x7f; //0111 1111DelayXms(1000);}
}//延时函数
void DelayXms(unsigned int xms)
{unsigned int i,j; // 0 -65535 0000H - FFFFHfor(i = xms;i>0;i--)for(j = 124;j>0;j--);
}
2.用数组的方法实现(多文件)
1.创建工程目录下新建4个文件夹,并修改设置下的存放路径
Listings 放中间文件
Output 放输出HEX等文件
Project 放工程文件
Source 放 .c、 .h文件

2.创建模块的 .c文件并创建其对应的.h文件
- .c文件负责函数的定义及变量的定义
- .h文件负责函数的声明及变量的声明(不允许赋初值)以及常量和I/O口的宏定义
(1) delay.c
#include"delay.h" //""头文件会在当前目录下查找。< >头文件一般是系统头文件,会在安装目录下寻找/*************************************
函数名:DelayXms
功 能:毫秒级延时函数
参 数: unsigned int(1 - 65535)
返回值:无
***********************************/void DelayXms(unsigned int xms)
{unsigned int i,j; // 0 -65535 0000H - FFFFHfor(i = xms;i>0;i--)for(j = 124;j>0;j--);
}
(2) delay.h
#ifndef __DELAY_H__
#define __DELAY_H__void DelayXms(unsigned int xms); //声明加分号#endif
2.创建main函数的 .c文件,可直接引用模块头文件使用
main.c
#include<reg51.h>
#include"delay.h"unsigned char code LEDBUF[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
//创建数组,常量可存放在ROM中,添加关键词code。变量可存放在RAM中void main()
{unsigned char cnt;//unsigned char 类型范围是0 -255while(1) {for (cnt = 0; cnt<8;cnt++){P1 = LEDBUF[cnt];DelayXms(1000);}}
}
3.用库函数的方法实现
1._crol_函数
_crol_函数功能:将 c 进行b位左位移,并将值以unsigned char类型返回
//文档定义
#include <intrins.h>unsigned char _crol_ (
unsigned char c, /* character to rotate left */
unsigned char b); /* bit positions to rotate */
函数返回类型为unsigned char,函数的两个形参也是unsigned char类型。
c 为要被进行 位左移 的形式参数
b 为要进行的 位移数
注释:向左循环移位时,从左边出去会从右边重新补入
2._cror_函数
与_crol_函数类似,区别只是进行的是右位移
注释:向右循环移位时,从右边出去会从左边重新补入
3.main.c 代码
#include<reg51.h>
#include <intrins.h>
#include"delay.h"void main()
{unsigned char temp = 0xfe; //1111 1110while(1){P1 = temp;temp = _crol_(temp,1);DelayXms(1000);}
}
4.用移位运算符的方法实现
1.位运算符 及 位表达式
⚠️注意:位表达式c<<1的值是0011 1100B,而c的值并未改变,仍是1001 1110B。移出补0。
2.代码
(1)main.c 用移位+补位方法
#include<reg51.h>
#include <intrins.h>
#include"delay.h"void main()
{unsigned char temp = 0xfe; //1111 1110while(1){P1 = temp; // 输出DelayXms(1000); // 延时if (temp & 0x80) // 判断temp最高位是否为1{temp = temp<<1; // 左移temp = temp|1; // 如果左移之前temp最高位为1,则在temp的最低位补1}else{temp<<=1; // 左移}}
}
(2)main.c 用移位+补位方法
#include<reg51.h>
#include <intrins.h>
#include"delay.h"void main()
{unsigned char temp = 0x1; //0000 0001unsigned char i;while(1){P1 = ~(temp<<i++); DelayXms(1000); if (8 == i) i=0; }
}
三、蜂鸣器
1.蜂鸣器工作电路

图中 D4为 续流二极管:
一种配合电感性负载使用的二极管,当电感性负载的电流有突然的变化或减少时,电感二端会产生突变电压,可能会破坏其他元件。配合续流二极管时,其电流可以较平缓地变化,避免突波电压的发生。
1.原理图

2.代码
#include<reg51.h> #include"delay.h"sbit Sound = P3^7;
void main()
{unsigned int i;while(1){for(i = 0;i<100;i++){Sound = ~Sound;DelayXms(1);}for(i = 0;i<100;i++){Sound = ~Sound;DelayXms(5);}}
}
总结
以上就是本文要讲的内容。
相关文章:
单片机 | 51单片机实践
【金善愚】 单片机应用实践——基础篇 笔记整理 课程视频 :https://space.bilibili.com/483942191/channel/collectiondetail?sid144001 仿真软件:Proteus 8.13 安装链接:https://pan.baidu.com/s/1-1fscykdvulV60xA4Hygaw?pwdxeob 代…...
根据时间戳获取总用时(天时分秒)
//获取总用时(天时分秒) export const getTotalTime (time) > { if (!time) { return ""; } let s time / 1000; let m s / 60; let h m / 60; let day h / 24; if (Math.floor(day)) { return Math.floor(day) "天" Mat…...
【独家】华为OD机试 - 符合条件的子串长度 or 连续字串 ABV(C 语言解题)
最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧本期题目:符合条件的子串长度 or 连续字…...
达梦数据库 linux安装
检查 Linux(Unix)系统信息 如果用户的 DM 软件安装包是经过数字签名的,请按官网进行相关操作。此处忽略。 获取系统位数 getconf LONG_BIT 查询操作系统release信息 lsb_release -a 查询系统信息 cat /etc/issue 查询系统名称 uname -a 之所以要先检查系统信息&…...
数字孪生颠覆传统铝材挤压生产,全新生产方式即将到来!
随着市场经济的发展,各种新型的高科技建筑材料相继出现,所有的基础工程均需要大量的建筑,需要大量门窗和建筑材料,而铝及其铝合金在其中占有重要的地位。随着时代的进步,材料的应用也发生着变化。因铝合金型材具有强度…...
会声会影2023新版本功能详情讲解
会声会影2023Corel VideoStudio一款功能丰富的视频编辑软件。会声会影2023简单易用,具有史无前例的强大功能,拖放式标题、转场、覆叠和滤镜,色彩分级、动态分屏视频和新增强的遮罩创建器,超越基本编辑,实现影院级效果。…...
nodejs+vue文旅门户信息网站 elementui旅游项目推荐系统 景点门票预订网站vscode
在社会快速发展的影响下,服务行业继续发展,随着旅游的人数不断增加,使哈尔滨旅游项目推荐平台的管理和运营比过去十年更加信息化,依照这一现实为基础,设计一个快捷而又方便的网上哈尔滨旅游项目推荐平台是一项十分重要…...
学习HM微博项目第4天
步骤:OAuth授权01_加载登录界面 -> OAuth授权02_获得accessToken -> OAuth授权03_存储账号信息 -> OAuth授权04_封装账号存储 -> OAuth授权05_封装控制器的切换 OAuth授权01_加载登录界面 为了测试方便,暂时把window的根控制器固定设置为授…...
一次完整的OCR实践记录
一、任务介绍 这次的任务是对两百余张图片里面特定的编号进行识别,涉及保密的原因,这里就不能粘贴出具体的图片了,下面粘贴出一张类似需要识别的图片。 假如说我的数据源如上图所示,那么我需要做的工作就是将上面图片里面标红的数…...
Java中常见的密码学知识
现代密码学 散列函数 散列函数,也见杂凑函数、摘要函数或哈希函数,可将任意长度的消息经过运算,变成固定长度数值,常见的有MD5、SHA-1、SHA256,多应用在文件校验,数字签名中。 MD5 可以将任意长度的原文生…...
Leetcode.2171 拿出最少数目的魔法豆
题目链接 Leetcode.2171 拿出最少数目的魔法豆 Rating : 1748 题目描述 给你一个 正 整数数组 beans,其中每个整数表示一个袋子里装的魔法豆的数目。 请你从每个袋子中 拿出 一些豆子(也可以 不拿出),使得剩下的 非空…...
day1 计算机组成与结构考点汇总
一、重点知识点 计算机硬件组成、运算器、控制器奇偶校验码、循环冗余校验码、海明码指令系统:指令操作数寻址方式、CISC和RISC、指令流水线的计算存储系统:分级存储、局部性原理、cache、主存编址计算、磁盘输入输出技术:程序查询方式、中断…...
Java虚拟机的类加载机制
Java虚拟机的类加载机制综述类的生命周期类加载器双亲委派模型---综述 我们编写的Java代码如何能在一个操作系统上运行呢?一般来说,我们使用javac命令将.java文件编译成.class文件,也就是Java字节码文件,然后由JVM将字节码文件加…...
分治法实现合并排序(归并排序),理解分治算法思想,实现分治算法的完美例子合并排序(含码源与解析)
🎊【数据结构与算法】专题正在持续更新中,各种数据结构的创建原理与运用✨,经典算法的解析✨都在这儿,欢迎大家前往订阅本专题,获取更多详细信息哦🎏🎏🎏 🪔本系列专栏 -…...
Typescript 类 (class)
基本用法 (通过关键字 class) // 基本用法 class VueService {constructor() {} // 构造器 } 类的约束(通过关键字 implements) // 接口定义属性类型 interface VueProps {name: stringinit: () > void }// 约束类 class VueService implements Vue…...
KDZD程控超低频高压发生器
一、产品概述 本产品接合了现代数字变频技术,采用微机控制,升压、降压、测量、保护自动化。由于电子化,所以体积小重量轻、大屏幕液晶显示,清晰直观、且能显示输出波形、打印试验报告。 设计指标符合《电力设备专用测试仪器通用…...
【华为OD机试 2023最新 】 过滤组合字符串(C++)
文章目录 题目描述输入描述输出描述用例题目解析C++题目描述 数字0、1、2、3、4、5、6、7、8、9分别关联 a~z 26个英文字母。 0 关联 “a”,”b”,”c”1 关联 “d”,”e”,”f”2 关联 “g”,”h”,”i”3 关联 “j”,”k”,”l”4 关联 “m”,”n”,”o”5 关联 “p”,”q”…...
Java笔记034-坦克大战【2】
目录 坦克大战【2】 线程-应用到坦克大战 坦克大战0.3 思路分析: 代码实现: 坦克大战0.4 增加功能 特别说明 思路分析: 代码实现: 坦克大战0.5 增加功能 思路分析: 代码实现: 坦克大战【2】 …...
【算法】【数组与矩阵模块】桶排序思想解决无序数组排序后相邻数间的最大差值
目录前言问题介绍解决方案代码编写java语言版本c语言版本c语言版本思考感悟写在最后前言 当前所有算法都使用测试用例运行过,但是不保证100%的测试用例,如果存在问题务必联系批评指正~ 在此感谢左大神让我对算法有了新的感悟认识! 问题介绍 …...
C语言—函数
函数库函数自定义函数函数的参数函数的调用函数的嵌套调用和链式访问函数的声明和定义函数递归递归与迭代函数递归的经典题目维基百科(台湾方面维护的,翻译形式跟大陆有所差异)中对函数的定义:子程序在计算机科学中,子…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...
RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...
scikit-learn机器学习
# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...
【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...
Rust 开发环境搭建
环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu 2、Hello World fn main() { println…...
破解路内监管盲区:免布线低位视频桩重塑停车管理新标准
城市路内停车管理常因行道树遮挡、高位设备盲区等问题,导致车牌识别率低、逃费率高,传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法,正成为破局关键。该设备安装于车位侧方0.5-0.7米高度,直接规避树枝遮…...
