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

最近有一些新手,咨询我去实现某个功能,没思路,无从下手,怎么办?

平时太忙,没时间一一解答,今天发篇文说下。

这是每个人必经的阶段,不必自责和焦虑。

我是如何解决这个问题的?

就是多参考,多实践,然后碰到类似的功能,就能举一反三了,都是用时间堆经验的笨办法,没什么骚操作。

但是成长效率,是你可以控制的,在同一时间内,你实践的越多,经历的越多,比别人成长的就越快。

没有参考,就是创造行为,让一个经验不丰富的新手,去凭空创造,太为难了。

所以,我整理了100个单片机编程的实例,涵盖了很多小功能,注释也详细,非常适合新手参考,利用这些参考代码,去做自己的项目,事半功倍。

文章篇幅有限,今天先分享100例,正在学单片机的老铁可以找我安排。

下面随机贴几个实例代码:

1.Led循环左移例程:

#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义


void Delay(unsigned int t); //函数声明

/*------------------------------------------------
                    主函数
------------------------------------------------*/
void main (void)
{
                  
unsigned char i;  //定义一个无符号字符型局部变量 i 取值范围 0~255
Delay(50000);
P1=0xfe;           //赋初始值
while (1)         //主循环
  {
 for(i=0;i<8;i++)   //加入 for循环,表明for循环大括号中的程序循环执行8次
  {
   Delay(50000);
   P1<<=1;
   P1=P1|0x01;     //左移后,最右端自动赋值0,所以需要该语句赋值1
  } 
  P1=0xfe;           //重新赋初始值
  //主循环中添加其他需要一直工作的程序
  }
}
/*------------------------------------------------
 延时函数,含有输入参数 unsigned int t,无返回值
 unsigned int 是定义无符号整形变量,其值的范围是
 0~65535
------------------------------------------------*/
void Delay(unsigned int t)
{
 while(--t);
}

这段代码的主要目的是通过P1寄存器控制LED灯的闪烁,通过左移P1的值并保持最低位为1来实现LED灯的依次点亮效果。Delay函数用于在LED灯闪烁之间创建延时,以便于人眼可以观察到LED灯的变化。

2.数码管消隐

//多位数码管分别显示不同数字,这种扫描显示方式成为动态扫描,并不停变化赋值
//当高位值为0是不显示该位,即消隐,如数字 0010,实际显示为10,前2位0不显示
------------------------------------------------*/
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

#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 code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码
unsigned char TempData[8]; //存储显示值的全局变量
void Delay(unsigned int t); //函数声明
void Display(unsigned char FirstBit,unsigned char Num);
/*------------------------------------------------
                    主函数
------------------------------------------------*/
main()
{
 unsigned int num;
 unsigned int j;
 while(1)
      {
           j++;
           if(j==10)  //检测当前数值显示了一小段时间后,需要显示的数值加1,实现数据显示的变化
             {
                  j=0;
                  num++;
                  if(num==10000)//用于显示0~9999
                    num=0;
                 }
       if(num<1000)    //如果小于1000则千位不显示
             TempData[0]=0;
           else
             TempData[0]=dofly_DuanMa[num/1000];//分解显示信息,如要显示68,则68/10=6  68%10=8 
            if(num<100)    //如果小于100则千位和百位都不显示
             TempData[1]=0;
           else
             TempData[1]=dofly_DuanMa[(num%1000)/100];
           if(num<10)   //如果小于10,则千位、百位和十位都不显示
             TempData[2]=0;
           else
             TempData[2]=dofly_DuanMa[((num%1000)%100)/10];
           TempData[3]=dofly_DuanMa[((num%1000)%100)%10];
           Display(2,4);
      }
}
/*------------------------------------------------
 延时函数,含有输入参数 unsigned int t,无返回值
 unsigned int 是定义无符号整形变量,其值的范围是
 0~65535
------------------------------------------------*/
void Delay(unsigned int t)
{
 while(--t);
}
/*------------------------------------------------
 显示函数,用于动态扫描数码管
 输入参数 FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示
 如输入0表示从第一个显示。
 Num表示需要显示的位数,如需要显示99两位数值则该值输入2
------------------------------------------------*/
void Display(unsigned char FirstBit,unsigned char Num)
{
    unsigned char i;
    
    for(i=0;i<Num;i++)
    { 
        DataPort=0;   //清空数据,防止有交替重影
        LATCH1=1;     //段锁存
        LATCH1=0;
        
        DataPort=dofly_WeiMa[i+FirstBit]; //取位码 
        LATCH2=1;     //位锁存
        LATCH2=0;
        
        DataPort=TempData[i]; //取显示数据,段码
        LATCH1=1;     //段锁存
        LATCH1=0;
        
        Delay(200); // 扫描间隙延时,时间太长会闪烁,太短会造成重影
        
    }

}

