题解:按钮加减计数器设计(单片机C51)(外部中断)

2023-11-05

        需求:使用4位共阴极段码表及共阳极数码管,通过外部中断方式,实现两个按钮分配加1、减1功能

        今天我就来讲解一下这道题

目录

1.代码

1.1定义头文件

1.2定义延时函数(毫秒)

1.3定义主函数

1.4定义0~15共阴极数码管字符码

1.5定义中断

1.5.1IE寄存器(中断允许控制)(interrupt enable)

1.5.2IP寄存器

1.5.3定时控制寄存器TCON ( Timer control register )

1.5.4真-定义中断

1.5.5定义中断子程序

1.6计算与显示

1.6.1定义全局变量

1.6.2计算

1.6.3显示

1.7完整代码

2.仿真

3.效果


1.代码

1.1定义头文件

        首先我们定义单片机头文件<reg51.h>

#include<reg51.h>//单片机头文件

1.2定义延时函数(毫秒)

        我们在定义一下延时函数DelayMs(后面会用到),这里我们用两个for循环与一个传参来实现。

        第二个for循环循环120次得出1毫秒

        第一个for循环传参ms完成我们需要延时的毫秒

void DelayMs (const int ms)//延时函数(毫秒)
{
    int i;
    for(i = 0;i < ms;i++)//循环几亳秒
    {
        int j;
        for(j = 0;j < 120;j++);
    }
}

1.3定义主函数

        因为是单片机,所以不需要返回值,所以用void main定义主函数

void main()//主函数
{
}

1.4定义0~15共​​​​​​阴极数码管字符码

        因为这个共极数码管字符码不需要做改变,所以我们用const把他锁上

int mian()
{
    //定义0~15共阴极数码管字符码
    const unsigned char 1ed[] = {0X3F, 0X06, 0X5B, 0X4E, 0X66, 0X6D, 0X7D,0X7,0X7E,0X6E, 0X77, 0X7C, 0X39, 0X5E, 0X79, 0X71};
}

1.5定义中断

        首先我们先了解亿点点中断知识

1.5.1IE寄存器(中断允许控制)(interrupt enable)

EXO(IE.0) 外部中断0允许位;(interrupt controller of external interrupt)
ETO(IE.1) 定时/计数器TO中断允许位 (interrupt controller of Timer0 interrupt)
EX1(IE.2) 外部中断0允许位
ET1(IE.3) 定时/计数器T1中断允许位
ES (IE.4) 串行口中断允许位; (interrupt controller of serial port)
EA(IE.7)

CPU 中断允许(总允许)位(global all interrupt )

1.5.2IP寄存器

PXO (IP.0) 外部中断0优先级设定位
PTO (IP.1) 定时/计数器TO优先级设定位
PX1 (IP.2) 外部中断0优先级设定位
PT1 (IP.3) 定时/计数器T1优先级设定位
PS   (IP.4) 串行口优先级设定位
PT2 (IP.5) 定时/计数器T2优先级设定位(80C52 的T2)

1.5.3定时控制寄存器TCON ( Timer control register )

ITO (TCON.0) 外部中断0触发方式控制(interruput-0 type control bit )
ITO=0 为电平触发方式
IT0=1 为边沿触发方式(下降沿有效)
IEO (TCON.1) 外部中断0中断请求标志位(external interrupt-0 flag)
IT1 (TCON.2) 外部中断1触发方式控制位
IE1 (TCON.3) 外部中断1中断请求标志位
TRO (TCON.4) 定时/计数器TO运行控制位( timer0 run control bit)
TR1 (TCON.6) 定时/计数器T1运行控制位
TFO(TCON.5) 定时/计数器TO溢出中断请求标志位
TF1 (TCON.7) 定时/计数器T1溢出中断请求标志位( timer1 overflow flag )

        OK,我们这中断知识了解亿点点就可够了

1.5.4真-定义中断

int mian()
{
    //定义中断
    IE=0xFF;
    ITO=1;//T1为边沿触发方式(下降沿有效)
    IT1=1;//T2为边沿触发方式(下降沿有效)
}

1.5.5定义中断子程序

    当然我们给配合两个子程序来用。

interrupt 0

指明是外部中断0
interrupt 1 指明是定时器中断0
interrupt 2 指明是外部中断1
interrupt 3 指明是定时器中断1
interrupt 4 指明是串行口中断
void Add() interrupt 0//T2加
{
    if (shu<9999)//防止数值溢出————出现野指针
    {
        shu++;//加
    }
}

void Sub() interrupt 2//T1减
{
    if (shu>0)//防止数值过小————出现野指针
    {
        shu--;//减
    }
}

1.6计算与显示

1.6.1定义全局变量

        先定义一个全局变量shu

int shu = 1;//数(全局变量)

1.6.2计算

        因为要重复计算,所以我们计算把放到循环里。

