单片机 | 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语言—函数
函数库函数自定义函数函数的参数函数的调用函数的嵌套调用和链式访问函数的声明和定义函数递归递归与迭代函数递归的经典题目维基百科(台湾方面维护的,翻译形式跟大陆有所差异)中对函数的定义:子程序在计算机科学中,子…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
[USACO23FEB] Bakery S
题目描述 Bessie 开了一家面包店! 在她的面包店里,Bessie 有一个烤箱,可以在 t C t_C tC 的时间内生产一块饼干或在 t M t_M tM 单位时间内生产一块松糕。 ( 1 ≤ t C , t M ≤ 10 9 ) (1 \le t_C,t_M \le 10^9) (1≤tC,tM≤109)。由于空间…...
HTML版英语学习系统
HTML版英语学习系统 这是一个完全免费、无需安装、功能完整的英语学习工具,使用HTML CSS JavaScript实现。 功能 文本朗读练习 - 输入英文文章,系统朗读帮助练习听力和发音,适合跟读练习,模仿学习;实时词典查询 - 双…...
Python爬虫(四):PyQuery 框架
PyQuery 框架详解与对比 BeautifulSoup 第一部分:PyQuery 框架介绍 1. PyQuery 是什么? PyQuery 是一个 Python 的 HTML/XML 解析库,它采用了 jQuery 的语法风格,让开发者能够用类似前端 jQuery 的方式处理文档解析。它的核心特…...
LINUX编译vlc
下载 VideoLAN / VLC GitLab 选择最新的发布版本 准备 sudo apt install -y xcb bison sudo apt install -y autopoint sudo apt install -y autoconf automake libtool编译ffmpeg LINUX FFMPEG编译汇总(最简化)_底部的附件列表中】: ffmpeg - lzip…...
【汇编逆向系列】四、函数调用包含单个参数之Double类型-mmword,movsd,mulsd,addsd指令,总结汇编的数据类型
一、汇编代码 上一节开始,讲到了很多debug编译独有的汇编方式,为了更好的区分release的编译器优化和debug的区别,从本章节开始将会提供debug和release的汇编用作对比 Debugb编译 single_double_param:00000000000000A0: F2 0F 11 44 24 08…...
sql列中数据通过逗号分割的集合,按需求剔除部分值
前置 不会REGEXP 方法的需要在这里学习一下下 记sql字段逗号分隔,通过list查询 功能点 现有一个表格中一列存储的是标签的集合,通过逗号分割 入下: 其中tag_ids是逗号分割的标签,现在需要删除标签组中的一些标签,因…...