这段代码是一个用于8051单片机的数码管显示程序,它通过动态扫描的方式,在一个4位数码管上依次显示0至9999的数字,然后循环。

3.独立按键控制直流电机调速

/*-----------------------------------------------
  对应的电机接口需用杜邦线连接到uln2003电机控制端
  使用5V-12V 小功率电机皆可 2个按键分别加速和减速
------------------------------------------------*/
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

#define KeyPort P3

#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换
sbit LATCH1=P2^2;//定义锁存使能端口 段锁存
sbit LATCH2=P2^3;//                 位锁存

sbit DCOUT = P1^1;//定义电机信号输出端口
/*------------------------------------------------
                  全局变量
------------------------------------------------*/
unsigned char PWM_ON;   //定义速度等级
#define CYCLE 10        //周期

unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9
unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码
unsigned char TempData[8]; //存储显示值的全局变量
/*------------------------------------------------
                  函数声明
------------------------------------------------*/
void DelayUs2x(unsigned char t);//us级延时函数声明 
void DelayMs(unsigned char t); //ms级延时
void Display(unsigned char FirstBit,unsigned char Num);//数码管显示函数
unsigned char KeyScan(void);//键盘扫描
void Init_Timer0(void);//定时器初始化
/*------------------------------------------------
                    主函数
------------------------------------------------*/
void main (void)
{
unsigned char num;                  
PWM_ON=0;
Init_Timer0();    //初始化定时器0,主要用于数码管动态扫描

TempData[0]=0x5E; //'d'
TempData[1]=0x39; //'C'

while (1)         //主循环
  {

 
   num=KeyScan();    //循环调用按键扫描
   if(num==1)//第一个按键,速度等级增加
      {
           if(PWM_ON<CYCLE)
           PWM_ON++;
          }        
   else if(num==2)//第二个按键,速度等级减小
      {
           if(PWM_ON>0)
           PWM_ON--;
          }        
  TempData[5]=dofly_DuanMa[PWM_ON/10]; //显示速度等级
  TempData[6]=dofly_DuanMa[PWM_ON%10];          
  }
}
/*------------------------------------------------
 uS延时函数,含有输入参数 unsigned char t,无返回值
 unsigned char 是定义无符号字符变量,其值的范围是
 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
 长度如下 T=tx2+5 uS 
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{   
 while(--t);
}
/*------------------------------------------------
 mS延时函数,含有输入参数 unsigned char t,无返回值
 unsigned char 是定义无符号字符变量,其值的范围是
 0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void DelayMs(unsigned char t)
{
     
 while(t--)
 {
     //大致延时1mS
     DelayUs2x(245);
         DelayUs2x(245);
 }
}
/*------------------------------------------------
 显示函数,用于动态扫描数码管
 输入参数 FirstBit 表示需要显示的第一位,如赋值2表
 示从第三个数码管开始显示,如输入0表示从第一个显示。
 Num表示需要显示的位数,如需要显示99两位数值则该值
 输入2
------------------------------------------------*/
void Display(unsigned char FirstBit,unsigned char Num)
{
      static unsigned char i=0;
          

           DataPort=0;   //清空数据,防止有交替重影
       LATCH1=1;     //段锁存
       LATCH1=0;

       DataPort=dofly_WeiMa[i+FirstBit]; //取位码 
       LATCH2=1;     //位锁存
       LATCH2=0;

       DataPort=TempData[i]; //取显示数据,段码
       LATCH1=1;     //段锁存
       LATCH1=0;
       
           i++;
       if(i==Num)
              i=0;


}
/*------------------------------------------------
                    定时器初始化子程序
------------------------------------------------*/
void Init_Timer0(void)
{
 TMOD |= 0x01;          //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响                     
 //TH0=0x00;              //给定初值
 //TL0=0x00;
 EA=1;            //总中断打开
 ET0=1;           //定时器中断打开
 TR0=1;           //定时器开关打开
}
/*------------------------------------------------
                 定时器中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1 
{
 static unsigned char count;
 TH0=(65536-2000)/256;                  //重新赋值 2ms
 TL0=(65536-2000)%256;
 
 Display(0,8);                // 调用数码管扫描
 
if (count==PWM_ON) 
    {
     DCOUT = 0;               //如果定时等于on的时间,
                         //说明作用时间结束,输出低电平
    }
  count++;
if(count == CYCLE)       //反之低电平时间结束后返回高电平
    {
    count=0;
        if(PWM_ON!=0)    //如果开启时间是0 保持原来状态
           DCOUT = 1;      

    }
 
}

/*------------------------------------------------
按键扫描函数,返回扫描键值
------------------------------------------------*/
unsigned char KeyScan(void)
{
 unsigned char keyvalue;
 if(KeyPort!=0xff)
   {
    DelayMs(10);
    if(KeyPort!=0xff)
           {
            keyvalue=KeyPort;
            while(KeyPort!=0xff);
                switch(keyvalue)
                {
                 case 0xfe:return 1;break;
                 case 0xfd:return 2;break;
                 case 0xfb:return 3;break;
                 case 0xf7:return 4;break;
                 case 0xef:return 5;break;
                 case 0xdf:return 6;break;
                 case 0xbf:return 7;break;
                 case 0x7f:return 8;break;
                 default:return 0;break;
                }
          }
   }
   return 0;
}