int main()
{
    while (1)//死循环
    {
        //定义每一位
        int qian = shu/1000,//千
            bai = shu%1000/100,//百
            shi = shu%100/10,//十
            ge= shu%10;//个
    }
}

1.6.3显示

        因为要重复显示,所以我们再把显示放进去,并延时1毫秒(利用人的视觉误差)。

int main()
{
    while (1)//死循环
    {
        //亮个位
        P3=~ (0x10<<0);
        P2 = 1ed[ge];
        DelayMs (1) ;//延时1亳秒
        //亮十位
        P3=~ (0x10<<1);
        P2 = led[shi];
        DelayMs(1);//延时1亳秒
        //亮百位
        P3=~ (0x10<<2);
        P2 = 1ed[bai];
        DelayMs(1);//延时1亳秒
        //亮千位
        P3=~(0x10<<3) ;
        P2 = led[qian];
        DelayMs (1) ;//延时1亳秒
    }
}

1.7完整代码

#include<reg51.h>//单片机头文件(全局变量)

int shu = 1;//数

void DelayMs (const int ms)//延时函数-毫秒
{
    int i;
    for(i = 0;i < ms;i++)//循环几亳秒
    {
        int j;
        for(j = 0;j < 120;j++);
    }
}

void main()//主函数
{
    //定义0~15共阴极数码管字符码
    const unsigned char 1ed[] = {0X3F, 0X06, 0X5B, 0X4E, 0X66, 0X6D, 0X7D,0X7,0X7E,0X6E, 0X77, 0X7C, 0X39, 0X5E, 0X79, 0X71};
    //定义中断
    IE=0xFF;
    ITO=1;//T1为零终止一次
    IT1=1;//T2为零终止一次
    while (1)//死循环
    {
        //定义每一位
        int qian = shu/1000,//千
            bai = shu%1000/100,//百
            shi = shu%100/10,//十
            ge= shu%10;//个
        //亮个位
        P3=~ (0x10<<0);
        P2 = 1ed[ge];
        DelayMs (1) ;//延时1亳秒
        //亮十位
        P3=~ (0x10<<1);
        P2 = led[shi];
        DelayMs(1);//延时1亳秒
        //亮百位
        P3=~ (0x10<<2);
        P2 = 1ed[bai];
        DelayMs(1);//延时1亳秒
        //亮千位
        P3=~(0x10<<3) ;
        P2 = led[qian];
        DelayMs (1) ;//延时1亳秒
    }
}

void Add() interrupt 0//T2加
{
    if (shu<9999)//防止数值溢出————出现野指针
    {
        shu++;//加
    }
}

void Sub() interrupt 2//T1减
{
    if (shu>0)//防止数值过小————出现野指针
    {
        shu--;//减
    }
}

2.仿真

        因为这次程序非常简单,所以只需要4个元件

        Component Mode中的7SEG-MPX4-CC(共阳极数码管)与AT89C51(单片机)与BUTTON(按钮)。

        Terminals Mode中的GROUND(负极)。

布局如下:

3.效果

制作不易,你懂得。 

按钮加减计数器

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

题解:按钮加减计数器设计(单片机C51)(外部中断) 的相关文章

