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

这篇具有很好参考价值的文章主要介绍了题解:按钮加减计数器设计(单片机C51)(外部中断)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        需求:使用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定义中断

        首先我们先了解亿点点中断知识题解:按钮加减计数器设计(单片机C51)(外部中断)

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

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

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寄存器

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

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 )

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

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,我们这中断知识了解亿点点就可够了

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

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(负极)。

布局如下:

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

3.效果

制作不易,你懂得。 题解:按钮加减计数器设计(单片机C51)(外部中断)

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

按钮加减计数器文章来源地址https://www.toymoban.com/news/detail-433291.html

到了这里,关于题解:按钮加减计数器设计(单片机C51)(外部中断)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 单片机:定时器/计数器TMOD设置

    在嵌入式系统中,定时器和计数器是非常重要的功能模块。通过使用定时器/计数器,我们可以实现各种时间相关的操作,比如定时中断、计时测量等。在单片机中,定时器/计数器的配置是通过设置特定的寄存器来完成的。其中,TMOD寄存器用于设置定时器/计数器的工作模式。

    2024年02月02日
    浏览(49)
  • 51单片机——计数器与定时器的区别

    定时器和计数器 是同一器件—--计数器,其共同的特点是都有一个计数脉冲输入端,每输入一个脉冲,计数器就进行加1或减1计数。 若计数器件的计数脉冲的频率固定,则可利用计数实现定时,这就是定时器。 若计数器件的作用仅仅是记录输入脉冲的多少,则称为计数器。 ①产生的

    2024年01月16日
    浏览(41)
  • 51单片机定时器/计数器(定时器中断)

    实现功能 通过定时器终端控制LED灯 D1 间隔一秒闪烁 单片机型号:STC89C52 定时器介绍 1、51单片机定时器原理 定时器实质上就是一个加1计数器。它随着计数器的输入脉冲进行自加1,也就是每来一个脉冲,计数器就自动加1,,当加到定数器满时,再输入一个脉冲就使定时器回零

    2024年02月06日
    浏览(40)
  • 学习笔记|计数器|Keil软件中 0xFD问题|I/O口配置|STC32G单片机视频开发教程(冲哥)|第十二集:计数器的作用和意义

    直流有刷的电机,后面两个一正一负的电接上,电机就可以转 到底是转子个几个圈呢? 我们就可以在背后加装这么一个码盘,我们假设这里是有60个这个光电的一个孔对吧 那我们转一圈是不是就可以一个轴上输出60个这样的脉冲,有遮挡就输出1,无遮挡输出0, 两路交替,如果说

    2024年02月09日
    浏览(35)
  • 单片机实验七 NE555脉冲发生器实验(定时/计数器)

    1.熟悉实验软件和硬件,进行正确的接线; 2.1602显示脉冲频率,调节电位器可改变频率。 1.Keil uVision4 2.PZISP自动下载软件 3.HC6800S开发板 实验界面及跳线帽位置 NE555是一种应用特别广泛作用很大的的集成电路,属于小规模集成电路,在很多电子产品中都有应用。 NE555的作用是

    2024年02月06日
    浏览(42)
  • C语言课设项目-51单片机-定时器和计数器

     (创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 一、定时器的原理 1、CPU时序的有关知识 2、在学习定时器之前需要明白的  3、定时/计数器的工作原理 4、51单片机定时器结构  二、定时/计数器的控制  1、工作方式

    2023年04月18日
    浏览(50)
  • 蓝桥杯单片机学习6——定时器/计数器&定时器实现秒表功能

    上一期我们学习了外部中断的相关内容,现在我接着来学习定时器。 定时器/计数器是一种能够对内部时钟信号或者外部输入信号进行计数,当计数值达到设定要求时,向CPU提出中断请求,从而实现定时或计数功能的外设。定时器的基本工作原理是进行计数。 举个栗子 :你可

    2024年02月04日
    浏览(38)
  • STC15系列单片机:定时器/计数器16位自动重装载模式

    STC15系列单片机内部有5个16位定时器/计数器,分别是T0、T1、T2、T3、T4。 定时器与计数器,东西还是同一个东西,只是用法和功效不一样,就好比黄瓜,既可以内服也可以外敷,黄瓜还是那个黄瓜,作用就不一样了。 就拿T0来说,T0用于定时,那T0就是定时器,如果T0用于计数

    2024年01月25日
    浏览(39)
  • 同步计数器设计与建模

    ⭐本专栏针对FPGA进行入门学习,从数电中常见的逻辑代数讲起,结合Verilog HDL语言学习与仿真,主要对组合逻辑电路与时序逻辑电路进行分析与设计,对状态机FSM进行剖析与建模。 🔥文章和代码已归档至【Github仓库:hardware-tutorial】,需要的朋友们自取。或者公众号【AISha

    2024年02月01日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包