精华内容
下载资源
问答
  • //实例42:用定时器T0查询方式P2口8位控制LED闪烁#include//包含51单片机寄存器定义的头文件voidmain(void){//EA=1;//开总中断//ET0=1;//定时器T0中断允许TMOD=0x01;//使用定时器T0的模式1TH0=(65536-46083)/256;//...

    //

    实例

    42

    :用定时器

    T0

    查询方式

    P2

    8

    位控制

    LED

    闪烁

    #include

    //

    包含

    51

    单片机寄存器定义的头文件

    void main(void)

    {

    // EA=1;

    //

    开总中断

    //

    ET0=1;

    //

    定时器

    T0

    中断允许

    TMOD=0x01;

    //

    使用定时器

    T0

    的模式

    1

    TH0=(65536-46083)/256;

    //

    定时器

    T0

    的高

    8

    位赋初值

    TL0=(65536-46083)%256;

    //

    定时器

    T0

    的高

    8

    位赋初值

    TR0=1;

    //

    启动定时器

    T0

    TF0=0;

    P2=0xff;

    while(1)//

    无限循环等待查询

    {

    while(TF0==0)

    ;

    TF0=0;

    P2=~P2;

    TH0=(65536-46083)/256;

    //

    定时器

    T0

    的高

    8

    位赋初值

    TL0=(65536-46083)%256;

    //

    定时器

    T0

    的高

    8

    位赋初值

    //

    实例

    43

    :用定时器

    T1

    查询方式控制单片机发出

    1KHz

    音频

    #include

    //

    包含

    51

    单片机寄存器定义的头文件

    sbit sound=P3^7;

    //

    sound

    位定义为

    P3.7

    引脚

    void main(void)

    {// EA=1;

    //

    开总中断

    //

    ET0=1;

    //

    定时器

    T0

    中断允许

    TMOD=0x10;

    //

    使用定时器

    T1

    的模式

    1

    TH1=(65536-921)/256;

    //

    定时器

    T1

    的高

    8

    位赋初值

    TL1=(65536-921)%256;

    //

    定时器

    T1

    的高

    8

    位赋初值

    TR1=1;

    //

    启动定时器

    T1

    TF1=0;

    while(1)//

    无限循环等待查询

    {

    while(TF1==0);

    TF1=0;

    sound=~sound;

    //

    P3.7

    引脚输出电平取反

    TH1=(65536-921)/256;

    //

    定时器

    T0

    的高

    8

    位赋初值

    TL1=(65536-921)%256;

    //

    定时器

    T0

    的高

    8

    位赋初值

    }

    }

    展开全文
  • Q:c语言编写51单片机中断程序,执行过程是怎样的?例如程序:#includevoid main(void){EA=1; //开放总中断EX0=1; //允许使用外中断IT0=1; //选择负跳变来触发外中断P0=0xff; //关闭所有P0口的LED灯while(1); //无限...

    Q:c语言编写51单片机中断程序,执行过程是怎样的?

    例如程序:

    #include

    void main(void)

    {

    EA=1;      //开放总中断

    EX0=1;     //允许使用外中断

    IT0=1;    //选择负跳变来触发外中断

    P0=0xff;         //关闭所有P0口的LED灯

    while(1); //无限循环,

    }

    void it0(void) interrupt 0 using 0 //外中断0的中断编号为0

    {

    P0=~P0;  //每产生一次中断请求,P0取反一次。

    }

    当有中断时,这个程序的执行过程是怎样的???

    A1:从main开始,开放总中断,允许使用外中断,选择负跳变来触发外中断,到这时负跳变没来没就一直while(1),等待。来了后执行

    void it0(void) interrupt 0 using 0 //外中断0的中断编号为0

    {

    P0=~P0;  //每产生一次中断请求,P0取反一次。

    }

    A2:有中断时直接跑到中断服务去

    A3:CPU会一直在检测是否有中断请求的。当收到中断请求EX 时,进行软件设置,开启总中断EA ,再设置中断的触发方式IT。

    转载自:http://bbs.elecfans.com/forum.php?mod=viewthread&tid=220199

    外部中断定时器c语言程序详解

    利用外部中断0,定时器0从数码管到流水灯显示

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

    #include "intrins.h"

    11708ac0bd8fd17d6f0ac8cd38f0e5bb.png

    #define uint unsigned int

    #define uchar unsigned char

    997853afc823fcd6a47bb944b8ec29b2.png

    uchar led,n,i,count=0;

    uchar smg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f

    ,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//0-F

    uchar sm[]={0x00,0x01};//数码管扫描

    uchar str[2];//显示两位数码管

    2ba733233b5defdd85bc45a48eae908c.png

    /******************************************************************/

    /*                    延时函数声明                                */

    /******************************************************************/

    /*void mdelay(uint t)

    {

    uchar n;

    for(;t>0;t--)

    for(n=0;n<125;n++)

    {;}

    }*/

    /*大约一毫秒的延时函数*/

    void mdelay(uint t)

    {

    uchar n;

    while(t--)

    {

    for(n=0;n<123;n++)

    {;}

    }

    }

    0a75fbc79a73218d2d5496fd0616e3fe.png

    /******************************************************************/

    /*                   主函数 1                                      */

    /******************************************************************/

    void main()

    {

    EA=1;//开总中断开关

    EX0=1;//打开外部中断0

    INT0=1;//触发方式为下降沿触发

    TH0=0x3c;//设置初值

    TL0=0xb0;

    ET0=1;//打开定时器中断

    TR0=1;//启动定时器

    TMOD=0x01;//设置定时器0为工作方式1

    044815c63a4bd32db99052b03c17bad6.png

    while(1)

    {

    for(i=0;i<2;i++)//数码管显示数据

    {

    P1=0xff;

    P2=sm[i];

    P0=smg[str[i]];

    mdelay(5);

    }

    }

    }

    1141d66e712c64a0bfcddfb096e1a68b.png

    void int0() interrupt 0

    {

    uchar c;

    led=0xfe;

    P2=0x00;

    for(c=0;c<8;c++)//流水灯循环一次

    {

    P1=led;

    led=_crol_(led,1);//左移函数

    mdelay(1000);

    }

    }

    3825912233bb1c6402a7236613f2839f.png

    void time0() interrupt 1

    {

    TH0=0x3c;

    TL0=0xb0;

    count++;

    if(count==20)//延时一秒0-60显示

    {

    count=0;

    str[0]=n/10;

    str[1]=n%10;

    n++;

    if(n==60)

    {

    n=0;

    }

    }

    }

    10

    本经验只供参考,如有不足,还请见谅。。。

    转载自:https://jingyan.baidu.com/article/870c6fc304cff6b03ee4be45.html

    51单片机中断interrupt……using……

    51单片机中断细节的一些问题. interrupt0:外部中断0interrupt1:定时器中断0interrupt2:外部中断interrupt3:定时器中断1interrupt4:串口 using ...

    C语言编写的bmp读写程序

    C语言编写的bmp读写程序 建议先把bmp的数据存储格式了解下 #include "Windows ...

    Windows程序执行过程

    Windows应用程序: WinMain函数(入口函数): 1. 设计窗体类,注冊窗体类.WNDCLASS 2. 创建窗体,显示及更新窗体. 3. 消息循环. 窗体过程函数(回调函数):WindowP ...

    MFC程序执行过程剖析

    一 MFC程序执行过程剖析 1)我们知道在WIN32API程序当中,程序的入口为WinMain函数,在这个函数当中我们完成注册窗口类,创建窗口,进入消息循环,最后由操作系统根据发送到程序窗口的消息调用 ...

    MFC程序执行过程剖析(转)

    一 MFC程序执行过程剖析 1)我们知道在WIN32API程序当中,程序的入口为WinMain函数,在这个函数当中我们完成注册窗口类,创建窗口,进入消息循环,最后由操作系统根据发送到程序窗口的消息调用 ...

    Java程序执行过程及内存机制

    本讲将介绍Java代码是如何一步步运行起来的,其中涉及的编译器,类加载器,字节码校验器,解释器和JIT编译器在整个过程中是发挥着怎样的作用.此外还会介绍Java程序所占用的内存是被如何管理的:堆.栈和 ...

    ET 与RETI 基于51单片机中断跳出指令&OpenCurlyDoubleQuote;RETI”浅议

    最近在基于51单片机编程的过程中出现了个很奇怪的问题“程序执行中在寄存器EA=1,ET0=1,TR0=1条件下,单TF0=1时并没有执行中断”.在有过单片机中断编程经历者都知道当EA=1,ET0=1的 ...

    Leaf - 一个由 Go 语言编写的开发效率和执行效率并重的开源游戏服务器框架

    转自:https://toutiao.io/posts/0l7l7n/preview Leaf 游戏服务器框架简介 Leaf 是一个由 Go 语言(golang)编写的开发效率和执行效率并重的开源游戏 ...

    Android入门学习:Android 系统框架及应用程序执行过程

    Android基础知识学习 新手上路,还请多多帮助.由于初学,博客内容难免有不正确的地方,还请各位多多指教,相互学习! 主要内容: 1.Android层次架构及主要功能 2.Android编程模型,程 ...

    随机推荐

    myeclipse 无法启动

    1.对项目中的一个文件重新命名,导致卡死,结束myeclipse进程不管用,重启不管用. 删除工程下的文件  以  .markers.snap 和  marker开头的两个文件   位置: 工作空间\ ...

    Sharepoint学习笔记—习题系列--70-573习题解析 -&lpar;Q85-Q87&rpar;

    Question 85You create a Microsoft .NET Framework console application that uses a Representational St ...

    Codeforces Gym 100231G Voracious Steve 记忆化搜索

    Voracious Steve 题目连接: http://codeforces.com/gym/100231/attachments Description 有两个人在玩一个游戏 有一个盆子里面有n个 ...

    LeetCode&lowbar;Set Matrix Zeroes

    Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place. 很挫的一个想 ...

    dbgrid数据显示和数据源不同

    dbgrid数据显示和数据源不同,在ODBC配置时如下设置,去掉勾

    如何探测网络设备ACL规则

    探测网络设备ACL规则 背景:在互联网企业的生产网络中,往往在网络入口处的网络设备上会有成千上万条ACL策略,这么多的ACL导致了网络管理员很难彻底梳理清楚其中的逻辑关系,从而不知道到底对外开放了哪些 ...

    文件系统及程序的限制关系: ulimit

    想像一个状况:我的 Linux 主机里面同时登陆了十个人,这十个人不知怎么搞的, 同时打开了 100 个文件,每个文件的大小约 10MBytes ,请问一下, 我的 Linux 主机的内存要有多大才够 ...

    webpack打包优化

    https://www.cnblogs.com/vvjiang/p/9327903.html

    vscode &plus; gradle 创建 java 项目 - java language server无法启动

    1.在系统上安装一个版本的gradle,用`gradle init --type java-application`创建一个默认的java项目,假设项目目录是hellojava 2.vscode写ja ...

    ABP框架系列之二十九:&lpar;Hangfire-Integration-延迟集成&rpar;

    Introduction Hangfire is a compherensive background job manager. You can integrate ASP.NET Boilerpla ...

    展开全文
  • 51单片机中断系统程序实例 (STC89C52RC)51单片机有了中断,在程序设计中就可以做到,在做某件事的过程中,停下来先去响应中断,做别的事情,做好别的事情再继续原来的事情。中断优先级是可以给要做的事情排序。...

    51单片机中断系统程序实例 (STC89C52RC)

    51单片机有了中断,在程序设计中就可以做到,在做某件事的过程中,停下来先去响应中断,做别的事情,做好别的事情再继续原来的事情。中断优先级是可以给要做的事情排序。

    单片机的学习不难,只要掌握学习方法,学起来并不难。什么是好的学习方法呢,一定要掌握二个要点:

    1. 要知道寄存器的英文全拼,比如IE = interrupt中断

    不知道全拼,要去猜,去查。这样就可以理解为什么是这个名称,理解了以后就不用记忆了。

    2. 每个知识点要有形像的出处

    比如看到TF0,脑子里马上要形像地定位到TCON寄存器的某位

    看到ET0, 马上要形像地定位到IE寄存器的第2位

    51hei独家揭秘: 形像是记忆的最大技巧。当人眼看到某个图时,是把视觉信号转化成电信号,再转化成人能理解的形像。当我们回忆形像时,就是在重新检索原先那个视觉信号,并放大。在学习过程中,不断练习检索、放大信号,我们的学习能力就会越来越强。

    写程序代码时,也要把尽量把每行代码形像化。

    51单片机内中断源

    8051有五个中断源,有两个优先级。与中断系统有关的特殊功能寄存器有IE(中断允许寄存器)、IP(中断优先级控制寄存器)、中断源控制寄存器(如TCON、SCON的有关位)。51单片机的中断系统结构如下图(注意,IF0应为TF0):

    150992ac72e50fa5bfa6b1c52da6dd8d.png

    8052有6个中断源,它比8051多一个定时器/计数器T2中断源。

    8051五个中断源分别是:

    (1)51单片机外部中断源

    8051有两个外部中断源,分别是INT0和INT1,分别从P3.2和P3.3两个引脚引入中断请求信号,两个中断源的中断触发允许由TCON的低4位控制,TCON的高4位控制运行和溢出标志。

    INT0 也就是Interrupt 0。在这里应该看一下你的51单片机开发板的电路原理图。离开形像的记忆是没有意义的。读到上面这句,你应该回忆起原理图上的连接。任何记忆都转化为形 像,这是学习的根本原理,我们通过学习单片机要学会这种学习方法,会让你一辈子受益无穷。

    TCON的结构如下图:

    010e0c89ed438c3ed2c84d5ce6fd2cfb.png

    (a)定时器T0的运行控制位TR0

    TR0由软件置位或者清0。当门控位GATE=0时,TO计数器仅由TR0控制,TR0=1启动计数,TR0=0时停止。当门控位GATE=1时,T0计数器由INT0和TR0共同控制,当INT0=1且TR0=1时启动T0计数器。

    (b)定时器T0溢出标志位TF0

    当T0溢出时TF0=1,并向CPU申请中断,CPU响应中断后由硬件将TF0清0,也可以由软件查询方式将TF0清0。

    c)定时器T1的运行控制位TR1

    功能同TR0。

    (d)定时器T1溢出标志为TF1

    功能同TF1。

    (e)外部中断源1(INT1、P3.3)中断请求标志IE1

    IE1=1时外部中断源1正在向CPU请求中断,当CPU响应该中断时由硬件将IE1清0(下降沿触发方式)。

    (f)外部中断源1触发方式选择位IT1

    IT1=0时外部中断源1选择电平触发方式,当输入低电平时置位IE1;IT1=1时外部中断源1选择下降沿触发方式,当中断源由高电平变低电平时置位 IE1,向CPU请求中断。

    (g)外部中断源0(INT0、P3.2)中断请求标志IE0

    功能类同IE1。

    (h)外部中断源0触发方式选择位IT0

    功能类同IT1。

    CPU在每个机器周期采样INT0和INT1引脚的输入电平。

    i、电平触发方式

    当CPU采样到低电平时,置位IE0和IE1,采样到高电平时,将IE0和IE1清零。在电平触发方式下,外部中断源必须一直保持低电平(至少保持1个以 上的机器周期)直到CPU响应中断请求,否则中断请求将丢失,同时在中断处理程序结束之前必须,外部中断源必须变为高电平,否则将产生另一次中断。

    ii、下降沿触发方式

    CPU 每个机器周期采样中断输入引脚,如果相续的两次采样,第一次是高电平,第二次是低电平,则置位相应的IE,响应中断后,硬件自动将IE清0。采样下降沿触 发方式,中断源的高、低电平都必须保持12个振荡周期(即1个机器周期)以上,这样CPU才能有效检测到下降沿,并引发CPU中断。

    (2)51单片机内部中断源

    8051有3个内部中断源,分别是定时器T0、T1和串行口中断。8052增加了一个T2定时器中断。

    2、51单片机中断使能控制

    中断的允许和禁止由中断使能控制寄存器IE控制,其字节地址为0A8H,可以位寻址,其结构如下图所示:

    06bde8ebf2b57d7231f02a17bf829db0.png

    EX0:外部中断0中断允许位;

    ET0:定时器/计数器T0中断允许位;

    EX1:外部中断1中断允许位;

    ET1:定时器/计数器T1中断允许位;

    ES:串行口中断允许位;

    ET2:定时器/计数器T2中断允许位;(只要8052具有)

    EA:CPU中断总允许位,EA=1时所有的中断开放,EA=0时禁止所有的中断。

    3、51单片机中断优先级

    51有两个优先级:高、低。通过IP(中断优先级寄存器)来设置优先级,其字节地址为0B8H,可位寻址,其结构如下图:

    7e8d28695b4f7d078e8331a766169561.png

    IP中各位值为0时表示低优先级中断,为1时表示高优先级中断。CPU复位后IP=0。

    高优先级中断可以中断低优先级中断,同优先级中断不能相互中断。当CPU同时接到同优先级的几个中断请求时,CPU按照如下硬件顺序进行中断响应:

    9e9aa364654cb1fe3e193cf35326b3c4.png

    4、51单片机中断请求的撤除

    CPU响应中断请求,执行中断服务程序,但在中断返回指令(RETI)之前必须撤除中断信号,否则将可能再次引起中断而发生错误。

    中断请求撤销的方法有三种:

    a、单片机内部硬件自动复位:对于定时器/计数器T0、T1及采用边沿触发方式的外部中断请求,CPU在响应中断后,由内部硬件自动撤销中断请求;

    b、应用软件清除响应标志:对串口发送/接收中断请求及定时器T2的溢出和捕获中断请求,CPU响应中断后,内部无硬件自动复位RI、TI、TF2及EXF2,必须在中断服务程序中清除这些标志,才能撤除中断;

    c、既无软件清除也无硬件撤除:对于采用电平方式的外部中断请求,CPU对引脚上的中断请求信号既无控制能力,也无应答信号,为保障CPU响应中断请求中断后,执行返回指令前撤除中断请求,必须考虑另外的措施。

    5、51单片机中断响应过程

    51 单片机在每个机器周期的S5P2状态顺序检查每个中断源的中断请求标志,若有中断源发送中断请求,CPU在下个机器周期的S5P2状态按优先级顺序查询各 中断标志,并且取高优先级的中断进行响应。响应中断后置位相应的中断优先级状态触发器,标明当前中断服务的优先级别,执行硬件调用程序,将程序计数器PC 的内容压入堆栈进行保护。对于中断源的中断入口地址装入程序计数器PC,使程序转入该中断入口处执行中断服务程序,直到遇到RETI指令。执行RETI指 令,撤销中断优先级触发器,弹出断点地址至程序计数器PC,继续源程序的执行过程。

    在接收中断申请时,如遇到下列情况之一,硬件调用子程序将被封锁:

    a、正在执行同级或高一级的中断服务程序;

    b、当前指令周期不是该指令的最后一个周期(或一条指令未执行完);

    c、当前正在执行的指令是RETI或对IE、IP的读写操作。

    6、中断入口地址

    各中断源的中断入口地址为:

    5e9e197df4fda08686c1c25daf2ecec9.png

    STC86C52RC 51单片机中断示例程序

    #include

    typedef unsigned char         uint8;

    typedef unsigned int          uint16;

    typedef unsigned long          uint32;

    sbit enableG1 = P1^3; sbit enableG2 = P1^4;

    sbit selectC  = P1^2; sbit selectB  = P1^1; sbit selectA  = P1^0;

    code uint16 num16[16] = {         0xC0, 0xF9, 0xA4, 0xB0,

    0x99, 0x92, 0x82, 0xF8,

    0x80, 0x90, 0x88, 0x83,

    0xC6, 0xA1, 0x86, 0x8E        };//共阳数码管真极表

    uint8 num6[6] = {0};//储存秒,0-5对应于个位...10万位上各位上的值

    void enable138(void); //启用138译码器切换IO口

    void refresh_led(void);

    void thtl_init(void);

    void timer1_init(void);

    void et1_init(void);

    void main(void)

    {

    enable138();

    timer1_init();

    et1_init();

    while(1);

    }

    void interrupt_timer1(void) interrupt 3

    {

    static uint16 counter = 0;

    static uint32 sec = 0;

    counter++;

    thtl_init();

    if(counter == 1000)

    {

    counter = 0;

    sec++;

    num6[0] = sec % 10;

    num6[1] = sec/10%10;

    num6[2] = sec/100%10;

    num6[3] = sec/1000%10;

    num6[4] = sec/10000%10;

    num6[5] = sec/100000%10;

    }

    refresh_led();//更新num6数组后再刷新数码管

    }

    void enable138(void) { enableG1 = 1; enableG2 = 0; }

    //刷新数码管,只显示有效值

    void refresh_led(void)

    {

    static uint8 i = 0;

    switch(i)

    {

    case 0: selectC = 0; selectB = 0; selectA = 0; P0 = num16[ num6[0] ]; break;

    case 1: selectC = 0; selectB = 0; selectA = 1; P0 = num6[5] == 0 && num6[4] == 0 && num6[3] == 0 && num6[2] == 0 && num6[1] == 0 ? 0xFF : num16[ num6[1] ]; break;

    case 2: selectC = 0; selectB = 1; selectA = 0; P0 = num6[5] == 0 && num6[4] == 0 && num6[3] == 0 && num6[2] == 0 ? 0xFF : num16[ num6[2] ]; break;

    case 3: selectC = 0; selectB = 1; selectA = 1; P0 = num6[5] == 0 && num6[4] == 0 && num6[3] == 0 ? 0xFF : num16[ num6[3] ]; break;

    case 4: selectC = 1; selectB = 0; selectA = 0; P0 = num6[5] == 0 && num6[4] == 0 ? 0xFF : num16[ num6[4] ]; break;

    case 5: selectC = 1; selectB = 0; selectA = 1; P0 = num6[5] == 0 ? 0xFF : num16[ num6[5] ]; break;

    default: break;

    }

    i = ++i % 6;

    }

    //设置计数器初数值,重用的内容都应该写成独立函数出来方便维护

    void thtl_init(void)

    {

    TH1  = (65536 - 922) / 256;

    TL1  = (65536 - 922) % 256;

    }

    void timer1_init(void)

    {

    TMOD |= 0X10;

    TMOD &= 0xDF;

    thtl_init();

    TR1  = 1;

    }

    void et1_init(void) { ET1 = 1; EA  = 1; }

    展开全文
  • 51单片机中断

    千次阅读 多人点赞 2021-01-27 23:59:10
    51单片机中断51单片机中断原理中断的概念:中断作用中断源及相关寄存器中断源及优先级定时器/计数器控制寄存器 TCON中断允许寄存器 IE中断优先寄存器 IP工作方式寄存器TMOD定时器初值寄存器THx 和 TLx计数器初值的...

    51单片机中断原理

    中断的概念:

    CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生),那么CPU就会暂停当前的工作(A事件),去执行B事件(中断响应和中断服务),然后B事件做完之后,再回到原来的事件(A事件)中继续工作。(中断的返回)。
    在这里插入图片描述

    中断作用

    随着计算机技术的应用,人们发现中断技术不仅解决了快速主机与I/O设备的数据传送问题,而且还有具有如下的优点:

    1. 分时操作:CPU可以分时为多个I/O设备服务,提高了计算机的利用率。
    2. 实时操作:CPU能够及时处理应用系统的随机事件,系统的实时性大大增强。
    3. 可靠性高:CPU具有处理设备故障及掉电等突发性事件能力,从而使系统可靠性更高。

    中断源及相关寄存器

    中断源及优先级
    中断源符号名称中断标志中断引起原因中断号优先级
    /INT0外部中断0IE0低电平或下降沿信号0最高
    T0定时器中断0TF0定时/计数器0 计数回0溢出1
    /INT1外部中断1IE1定电平或下降沿信号2
    T1定时器中断1TF1定时/计数器1 计数回0溢出3
    TX/RX串行口中断TI/RI串行通信完成一帧数据发送或接收4最低
    定时器/计数器控制寄存器 TCON
    D7D6D5D4D3D2D1D0
    功能TF1TR1TF0TR0IE1IT1IE0IT0

    TF0、 TF1: 是定时器中断标志(定时器0溢出标志位、定时器1溢出标志位)
    TR0 、TR1: 打开相应的定时器(定时器0运行控制位,=1时启动定时器0、定时器1运行控制位,=1时启动定时器1)
    由软件清0关闭定时器0/1。当GATE=1,且INIT为高电平时,TR1置1启动定时器1;当GATE=0时,TR1置1启动定时器0/1。
    IT0、IT1: 是外部中断的触发方式。 =0时 低电平触发,=1时负跳变触发。
    IE0、IE1: 是外部中断的标志位

    中断允许寄存器 IE
    D7D6D5D4D3D2D1D0
    功能EA————ESET1EX1ET0EX0

    EA: 总中断允许。 EA=0;CPU屏蔽所有中断的请求 EA=1;开放所有中断。
    ES:串行口中断允许位。ES=0; 禁止串行中断。ES=1; 允许串口中断。
    ET0、ET1: 定时器/计数器0 和 定时器/计数器 1 中断允许位 =0时 禁止相应的定时器中断。 =1 允许相应的定时器中断
    EX0、EX1: 外部中断0 和 外部中断 1 中断允许位。=0时 禁止相应的外部中断。 =1时 允许相应的外部中断。
    ——:无效位

    中断优先寄存器 IP
    D7D6D5D4D3D2D1D0
    功能——————PSPT1PX1PT0PX0

    PS: 串行口中断优先级 PS = 1;(高) 。PS = 0; (低)。
    PT0:定时器0中断优先级 PT0 = 1;(高) PT0 = 0;(低)。
    PT1:定时器1中断优先级 PT1 = 1;(高) PT1 = 0;(低)。
    PX0:外部中断0中断优先级 PX0 = 1;(高) PX0 = 0;(低)。
    PX1:外部中断1中断优先级 PX1 = 1;(高) PX1 = 0;(低)。
    ——:无效位

    IP寄存器不做设置,上电复位后为00H,默认是为低优先级
    不设置默认优先级是(由高到低):
    外部中断0→定时器0→外部中断1→定时器1→串口

    如果我们把IP寄存器设置为:(IP = 0X10)
    PS = 1;
    PT1 = 0;
    PX1 = 0;
    PT0 = 0;
    PX0 = 0;
    如下表:

    D7D6D5D4D3D2D1D0
    功能——————10000

    那么优先级从高到低是:
    串口→外部中断0→定时器0→外部中断1→定时器1

    工作方式寄存器TMOD
    D7D6D5D4D3D2D1D0
    功能GATEC/TM1M0GATEC/TM1M0

    在这里插入图片描述
    GATE:门控制
    =0:仅有运行控制位TRx来控制定时/计数器的开启。
    =1:由TRx和外部中断脉冲计数。(用于计算外部中断 负跳变 的次数)
    C/T:计数器模式和定时器模式选择
    =0:选择定时器模式
    =1:选择计数器模式
    M1、M0:选择定时/计数器的工作方式

    M1M0工作方式
    00方式0:为13位定时/计数器
    01方式1:为16位定时/计数器
    10方式2:为8位初值自动重装定时/计数器
    11方式3:仅适用于T0,分成两个8位计数器,T1停止计数。

    方式0
    方式0为13位计数,由TL0的低5位(高3位未用)和TH0的8位组成。TL0的低5位溢出时向TH0进位,TH0溢出时,置位TCON中的TF0标志,向CPU发出中断请求。
    在这里插入图片描述
    方式1
    方式1的计数位数是16位,由TL0作为低8位,TH0作为高8位,组成了16位加1计数器 。
    在这里插入图片描述
    方式2
    方式2为自动重装初值的8位计数方式。
    在这里插入图片描述
    方式3
    方式3只适用于定时/计数器T0,定时器T1处于方式3时相当于TR1=0,停止计数。
    在这里插入图片描述

    定时器初值寄存器THx 和 TLx

    首先先了解一下CPU时序有关知识:
    振荡周期: 为单片机提供定时信号的振荡源的周期(晶振周期或外加振荡周期)
    状态周期:2个振荡周期为1个状态周期,用S表示。振荡周期又称S周期或时钟周期。
    机器周期:1个机器周期含6个状态周期,12个振荡周期。
    指令周期:完成1条指令所占用的全部时间,它以机器周期为单位。

    例如:外接晶振为12MHz时,51单片机相关周期的具体值为:
    振荡周期=1/12us;
    状态周期=1/6us;
    机器周期=1us;
    指令周期=1~4us;

    计数器初值的计算:

    机器周期就是CPU完成一个基本操作所需要得时间。
    机器周期 = 1 /单片机的时钟频率
    51单片机内部时钟频率是外部时钟的12分频,也就是当外部晶振的频率输入到单片机里面
    的时候要进行12分频。

    比如:你用的是12MHZ的晶振,当你使用12MHZ的外部晶振的时候,
    机器周期 = 1 / 1M = 1us。
    (选择定时器工作方式1 16位)
    我们2的16次方等于65536,也就是最大值为65536(溢出)
    如果定时1ms
    初值就为:1ms / 1us = 1000。也就是要计数1000个数, 初值 = 65535-1000+1 = 64536,65536才会溢出。 所以初值即FC18H(十进制为64536)

    如果定时50ms
    50ms/1us=50000;
    初值 = 65535-50000+1=15536;
    定时为50ms 初值为15536 即3CB0(十六进制)

    对于每个不同的方式计算初值数有公式去计算的,但是我不会哈哈,我是用一个软件来计算的,软件名字 mcuelf这样也比较快
    在这里插入图片描述

    外部中断

    操作步骤(INT0 INT1)

    1 设置 外部中断中断源号及触发方式。设置IT0或IT1(TCON寄存器)
    2 打开相应的外部中断允许。设置EX0或EX1(IE寄存器)
    3 打开总中断。设置EA(IE寄存器)

    如何配置外部中断

    这里就用外部中断0开示例吧

    //配置外部中断0
    void initInterrupt0()
    {
    	IT0 = 1; //触发方式为负跳变触发
    	EX0 = 1; //打开外部中断0允许
    	EA  = 1; //总中断打开
    }
    

    中断服务函数(发生中断你想做什么?)

    无返回值 函数名(随意起) interrupt 中断号
    void interrupt0ServiceFun() interrupt 0
    {
    	//编写你要做的事情
    }
    

    外部中断1也是差不多的,这里就不写了。

    程序示例

    实现按键按下开灯/关灯

    #include "reg52.h"
    
    typedef unsigned char u8;
    typedef unsigned int u16; 
    typedef unsigned long int u32;
    						   
    
    sbit KEY = P3^2; //定义中断按键引脚  
    sbit LED = P2^0; //定义LED1引脚
    
    //配置中断0
    void initInterrupt0()
    {
    	EX0 = 1;
    	IT0 = 1;
    	EA  = 1;
    }
    //延时函数
    void delay(u8 i)
    {
    	while(i--);
    }
    void main()
    {
    
    	initInterrupt0();	//调用中断
    	while(1);
    
    }
    
    //发生中断执行函数
    void interruptHandler() interrupt 0
    {
    	delay(12000);  //延迟 因为当进入外部中断函数的时候按键时已经按下了这里是消抖作用
    	if(KEY == 0)	//再次确认是否真的按键被按下
    	{
    		LED = ~LED;	   //开灯/关灯
    	}
    }
    

    定时器/计数器中断

    需要了解的知识

    51单片机有两组定时器/计数器,因为既可以定时,又可以计数,故称之为定时器/计数器。

    定时器/计数器和单片机的CPU是相互独立的。定时器/计数器工作的过程是自动完成的,不需要CPU的参与。

    51单片机中的定时器/计数器是根据机器内部的时钟或者是外部的脉冲信号对寄存器中的数据加1。

    有了定时器/计数器之后,可以增加单片机的效率,一些简单的重复加1的工作可以交给定时器/计数器处理。CPU转而处理一些复杂的事情。同时可以实现精确定时作用。

    工作原理

    实质上是加1计数器,随着输入脉冲,计数器自动加1,
    溢出的时候会回0.,且计数器的溢出使相应的中断标志位 置1.
    向CPU发出中断请求。如果定时/计数器工作于定时模式,则表示定时时间已到;如果工作于计数模式,则表示计数值已满。
    可见,由溢出时计数器的值减去计数初值才是加1计数器的计数值。

    定时器结构

    定时/计数器的实质是加1计数器(16位),由高8位和低8位两个寄存器THx和TLx组成。TMOD是定时/计数器的工作方式寄存器,确定工作方式和功能;TCON是控制寄存器,控制T0、T1的启动和停止及设置溢出标志。
    在这里插入图片描述

    操作步骤(T0 T1)

    1.选择工作方式。设置M1、M0 (TMOD寄存器)
    2.选择控制方式。设置GATE(TMOD寄存器)
    3.选择定时器还是计数器模式。设置C/T(TMOD寄存器)
    4.给定时/计数器赋初值。设置THx 和 TLx(定时器初值寄存器)
    5.开启总中断。设置EA(IE寄存器)
    6.打开相应定时器中断允许。 设置ET0或ET1(IE寄存器)
    7.启动定时器。设置TR1或TR0(TCON寄存器)

    如何配置定时器

    这里就选择定时器0吧 选择方式1(16位)进行定时示例吧
    1.选择工作方式1(16位)M1=0;M0=1;
    2.控制方式 :仅有运行控制位TRx来控制定时/计数器的开启。GATE=0;
    3.选择定时器模式 C/T=0;

    TMOD=0x01;
    

    4.赋初值 这里选择定时为50ms 我的板子晶振是11.0592 具体怎么算我不会,推荐跟我一样不会的用软件mcuelf计算出以下结果
    在这里插入图片描述

        TH0 = 0x4C;
        TL0 = 0x00;
    

    5.打开总中断(总开关)

    EA=1;
    

    6.打开T0中断开关

    ET0=1;
    

    7.启动定时器0

    TR0=1;
    
    //配置定时器函数
    void time0Config()
    {
    	TMOD=0x01; //设定T0定时器,选择工作方式1(16位),定时器模式 仅有运行控制位TRx来控制定时/计数器的开启。
    	TH0 = 0x4C;  //初值设定
    	TL0 = 0x00;	 //初值设定
    	EA=1;        //打开总中断开关
    	ET0=1;		 //打开T0中断开关
    	TR0=1;		 //启动定时器0
    }
    
    
    //发生中断执行函数(这样就是50ms)
    void time0() interrupt 1   //T0中断号为1
    {
    	/*要注意这里不会自动重装,所以要再次设置回初值(除工作方式2)*/
    	TH0 = 0x4C;  //初值重新设定
    	TL0 = 0x00;	 //初值重新设定
    	
    	//编写你要做的事
    }
    

    程序示例

    这里就写一个用定时器来做一个简单的时钟显示在LCD1602上
    LCD1602我昨天发布了一个LCD1602的使用和显示hello word。这里就是详细讲LCD1602具体的操作了。

    引脚定义

    //引脚定义
    #define LCD P0
    sbit E = P2^7;   //使能
    sbit RS = P2^6;  //数据/命令(H/L)
    sbit RW = P2^5; //读写(H/L)
    
    

    lcd1602.h

    void write_com(unsigned char command);	//写命令函数
    void write_data(unsigned char dat);		//写数据函数
    void init_lcd();  //初始化LCD1602函数
    void delay5ms();  //延时5ms函数	
    

    lcd1602.c

    #include <reg52.h>
    #include "lcd1602.h"
    
    #define LCD P0
    sbit E = P2^7; 
    sbit RS = P2^6;
    sbit RW = P2^5;
    
    /******延迟5毫秒函数********/
    void delay5ms()   //误差 -0.000000000001us
    {
        unsigned char a,b;
        for(b=15;b>0;b--)
            for(a=152;a>0;a--);
    }
    
    
    /******LCD1602写命令函数********/
    void write_com(unsigned char command)
    {
    	RS = 0; 
    	RW = 0; 	//高读低写
    	LCD = command;
    	delay5ms(); //这里延时最低要30纳秒 我们直接给5ms
    	E = 1;		//使能拉高 
    	delay5ms(); //最低要求延迟150纳秒 我们直接给5ms
    	E = 0;
    }
    
    /******LCD1602写数据函数********/
    void write_data(unsigned char dat)
    {
    	RS = 1;
    	RW = 0;
    	LCD = dat;
    	delay5ms(); //这里延时最低要30纳秒 我们直接给5ms
    	E = 1;		//使能拉高 
    	delay5ms(); //最低要求延迟150纳秒 我们直接给5ms
    	E = 0;
    }
    /******初始化LCD1602********/
    void init_lcd()
    {	
    	write_com(0x06); //写入数据后光标自动右移 整屏不移动。
    	write_com(0x0c); //开显示功能 无光标 不闪烁
    	write_com(0x38); //数据总线8位 16X2显示 5*7点阵
    	write_com(0x01); //清屏 0000 0001
    }
    

    main.c

    #include <reg52.h>
    #include "lcd1602.h"
    
    unsigned char t = 0; //用来计数时间
    unsigned char i=0;
    unsigned char hours = 23;  //小时
    unsigned char minutes = 59; //分钟
    unsigned char seconds = 0; //秒
    
    unsigned char date[16] = {"2021-01-27   WED"};
    unsigned char time[5] = {"time:"};
    
    //配置定时器函数
    void time0Config()
    {
    	TMOD=0x01; //设定T0定时器,选择工作方式1(16位),定时器模式 仅有运行控制位TRx来控制定时/计数器的开启。
    	TH0 = 0x4C;  //初值设定
    	TL0 = 0x00;	 //初值设定
    	EA=1;        //打开总中断开关
    	ET0=1;		 //打开T0中断开关
    	TR0=1;		 //启动定时器0
    }
    
    void main()
    {	
    	init_lcd();	 //1.初始化lcd1602
    	
    	write_com(0x80); //设置显示日期位置 (第一行第一个开始)
    	for(i=0;i<16;i++)
    	{
    		write_data(date[i]);	
    	}
    	
    	write_com(0xc0); //设置显示time:位置(第二行第一个开始)
    	for(i=0;i<5;i++)  
    	{
    		write_data(time[i]);		
    	}
    	
    	time0Config();//调用定时器中断
    
    	while(1)
    	{
    		write_com(0xc6); 	//设置显示小时的十位 位置
    		write_data(hours/10+'0');	//小时十位
    		write_com(0xc7); 	//设置显示小时的个位 位置
    		write_data(hours%10+'0');	//小时个位
    	
    		write_com(0xc8); //设置显示: 位置
    		write_data(':');			//显示 :
    	
    		write_com(0xc9); 	//设置显示分钟的十位 位置
    		write_data(minutes/10+'0');	//分钟十位
    		write_com(0xca); 	//设置显示分钟的个位 位置
    		write_data(minutes%10+'0');	//分值个位
    	
    		write_com(0xcb); 	//设置显示: 位置
    		write_data(':');			//显示 :
    	
    		write_com(0xcc); 	//设置显示秒的十位 位置
    		write_data(seconds/10+'0');	//秒十位
    		write_com(0xcd); 	//设置显示秒的 个位 位置
    		write_data(seconds%10+'0');	//秒个位
    						
    	}
    }
    
    //发生中断执行函数(一次就是50ms)
    void time0() interrupt 1   //T0中断号为1
    {
    	/*要注意这里不会自动重装,所以要再次设置回初值(除工作方式2)*/
    	
    	TH0 = 0x4C;  //初值重新设定
    	TL0 = 0x00;	 //初值重新设定	
    	t++;
    	if(t == 20) //证明够1秒了 20 X 50ms = 1000ms = 1s
    	{
    		seconds++;	//秒+1
    		t=0;   //够了1秒设置为0 重新计数
    	}
    	if(seconds == 60) //如果秒到60
    	{
    		minutes++;   //分钟+1
    		seconds = 0; //秒回0
    	}
    	if(minutes == 60) //如果分钟到60
    	{
    		hours++;     //小时+1
    		minutes = 0; //分钟回0
    	}
    	if(hours == 24 ) //如果小时到24
    	{
    		hours = 0;   //小时回0
    	}
    	
    }
    

    最终项目展示

    在这里插入图片描述

    展开全文
  • 51单片机中断

    2021-03-09 21:35:10
    中断 中断时为使单片机具有对...中断也可以进行嵌套,如果单片机正在处理一个中断程序,此时,又有另一个中断现象发生,单片机将会停止当前的中断程序,而转去执行新的中断程序,新中断程序处理完毕后再回到刚才停止的中断
  • 有关51单片机中断的形式和C语言编程格式void INT0()interrupt 0 using 1 {.... ..... } interrupt 0 指明是外部中断0; interrupt 1 指明是定时器中断0; interrupt 2 指明是外部中断1; interrupt 3 指明是定时器...
  • 如题: ** 代码如下: ** #include<reg52.h> void delay() { int i,j; for(i=0;i<200;i++) for(j=0;j<200;j++); } void delay_1s() { int i=0;...//闪烁led 外部中断 void flas
  • 51单片机外部中断实验报告51单片机外部中断实验实验报告要求:整理本实验涉及的程序,将它们按正确的格式详细书写在实验报告纸上。无中断时发光让发光二极管从左到右依次点亮,有外部中断请求时,4位数码管从0000...
  • 51单片机 外部中断

    千次阅读 2021-04-09 21:13:42
    为了降低CPU的占有率,同时实现单片机对复杂情景的处理,引入了中断。 CPU与外设并行工作,当外设数据准备好或者有某种突发事件发生时,向CPU提出请求,CPU暂停正在进行的工作,为该外设服务(或者处理紧急事件),...
  • 中断服务 ,中断计数器加1 MOV TH0,#0D8H MOV TL0,#0EFH ;12M晶振,形成 10 毫秒中断 RETI START: MOV SP,#50H MOV TH0,#0D8H MOV TL0,#0EFH MOV TMOD,#01H MOV IE,#82H MUSIC0: NOP MOV DPTR,#DAT ; 表头地址送DPTR...
  • byproteus还有很多问题,这篇只是笔记ORG0000HAJMPMAINORG0003HAJMPINTTERRUPT0ORG0013HAJMPINTTERRUPT...初始化外部中断SETB EASETB EX0SETB EX1CLRIT0CLR IT1LOOP:LCALLFIND ;流水灯方式1MOVP0,R3LCALLDELAYCJNE...
  • 中断系统的运行必须与中断服务子程序配合才能正确使用。设计中断服务子程序需要首先明确以下几个问题。中断服务子程序设计的任务中断服务子程序设计的基本任务有下列4条:(1)设置中断允许控制寄存器IE,允许相应的...
  • 单片机里面有很多中断资源,例如外部中断、定时器中断、串口中断等,这些中断资源应当用于处理相应的紧急事件,而不是顺序执行的常规事件,所以在编写中断程序的时候应当十分注意。 具体的事务处理语句不应放在...
  • 51单片机利用中断触发实现流水灯 笨死你使用软件:C51单片机框架生成工具。自动生成程序框架。 Proteus仿真 程序代码 #include<REG52.H> #include <intrins.h> //函数说明...... void Init_P( ...
  • 所以,51单片机中共有5个中断院,CPU是靠中断服务程序入口辨别哪个中断源产生。 【1】外部中断0(INT0/P3.2):中断服务程序入口地址为0003H。 【2】外部中断1(INT0/P3.3):中断服务程序入口地址为0013H。 【3】定
  • 51c程序51单片机定时器中断程序(C语言)用C语言实现的,先要定义好定时器的初值不管你使用多大的晶振,使用51单片机,一般都是12分频出来,也就可以得出一个机器周期机器周期=12/n(n指晶振频率),假设你要定时的时间...
  • //开启总中断 IT1=1; //中断触发模式 //=0为低电平触发,=1为下降沿触发 EX1=1; //外部中断允许位 while(1) { led1=0; } } void int1() interrupt 0 { led=~led1; } 解释: 1.外部中断
  • /*以下是能在keilC 中变异的源码,直接粘贴过去就行,外部中断0(INT0)和外部中断1都有(INT1)*//*程序很简单,但是对新手来说还是很实用的*//*******************************************************************//...
  • 51单片机中断

    2021-08-25 20:23:55
    2.51单片机中断源:外部中断0、定时计数器中断0、外部中断1、定时计数器中断1、串口中断。 3.与中断相关的寄存器:IE(中断允许控制寄存器)、TCON(控制寄存器)、IP(中断优先级控制寄存器) SCON(串行口控制寄存器)...
  • ////////////////////////////////////////////////////////////////////////////EA 是 中断总开关, 不管是定时器,串口还是外部中断,都需要打开 EA 才能触发中断;ET0是 定时器0 的专用中断开关, 也就是说: 打开了EA....
  • 1、单片机中断:找了一张 80C51 单片机的图如下:其中,在 P3.2、P3.3 的位置,即 12 ,13 引脚处,标有 INT0 和 INT1,那两个引脚就是外部中断的输入。上面一个横杠代表低电平有效,给 P3.2、P3.3 赋值 0,就可以...
  • 程序显示八位流水灯;;外部中断0:左右四位闪烁三次;;外部中断1:各位间隔闪烁三次。;仿真电路如下:;程序如下:ORG 0000HLJMP STARTORG 0003HLJMP X0_INTORG 0013HLJMP X1_INTORG 0030HSTART:SETB IT0SETB IT1...
  • 本设计旨在使用中断0(INT0)的方式,完成2种样式的LED显示的设计。 操作方法:开始仿真,则运行demo2样式,等一段时间,当按下开关“Change”则运行另一种样式。 仿真: 参考代码: #include<reg52.h>...
  • 描述在接下来的教程中,将会介绍定时器、串口通信等外设的基本使用,而这些外设的使用都要涉及中断,而且中断单片机或嵌入式开发中一个相当重要的概念。不能掌握中断系统,就无法灵活应用这些外设。1、什么是中断...
  • 说最基本的,老的51单片机(80C51系列)有5个中断源,2个优先级,可以实现二级中断服务嵌套。现在很多扩展的51单片机已经有4个优先级(或更多)和更多的中断源了。在说到中断之前,我先来定义一下优先级,明白了什么是...
  • 51单片机外部中断0实例详解

    千次阅读 2021-05-22 03:49:54
    今天就以51单片机的外部中断0为例,来简单讲解一下单片机中断的用法。151单片机的中断源51单片机共有5个中断源,分别为:外部中断0定时器0中断外部中断1定时器1中断串口中断每一个中断都对应一个中断向量,中断向...
  • 浏览文章用51单片机中断编写的4x4键盘程序作者:未知来源:山涧一溪流点击数:…更新时间:2014年06月22日 【字体:大 中 小】应用查询扫描编写键盘程序,由于要给按键去抖动,程序变得比较复杂和冗长(详见2013年9月29...
  • 以下 ZDT0 为定时器中断程序ZDT0: PUSH ACCPUSH DPHPUSH DPLMOV TH0,#0D8HMOV TL0,#0F0HDJNZ COUNT,EXITJB P3.5,NIZHUAN ;查询方向标志,P3.5 接换向开关 K2MOV FX,#11HNIZHUAN:MOV A,FXCJNE A,#11H,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 18,716
精华内容 7,486
关键字:

51单片机中断程序