随机推荐

  • 高德地图的缩放和位移监听

    最近项目采用高德地图 高德地图的文档 demo都很详细 想实现的功能基本上都有 在项目里有一个功能 是类似根据地图的中心经纬度实现数据请求 为了不无限的请求 所以要分别监听 地图的缩放 地图位移 这里就有一个方法 gadMap setOnC
  • matlab根据成绩划分等级_Excel数据分析必备技能:对数据按范围多条件划分等级的判定套路

    点击右上角 关注 每天免费获取干货教程 职场办公中经常要对数据进行整理和分析 其中等级归类划分是很常用的一种方法 在这个过程中用好Excel公式可以事半功倍 但是还是有很多人不了解在Excel中对数据按范围多条件划分等级的系统思路和方法 所
  • Cover Letter常用范式和模版

    摘自 https zhuanlan zhihu com p 26708261 http muchong com html 201401 6920446 html 1 什么是Cover letter Cover Letter 即投稿信 是论文
  • 深聊测开领域之:测试策略模型有哪些?

    测试模型的分类 1 引言 2 金字塔 2 1 金字塔模型 引入 2 2 金字塔弊端 2 3 金字塔图形 3 冰淇淋 3 1 冰淇淋模型 引入 3 2 冰淇淋模型 优缺点 3 2 1 缺点 3 2 2 优点 3 2 冰淇淋图形 4 冠军杯 4
  • 微信小程序面试题汇总

    HTML篇 CSS篇 JS篇 Vue篇 TypeScript篇 React篇 前端面试题汇总大全 含答案超详细 HTML JS CSS汇总篇 持续更新 前端面试题汇总大全二 含答案超详细 Vue TypeScript React Webpa
  • 环境变量知识点

    环境变量 环境变量 环境变量是用来定义系统运行环境的一些参数 比如说 每一个用户的家目录 echo HOME 还有我们在编写C C 代码的时候 在链接的时候 从来不知道我们的所链接的动态静态库在哪里 但是照样可以链接成功 生成可执行程序 原
  • 不使用采集卡,实现相机手机多机位直播

    背景 因为直播需求 现在想实现使用一台相机和一台手机完成直播的两个机位设定 搜了很多视频都是要购买采集卡 违背了性价比这一原则 搜索半天之后 根据当前的设备完成了任务 硬件材料 苹果手机一部 佳能单反 所需软件 1 OBS 主要是用来集成各
  • 刷脸让商家引入智慧经营实现数字化转型

    移动支付在生活中已经实现了全覆盖 从单一的支付到驱动智慧经营 在数据为王的时代 通过对移动支付数据的深度挖掘 整合成消费大数据 移动支付还在经营上改变商户的效率 从以前柜台结账到如今的自助结账 从人工推荐到大数据的精准推荐 彻底的改变了商户
  • Linux make --强大的编译工具

    用途说明 make命令是一个常用的编译命令 尤其是在开发C C 程序时 它通过Makefile文件中描述的源程序之间的依赖关系来自动进行编译 Makefile文件是按照规定的格式编写的 文件中需要说明如何编译各个源文件并连接生成可执行文件
  • CVE-2020-11444:Nexus Repository Manager 3 远程命令执行漏洞

    读者需知 本文仅供学习使用 由于传播和利用此文所造成的损失均由使用者本人负责 文章作者不为此承担责任 简介 Nexus Repository是一个开源的仓库管理系统 可搭建npm maven等私服 Nexus 3 任意修改admin密码越权
  • Socket错误详解及处理方法

    例如错误代码10061 说明服务器已经找到 但连接被服务器拒绝 连接失败原因可能是 端口号设置错误 2 服务器没有处于监听状态 即ServerSocket gt Active true 3 数据包被服务器端的防火墙过滤掉 附 Socket常
  • Qt 连接、操作数据库(增删改查)

    文章目录 Qt 5 9连接MySQL5 7 32 64位 操作数据库 QSqlQuery类 执行SQL语句 查 浏览结果集方法 增 删 改 事务 Qt 5 9连接MySQL5 7 32 64位 MySQL5 7安装好后将其安装路径lib下
  • Django--ORM 多表查询

    目录 数据准备 正向查询与反向查询 基于对象的跨表查询 正向查询 一对多 多对多 一对一 反向查询 一对多 多对多 一对一 正向查询 反向查询 基于双下线的跨表查询 正向查询 一对一 一对多 多对多 反向查询 一对一 一对多 多对多 双下高
  • Pytorch—模型微调(fine-tune)

    随着深度学习的发展 在大模型的训练上都是在一些较大数据集上进行训练的 比如Imagenet 1k Imagenet 11k 甚至是ImageNet 21k等 但我们在实际应用中 我们自己的数据集可能比较小 只有几千张照片 这时从头训练具有几
  • fatal error: ceres/ceres.h: 没有那个文件或目录

    用ubuntu18跑的loam livox算法 系统报错 In file included from home lisheng catkin ws src loam livox master source laser mapping cpp
  • java面试---IO与NIO

    一 概念 NIO即New IO 这个库是在JDK1 4中才引入的 NIO和IO有相同的作用和目的 但实现方式不同 NIO主要用到的是块 所以NIO的效率要比IO高很多 在Java API中提供了两套NIO 一套是针对标准输入输出NIO 另一
  • springboot+mybatis配置多数据源实战

    1 背景说明 2 配置多数据源步骤 2 1 项目结构变更 2 2 添加配置类 2 3 修改配置文件数据连接配置信息 2 4 多数据源配置导致 Transactional失效问题 1 背景说明 一般一个项目中只会连接一个数据库 但是随着需求变
  • 后端配置(宝塔):处理php禁用函数

    一 找到php的文件路径 在软件商店中 找到已安装文件 选择需要更改的php文件 选择 设置 二 选择需要取消禁用的文件进行删除 扩展 可解决 The Process class relies on proc open which is n
  • vue常用指令和用法

    文章目录 1 v text 2 v html 3 v on 4 v show 5 v if 6 v bind 7 v for 8 v model 1 v text 设置标签的文本值内容 默然写法会替换全部内容 使用插值表达式 可以替换指定内
  • 题解:按钮加减计数器设计(单片机C51)(外部中断)

    需求 使用4位共阴极段码表及共阳极数码管 通过外部中断方式 实现两个按钮分配加1 减1功能 今天我就来讲解一下这道题 目录 1 代码 1 1定义头文件 1 2定义延时函数 毫秒 1 3定义主函数 1 4定义0 15共阴极数码管字符码 1 5