单片机 | 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语言—函数
函数库函数自定义函数函数的参数函数的调用函数的嵌套调用和链式访问函数的声明和定义函数递归递归与迭代函数递归的经典题目维基百科(台湾方面维护的,翻译形式跟大陆有所差异)中对函数的定义:子程序在计算机科学中,子…...

Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...

HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...

AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...

R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...

嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)
目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 编辑编辑 UDP的特征 socke函数 bind函数 recvfrom函数(接收函数) sendto函数(发送函数) 五、网络编程之 UDP 用…...