整个程序的工作流程是:通过按键输入(程序中定义了两个按键,分别用于加速和减速)改变电机的PWM占空比,从而控制电机的速度,同时,使用定时器中断服务程序来实现数码管的动态显示和电机PWM的控制。

程序通过KeyScan函数读取按键输入,并在数码管上显示当前的PWM占空比,即电机的速度等级。

电机接口通过杜邦线连接到ULN2003电机驱动器,可以使用5V到12V的小功率电机。

这些实例,只是给大家提供一个参考和思路,能达到举一反三的效果,有些代码并不适用于实际产品。

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

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

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

相关文章

Postman 汉化安装及使用指南:快速上手 Postman 中文版

Postman 是一款常用的 API 测试工具&#xff0c;可以方便地进行接口测试、调试和文档编写。本文将详细介绍如何下载安装 Postman 并汉化&#xff0c;包括每个步骤的详细说明。 下载安装 Postman 1、打开浏览器&#xff0c;访问 Postman 官网&#xff0c;下载适用于自己系统的…

(el-Transfer)操作(不使用 ts):Element-plus 中 Transfer 穿梭框右侧数据不展示的问题

Ⅰ、Element-plus 提供的Transfer树形控件组件与想要目标情况的对比&#xff1a; 1、Element-plus 提供Transfer组件情况&#xff1a; 其一、Element-ui 自提供的Transfer代码情况为(示例的代码)&#xff1a; <template><p style"text-align: center; margin: …

Nacos原理-2024

文章目录 1. 什么是Nacos2. 注册中心原理3. 配置中心原理 1. 什么是Nacos Nacos注册中心分为server与client&#xff0c;server采用Java编写&#xff0c;为client提供注册发现服务与配置服务。而client可以用多语言实现&#xff0c;client与微服务嵌套在一起&#xff0c;nacos…

让大模型prompt生成Mermaid流程图

生成内容、总结文章让大模型Mermaid流程图展示&#xff1a; mermaid 美人鱼, 是一个类似 markdown&#xff0c;用文本语法来描述文档图形(流程图、 时序图、甘特图)的工具&#xff0c;您可以在文档中嵌入一段 mermaid 文本来生成 SVG 形式的图形 kimi效果示例&#xff1a; 使用…

【算法一则】【动态规划】求二维数组可组成的最大正方形

题目 在一个由 ‘0’ 和 ‘1’ 组成的二维矩阵内&#xff0c;找到只包含 ‘1’ 的最大正方形&#xff0c;并返回其面积。 示例 1&#xff1a; 输入&#xff1a;matrix [["1","0","1","0","0"],["1","0&…

大模型应用开发极简入门

简单的归纳一下书的前序部分 目录 LLM&#xff08;Large Language Model&#xff09;的应用技术栈通常包括以下几个方面&#xff1a; 深度学习框架&#xff1a; 数据预处理工具&#xff1a; 训练资源&#xff1a; 模型优化和调参工具&#xff1a; 部署和应用集成&#xf…

最新AI实景无人自动直播软件:一部手机就可以实现无人直播;商业拓客带货的必备利器

智享实景无人直播系统在商业拓展中的作用不可忽视。本文将探讨该系统的特点和优势&#xff0c;展示其省时省力的优势以及在商家拓客和源头公司项目招商中的关键作用。 随着人工智能技术的飞速发展&#xff0c;智能化解决方案正逐渐渗透到各行业&#xff0c;在商业拓展领域取得了…

刷题训练之位运算

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;熟练掌握位运算算法。 > 毒鸡汤&#xff1a;学习&#xff0c;学习&#xff0c;再学习 ! 学&#xff0c;然后知不足。 > 专栏选自&#xff1a;刷题…

数据库分库分表

