当前位置: 首页 > news >正文

单片机编程实例400例大全(100-200)

今天继续分享单片机编程实例第100-200例。

今天的实例会比前面100复杂一些,我大概看了下,很多都具备实际产品的参考价值。

今天继续分享单片机编程实例第100-200例。

今天的实例会比前面100复杂一些,我大概看了下,很多都具备实际产品的参考价值。

篇幅有限,老规矩,随机分享几例:

1.遥控器红外解码数码管显示

#include<reg52.h>    //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义sbit IR=P3^2;  //红外接口标志#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换
sbit LATCH1=P2^2;//定义锁存使能端口 段锁存
sbit LATCH2=P2^3;//                 位锁存
/*------------------------------------------------全局变量声明
------------------------------------------------*/unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9
unsigned char  irtime;//红外用全局变量bit irpro_ok,irok;
unsigned char IRcord[4];
unsigned char irdata[33];/*------------------------------------------------函数声明
------------------------------------------------*/void Ir_work(void);
void Ircordpro(void);/*------------------------------------------------定时器0中断处理
------------------------------------------------*/void tim0_isr (void) interrupt 1 using 1
{irtime++;  //用于计数2个下降沿之间的时间
}/*------------------------------------------------外部中断0中断处理
------------------------------------------------*/
void EX0_ISR (void) interrupt 0 //外部中断0服务函数
{static unsigned char  i;             //接收红外信号处理static bit startflag;                //是否开始处理标志位if(startflag)                         
{if(irtime<63&&irtime>=33)//引导码 TC9012的头码,9ms+4.5msi=0;irdata[i]=irtime;//存储每个电平的持续时间,用于以后判断是0还是1irtime=0;i++;if(i==33){irok=1;i=0;}}else{irtime=0;startflag=1;}}/*------------------------------------------------定时器0初始化
------------------------------------------------*/
void TIM0init(void)//定时器0初始化
{TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值TH0=0x00; //重载值TL0=0x00; //初始化值ET0=1;    //开中断TR0=1;    
}
/*------------------------------------------------外部中断0初始化
------------------------------------------------*/
void EX0init(void)
{IT0 = 1;   //指定外部中断0下降沿触发,INT0 (P3.2)EX0 = 1;   //使能外部中断EA = 1;    //开总中断
}
/*------------------------------------------------键值处理
------------------------------------------------*/void Ir_work(void)//红外键值散转程序
{switch(IRcord[2])//判断第三个数码值{case 0:DataPort=dofly_DuanMa[1];break;//1 显示相应的按键值case 1:DataPort=dofly_DuanMa[2];break;//2case 2:DataPort=dofly_DuanMa[3];break;//3case 3:DataPort=dofly_DuanMa[4];break;//4case 4:DataPort=dofly_DuanMa[5];break;//5case 5:DataPort=dofly_DuanMa[6];break;//6case 6:DataPort=dofly_DuanMa[7];break;//7case 7:DataPort=dofly_DuanMa[8];break;//8case 8:DataPort=dofly_DuanMa[9];break;//9default:break;}irpro_ok=0;//处理完成标志}
/*------------------------------------------------红外码值处理
------------------------------------------------*/
void Ircordpro(void)//红外码值处理函数
{ unsigned char i, j, k;unsigned char cord,value;k=1;for(i=0;i<4;i++)      //处理4个字节{for(j=1;j<=8;j++) //处理1个字节8位{cord=irdata[k];if(cord>7)//大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差value|=0x80;if(j<8){value>>=1;}k++;}IRcord[i]=value;value=0;     } irpro_ok=1;//处理完毕标志位置1
}/*------------------------------------------------主函数
------------------------------------------------*/
void main(void)
{EX0init(); //初始化外部中断TIM0init();//初始化定时器DataPort=0xfe; //取位码 第一位数码管选通,即二进制1111 1110LATCH2=1;      //位锁存LATCH2=0;while(1)//主循环{if(irok)                        //如果接收好了进行红外处理{   Ircordpro();irok=0;}if(irpro_ok)                   //如果处理好后进行工作处理,如按对应的按键后显示对应的数字等{Ir_work();}}
}

这段代码是一个8051单片机红外通信和数码管显示的程序,程序的主要功能是接收红外信号,解码,然后根据解码结果在数码管上显示相应的按键值。

通过外部中断0接收红外信号,定时器0计算信号的时间间隔,然后通过中断服务程序和主循环中的函数调用,完成红外信号的接收、解码和显示。

程序中定义了两个中断,一个是定时器中断,用于计算时间间隔;另一个是外部中断,用于接收红外信号并触发信号的采样。

2.步进电机控制

通过P1.3,P1.4,P1.5,P1.6四个IO口,来控制步进电机,包括电机的转动方向和速度控制。

#include <reg52.h> 
#define uchar unsigned char
#define uint  unsigned intsbit KEY1 = P3^2;   //步进电机顺时针方向转
sbit KEY2 = P3^3;   //步进电机逆时针方向转
sbit KEY3 = P3^4;        //步进电机调速uchar  Step = 0;
bit FB_flag = 0;unsigned char code F_Rotation[8]={0x08,0x18,0x10,0x30,0x20,0x60,0x40,0x48};    //顺时针转表格
unsigned char code B_Rotation[8]={0x48,0x40,0x60,0x20,0x30,0x10,0x18,0x08};    //逆时针转表格/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay(uint i)
{uchar x,j;for(j=0;j<i;j++)for(x=0;x<=148;x++);        
}void KEY(void)
{if(KEY1 == 0)           //按P3.2,实现步进电机的顺时针转动{Delay(15);if(KEY1 == 0){FB_flag = 0;}Delay(200);}if(KEY2 == 0)                 //按P3.3,实现步进电机的逆时针转动{Delay(15);if(KEY2 == 0){FB_flag = 1;}Delay(200);}if(KEY3 == 0)                //按P3.4,实现步进电机的调速{Delay(15);if(KEY3 == 0){Step++;if(Step == 3){Step = 0;}}Delay(200);}
}void main()
{uchar i; //uint k = 0;while(1){ KEY();                                                  //按键处理函数for(i=0;i<8;i++)                      //因为有8路的控制时序{//k++;//if(k == 4096) while(1);if(FB_flag == 0){P1 = F_Rotation[i];  //顺时针转动}else{P1 = B_Rotation[i];         //逆时针转动}Delay(1+Step);                 //改变这个参数可以调整电机转速}}
}

通过按键输入控制步进电机的转动方向和速度,通过P1端口输出相应的控制信号,驱动步进电机按照预定的步进序列转动。程序中使用了简单的去抖动逻辑来提高按键输入的稳定性。

整理不易,做个有素质的看官,三连安排!


最近很多粉丝问我单片机怎么学,我根据自己从业十年经验,累积耗时一个月,精心整理一份「单

片机最佳学习路径+单片机入门到高级教程+工具包」全部无偿分享给铁粉!!!

除此以外,再含泪分享我压箱底的22个热门开源项目,包含源码+原理图+PCB+说明文档,让你迅速进阶成高手

教程资料包和详细的学习路径可以看我下面这篇文章的开头

《单片机入门到高级开挂学习路径(附教程+工具)》

《单片机入门到高级开挂学习路径(附教程+工具)》

《单片机入门到高级开挂学习路径(附教程+工具)》

相关文章:

单片机编程实例400例大全(100-200)

今天继续分享单片机编程实例第100-200例。 今天的实例会比前面100复杂一些&#xff0c;我大概看了下&#xff0c;很多都具备实际产品的参考价值。 今天继续分享单片机编程实例第100-200例。 今天的实例会比前面100复杂一些&#xff0c;我大概看了下&#xff0c;很多都具备实际…...

新兴游戏引擎Godot vs. 主流游戏引擎Unity和虚幻引擎,以及版本控制工具Perforce Helix Core如何与其高效集成

游戏行业出现一个新生事物——Godot&#xff0c;一个免费且开源的2D和3D游戏引擎。曾经由Unity和虚幻引擎&#xff08;Unreal Engine&#xff09;等巨头主导的领域如今迎来了竞争对手。随着最近“独特”定价模式的变化&#xff0c;越来越多的独立开发者和小型开发团队倾向于选择…...

Leetcode—1652. 拆炸弹【简单】

2024每日刷题&#xff08;127&#xff09; Leetcode—1652. 拆炸弹 实现代码 class Solution { public:vector<int> decrypt(vector<int>& code, int k) {int codeSize code.size();vector<int> ans(codeSize, 0);if(k 0) {return ans;}if(k > 0)…...

JAVASE---抽象类相关

instanceof 和类型转换 System.out.println(X instanceof Y );主要看X与Y之间是否存在父子&#xff08;继承&#xff09;关系&#xff0c;如果存在则编译可完成&#xff0c;否则无法 进行编译。 1.父类引用指向子类的对象 2.把子类转换为父类&#xff0c;向上转型; 3.把父类转…...

深入理解C++中的inline函数

在C编程中&#xff0c;我们经常会遇到inline关键字&#xff0c;它用于修饰函数&#xff0c;以建议编译器将该函数的调用替换为函数体的直接拷贝。这就是inline函数的基本概念。然而&#xff0c;inline函数并非真正意义上的函数&#xff0c;而只是一种"在调用点插入函数体&…...

Rust 动态数组Vector

导航 一、动态数组是什么&#xff0c;怎么用1、动态数组Vector是什么2、动态数组怎么用&#xff08;1&#xff09;创建动态数组&#xff08;2&#xff09;尾部追加元素&#xff08;3&#xff09;尾部删除元素&#xff08;4&#xff09;删除指定位置元素&#xff08;5&#xff0…...

Linux主机重启后报错:[FAILED] Failed to start Switch Root.

一、问题描述 某次云主机因计费问题&#xff0c;导致批量重启&#xff0c;重启后发现某台云主机竟进入紧急救援模式&#xff08;emergency模式&#xff09;&#xff0c;如下所示&#xff1a; 二、原因及处理 1&#xff09;原因&#xff1a;加载根分区失败&#xff0c;导致无…...

git--.gitignore--使用/详解/实例

简介 本文介绍git的.gitignore忽略文件的用法。 项目中并不是所有文件都需要保存到版本库中的&#xff0c;例如“target”目录及目录下的文件就可以忽略。 忽略某个文件&#xff08;不提交到版本库的方法&#xff09;&#xff1a;在Git工作区的根目录下创建一个.gitignore文件…...

初识java——javaSE(2)--运算符与逻辑控制【求个关注】

文章目录 一 运算符1.1 算术运算符当两个不同类型的值相加时&#xff1a;/ 运算符%运算符 1.2 关系运算符1.3 逻辑运算符短路&#xff1a;逻辑非 1.4 位运算符&|^位运算符当作逻辑运算符中使用 ~>><<>>> 1.5 赋值运算符1.6 三目运算符 二 逻辑控制if语…...

JAVA前端快速入门基础_javascript入门(02)

写在前面:本文用于快速学会简易的JS&#xff0c;仅做扫盲和参考作用 1.JavaScript函数 什么是函数:执行特定任务的代码块 1.1定义&#xff1a; 使用function来进行定义(类似于python里面的def 或者java和c里面的void&#xff0c;int这些返回类型开头)。定义规则如下: func…...

【热门话题】ElementUI 快速入门指南

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 ElementUI 快速入门指南环境准备安装 ElementUI创建 Vue 项目安装 ElementUI 基…...

webpack4和webpack5区别4---自动清除打包目录

webpack4 自动清除打包目录 需要使用clean-webpack-plugin插件 const {CleanWebpackPlugin} require(clean-webpack-plugin); module.exports {plugins: [new CleanWebpackPlugin()} } webpack5 自动清除打包目录 module.exports {output: {clean: true} }...

npm许可证检查

node开发做项目&#xff0c;很少有人去纯手工打造&#xff0c;大多是采用一些开源框架&#xff0c;还会使用前人做好的轮子&#xff0c;所以咱们的项目文件里&#xff0c;除了自己编写的js文件&#xff0c;还会带有一些拿来主义的npm模块&#xff0c;从其他开源发布网站上下载的…...

利用AI大模型和Echarts 绘制知识图谱,实现文本信息提取和图数据库操作

引言 随着信息时代的到来&#xff0c;海量的文本数据成为了我们获取知识的重要来源。然而&#xff0c;如何从这些文本数据中提取出有用的信息&#xff0c;并将其以可视化的方式展示出来&#xff0c;一直是一个具有挑战性的问题。近年来&#xff0c;随着人工智能技术的发展&…...

Telegram电报+86手机接收验证码及账号解封方法

Telegram电报86手机无法接受验证码目前可用Telegram X获取&#xff0c;测试可用。获取验证码的前提是需要确保网络通畅 不要同一时段获取超过太多验证码&#xff0c;获取过多验证码将会很长一段时间收不到验证码&#xff0c;6小时最多获取2次验证码。 方法1&#xff1a;使用官…...

迅饶科技 X2Modbus 网关 AddUser 任意用户添加漏洞复现

0x01 产品简介 X2Modbus是上海迅饶自动化科技有限公司Q开发的一款功能很强大的协议转换网关, 这里的X代表各家不同的通信协议, 2是T0的谐音表示转换, Modbus就是最终支持的标准协议是Modbus协议。用户可以根据现场设备的通信协议进行配置,转成标准的Modbus协议。在PC端仿真…...

基于YOLOv8+PyQt5复杂场景下船舶目标检测系统

1. 应用场景 复杂场景下船舶目标检测系统的应用场景包括&#xff1a; 港口管理和安全&#xff1a;监控港口区域&#xff0c;确保船舶安全地进出港口&#xff0c;预防相撞事故的发生。 海洋交通监控&#xff1a;实时追踪海上交通流&#xff0c;并识别违规或异常航行行为&#x…...

Spring Boot | Spring Security ( SpringBoot安全管理 )、Spring Security中 的 “自定义用户认证“

目录 : Spring Boot 安全管理 &#xff1a;一、Spring Security 介绍二、Spring Security 快速入门2.1 基础环境搭建 :① 创建Spring Boot 项目② 创建 html资源文件③ 编写Web控制层 2.2 开启安全管理效果测试 :④ 添加 spring-boot-starter-security 启动器⑤ 项目启动测试 三…...

力扣经典150题第五十五题:逆波兰表达式求值

目录 题目描述和要求示例解释解题思路算法实现复杂度分析测试和验证总结和拓展参考资料 题目描述和要求 给你一个字符串数组 tokens&#xff0c;表示一个根据逆波兰表示法表示的算术表达式。请你计算该表达式&#xff0c;并返回一个表示表达式值的整数。 注意&#xff1a; 有…...

C#队列(Queue)的基本使用

概述 在编程中&#xff0c;队列&#xff08;Queue&#xff09;是一种常见的数据结构&#xff0c;它遵循FIFO&#xff08;先进先出&#xff09;的原则。在C#中&#xff0c;.NET Framework提供了Queue<T>类&#xff0c;它位于System.Collections.Generic命名空间下&#x…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

【网络安全】开源系统getshell漏洞挖掘

审计过程&#xff1a; 在入口文件admin/index.php中&#xff1a; 用户可以通过m,c,a等参数控制加载的文件和方法&#xff0c;在app/system/entrance.php中存在重点代码&#xff1a; 当M_TYPE system并且M_MODULE include时&#xff0c;会设置常量PATH_OWN_FILE为PATH_APP.M_T…...

Vite中定义@软链接

在webpack中可以直接通过符号表示src路径&#xff0c;但是vite中默认不可以。 如何实现&#xff1a; vite中提供了resolve.alias&#xff1a;通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...

永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器

一、原理介绍 传统滑模观测器采用如下结构&#xff1a; 传统SMO中LPF会带来相位延迟和幅值衰减&#xff0c;并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF)&#xff0c;可以去除高次谐波&#xff0c;并且不用相位补偿就可以获得一个误差较小的转子位…...

Unity中的transform.up

2025年6月8日&#xff0c;周日下午 在Unity中&#xff0c;transform.up是Transform组件的一个属性&#xff0c;表示游戏对象在世界空间中的“上”方向&#xff08;Y轴正方向&#xff09;&#xff0c;且会随对象旋转动态变化。以下是关键点解析&#xff1a; 基本定义 transfor…...

Windows电脑能装鸿蒙吗_Windows电脑体验鸿蒙电脑操作系统教程

鸿蒙电脑版操作系统来了&#xff0c;很多小伙伴想体验鸿蒙电脑版操作系统&#xff0c;可惜&#xff0c;鸿蒙系统并不支持你正在使用的传统的电脑来安装。不过可以通过可以使用华为官方提供的虚拟机&#xff0c;来体验大家心心念念的鸿蒙系统啦&#xff01;注意&#xff1a;虚拟…...