数据库分库分表 分库分表到底是什么 分库分表其实是分库,分表,分库分表的总称 分库 将数据按照一定规则存储到不同的数据库中,每个数据库存储一部分数据 分库主要解决的是并发量过大的问题&#xff0c;并发量一旦上升&#xff0c;那么数据库就可能成为系统的瓶颈&#xff…

综合性练习(后端代码练习2)——用户登录

目录 一、准备工作 二、约定前后端交互接口 1、需求分析 2、接口定义 1、输入账户密码界面 2、当前登录的用户界面 三、实现服务端代码 四、调整前端页面代码 1、login.html代码&#xff1a; 页面跳转的三种方式&#xff1a; 2、index.html代码&#xff1a; 五、运…

[华为OD] C卷 服务器cpu交换 现有两组服务器QA和B,每组有多个算力不同的CPU 100

题目&#xff1a; 现有两组服务器QA和B,每组有多个算力不同的CPU,其中A[i]是A组第i个CPU的运算能 力&#xff0c;B[i]是B组第i个CPU的运算能力。一组服务器的总算力是各CPU的算力之和。 为了让两组服务器的算力相等&#xff0c;允许从每组各选出一个CPU进行一次交换。 求两…

计算机网络----第十三天

DNS协议和文件传输协议 DNS&#xff1a; 含义&#xff1a;用于域名和IP地址的互相解析 DNS域名&#xff1a; 背景&#xff1a;通过IP地址访问目标主机&#xff0c;不便于记忆 域名的树形层次化结构&#xff1a; ①根域 ②顶级域&#xff1a;主机所处的国家/区域&#xf…

个人学习资源整理

文章目录 视频相关stl源码讲解相关 网站相关CPP网站 视频相关 stl源码讲解相关 跳转 网站相关 CPP网站 https://cplusplus.com/ https://gcc.gnu.org/

PostgreSQL的扩展(extensions)-常用的扩展之pg_repack

PostgreSQL的扩展&#xff08;extensions&#xff09;-常用的扩展之pg_repack pg_repack 是一款非常有用的 PostgreSQL 扩展工具&#xff0c;它能够重新打包&#xff08;repack&#xff09;表和索引以回收空间并减少碎片&#xff0c;而且在这个过程中不会锁定表&#xff0c;允…

软件测试常问的超高频面试题目,2022最强版,附答案

1、你的测试职业发展是什么&#xff1f; 测试经验越多&#xff0c;测试能力越高。所以我的职业发展是需要时间积累的&#xff0c;一步步向着高级测试工程师奔去。而且我也有初步的职业规划&#xff0c;前3年积累测试经验&#xff0c;按如何做好测试工程师的要点去要求自己&…

基于Vue3的Axios异步请求

基于Vue3的Axios异步请求 1. Axios安装与应用2. Axios网络请求封装3. axios网络请求跨域前端解决方案server.proxy 1. Axios安装与应用 Axios是一个基于promise的网络请求库&#xff0c;Axios.js.中文文档&#xff1a;https://axios.js.cn/ 安装&#xff1a;npm install --sa…

Apollo Dreamview+之Studio插件安装

步骤一&#xff1a;登录 Apollo Studio 工作台 登录 Apollo Studio 工作台。 步骤二&#xff1a;获取插件安装链接 在账户信息中&#xff0c;单击 我的服务 。 2. 选择 仿真 页签。 3. 在 插件安装 中单击 生成 &#xff0c;选择 Apollo 最新版本&#xff0c;并单击 确定 。…

计算机视觉大项目(1)-水果分级系统

项目来源&#xff1a;河北大学计算机视觉课程-杨老师. 一共有四个标题&#xff0c;本篇博客只完成前两问。 目录 实验目的: 实验内容&#xff1a; 实验步骤&#xff1a; 1.水果图像的分割 >掩膜图像Mask 是什么&#xff1f; >改进:去除反光部分的影响 2&#xf…

ES6之rest参数、扩展运算符

文章目录 前言一、rest参数二、扩展运算符 1.将数组转化为逗号分隔的参数序列2.应用总结 前言 rest参数与arguments变量相似。ES6引入rest参数代替arguments&#xff0c;获取函数实参。扩展运算符能将数组转化为参数序列。 一、rest参数 function namelist1() {console.log(ar…

【无标题】场外个股期权多少钱才能做?个人能做吗?

场外个股期权的交易门槛相对较高&#xff0c;主要面向符合特定条件的机构投资者。一般来说&#xff0c;法人或合伙企业等组织参与的&#xff0c;需要满足最近1年末净资产不低于5000万元人民币、金融资产不低于2000万元人民币的条件&#xff0c;并具备3年以上证券、基金、期货、…