精华内容
下载资源
问答
  • 51单片机中断函数
    万次阅读 多人点赞
    2019-05-28 16:57:11
    #include<reg52.h>
    
    void main()
    {
    	P1 = 0x0f;// 0000 1111 下面四个灯亮 上面四个灯灭
    	EX1 = 1;//INT1中断允许
    	EA = 1;//全局中断打开
    	IT1 = 1;//触发方式为下降沿触发
    	while(1);
    }
    
    void jump_low()	 interrupt 2
    {
    	P1 = ~P1;  //位反转
    }

    关于interrupt函数用法:


    void +函数名+interrupt +数字0~4


    0 表示外部中断0


    1 表示定时器/计数器(T0)


    2外部中断1


    3:定时器/计数器(T1)


    4:串行口

     

    更多相关内容
  • 本文为大家介绍了51单片机中断函数注意事项。
  • 本文主要介绍了关于MCS-51单片机中断函数的几点注意事项,希望对你的学习有所帮助。
  • C51 单片机中断函数的定义及应用 C51 函数声明对 ANSI C 作了扩展具体包括 1.中断函数声明 中断声明方法如下 void serial_ISR interrupt 4 using 1 { /* ISR */ } 为提高代码的容错能力在没用到的中断入口处生成 ...
  • 单片机技术
  • C51单片机中断函数的定义及应用.docx
  • 51单片机
  • 51单片机中断函数

    2020-07-25 21:24:45
    本文给大家介绍的是51单片机中断函数
  • 单片机51中断函数如何使用

    千次阅读 2021-12-01 15:05:47
    大家可能会觉得我们用延时函数照样可以实现上一讲代码的实验现象,但是定时器与延时的概念不同,延时函数需要占用CPU的使用权,正在延时的时候其他任务没有CPU的使用权就会拖慢执行效率。 而定时器是不需要占用CPU...

    1.定时器与延时的区别

    大家可能会觉得我们用延时函数照样可以实现代码的实验现象,但是定时器与延时的概念不同,延时函数需要占用CPU的使用权,正在延时的时候其他任务没有CPU的使用权就会拖慢执行效率。

    而定时器是不需要占用CPU的使用权的,它是独立自己运行的,就像我们调好5分钟的闹钟,在这5分钟里我们可以随意执行任务,也可以什么事都不做,但是5分钟过后闹钟响了就要执行相关的任务了。

    所以代码的实现原理就是每隔51微秒,有个变量会自加1,过了1000个51微秒的时候LED的状态才会改变,可以说CPU在51ms的时间里基本没什么事做,只是在51微秒到了的时候做了“cnt++;”这样简单的任务,然后又空闲地等下一个51微秒的到来再执行“cnt++;”。

    2.定时器中断函数

    与外部中断一样,定时器中断也有中断函数,同理,程序去执行中断函数就会把TF0的中断标志位自动清0,所以只要我们用了定时器中断函数,那么TF0就可以不用再出现在程序书写中了。

    8.3.png

    同样定时器0的中断函数使能如下

    QQ截图20200518195134.png

    至于“interrupt”后面的数字为什么是1

    6.11.png

    这些编号是为了区分哪些硬件资源的相关中断函数,如果我们同时使用两个定时器,那么只能用“interrupt 1”和“interrupt 3”来区分谁是谁的中断函数了。

    使用“TIM0_IRQHandler”作为函数名也是模仿STM32定时器中断函数名的写法。

    如果我们使用的是工作模式1,每次触发中断函数的执行内容首先就是再次给TH0和TL0赋初值保证下次的定时时间还是一样。

    这里我们使用中断函数的执行方式来实现30ms的间隔流水灯,算出TH0和TL0合成的“16位的变量”要填充的值为37888=0x9400。

    在中断函数里也是可以定义局部变量的,当然如果这个变量是用来辅助流水灯的,那么肯定是要定义成静态变量的。

    3.代码

    #include <reg51.h> 
    #include <function.h>
     
    void main(){
        LED_Init();  //初始化LED硬件模块
        EA = 1;      //闭合总中断开关
        TMOD = 0x01; //设置定时器0为工作模式1
        TH0  = 0x94; //设置定时时间为30ms
        TL0  = 0x00;
        ET0  = 1;    //闭合定时器0中断的开关
        TR0  = 1;    //启动定时器0 
        while(1);
    }
      
    void TIM0_IRQHandler() interrupt 1{
        static u8 i;
        TH0  = 0x94;  //重新设置定时时间为30ms
        TL0  = 0x00;
       
        P0=~(0x80>>i);//这一次让流水灯向右移
        i++;
        if(i>=8)i=0;
    }

    觉得30ms的流速太快,想改为300ms的话,修改一下中断函数即可,如下

    void TIM0_IRQHandler() interrupt 1{
        static u8 i,cnt;
        TH0  = 0x94;      //重新设置定时时间为30ms
        TL0  = 0x00;
        cnt++;
       
        if(cnt>=10){
            cnt=0;
            P0=~(0x80>>i);//这一次让流水灯向右移
            i++;
            if(i>=8)i=0;
        }
    }

    展开全文
  • C51编译器从绝对地址8m+3处产生一个中断向量,其中m为中断号,也即interrupt后面的数字。该向量包含一个到中断函数入口地址的绝对跳转。
  • 《C51中断函数的写法(最新整理)》由会员分享,可在线阅读,更多相关《C51中断函数的写法(最新整理)(4页珍藏版)》请在人人文库网上搜索。1、一、中断允许控制CPU 对中断系统所有中断以及某个中断源的开放和屏蔽是由...

    《C51中断函数的写法(最新整理)》由会员分享,可在线阅读,更多相关《C51中断函数的写法(最新整理)(4页珍藏版)》请在人人文库网上搜索。

    1、一、中断允许控制CPU 对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器IE 控制的。EX0(IE.0),外部中断 0 允许位;ET0(IE.1),定时/计数器 T0 中断允许位;EX1(IE.2),外部中断 0 允许位;ET1(IE.3),定时/计数器 T1 中断允许位;ES(IE.4),串行口中断允许位;EA (IE.7), CPU 中断允许(总允许)位。80C51 单片机定时/计数器的工作由两个特殊功能寄存器控制。TMOD 用于设置其工作方式;TCON 用于控制其启动和中断申请。一、工作方式寄存器 TMOD工作方式寄存器 TMOD 用于设置定时/计数器的工作方式,低四位用于。

    2、 T0,高四位用于 T1。其格式如下:GATE:门控位。GATE0 时,只要用软件使 TCON 中的 TR0 或 TR1 为 1,就可以启动定时/计数器工作;GATA1 时,要用软件使 TR0 或 TR1 为 1,同时外部中断引脚 INT0/1也为高电平时,才能启动定时/计数器工作。即此时定时器的启动条件,加上了 INT0/1 引脚为高电平这一条件。:定时/计数模式选择位。C/T 0 为定时模式;C/T=1 为计数模式。M1M0:工作方式设置位。定时/计数器有四种工作方式,由 M1M0 进行设置。TCON 的低 4 位用于控制外部中断,已在前面介绍。TCON 的高 4 位用于控制定时/计数器的。

    3、启动和中断申请。其格式如下:TF1(TCON.7):T1 溢出中断请求标志位。T1 计数溢出时由硬件自动置TF1 为 1。CPU 响应中断后TF1 由硬件自动清 0。T1 工作时,CPU 可随时查询TF1的状态。所以,TF1 可用作查询测试的标志。TF1 也可以用软件置 1 或清 0,同硬件置 1 或清 0 的效果一样。TR1(TCON.6):T1 运行控制位。TR1 置 1 时,T1 开始工作;TR1 置 0 时,T1 停止工作。TR1 由软件置 1 或清 0。所以,用软件可控制定时/计数器的启动与停止。TF0(TCON.5):T0 溢出中断请求标志位,其功能与 TF1 类同。TR0(TCO。

    4、N.4):T0 运行控制位,其功能与 TR1 类同。3.3.5 定时/计数器应用举例初始化程序应完成如下工作:对 TMOD 赋值,以确定 T0 和 T1 的工作方式。计算初值,并将其写入 TH0、TL0 或 TH1、TL1。中断方式时,则对 IE 赋值,开放中断。使 TR0 或 TR1 置位,启动定时/计数器定时或计数。定时器 T0 中断的初始化TMOD=0x01;设定工作方式为 16 位定时器TH0=(65536-50000)/256; 赋定时器 T0 高四的值为 50MS(对 256 求模) TL0=(65536-50000)%256; 赋定时器 T0 低四的值为 50MS(对 256 求。

    5、余) EA=1;开总中断ET0=1;开定时器 T0 中断TR0=1;启动定时器 T0当定时器时间到产生中断就自动跳到以下中断函数,中断函数不需要做任何声明;void timer0( ) interrupt 1 5 个中断源的排序:0 代表外部中断 0 中断 ,1 代表定时器/计数器 0 中断 ,2 代表外部中断 1 中断, 3 代表定时器/计数器 1, 4 代表串行中断的中断TH0=(65536-50000)/256;重装初值TL0=(65536-50000)%256;重装初值往下写 CPU 要处理的事情就 OK 了中断响应条件中断源有中断请求;此中断源的中断允许位为 1;CPU 开中断(即 。

    6、EA=1)。以上三条同时满足时,CPU 才有可能响应中断。P3.2 口的外部中断EA=1;/开总中断EX0=1;/开外部中断 0/IT0=1;/当 IT=0 时为电平的外部中断触发方式,当 IT=1 时位跳变沿外部中断触发方式TCON=0x01;(这是对寄存器将 IT 置 1,和 IT0=1 的效果是一样的)因为 TCON 的地址是可以被 8 整除,所以可以对其进行位操作。当符合外部中断的条件时执行下面的中断函数void exter0() interrupt 0 5 个中断源的排序:0 代表外部中断 0 中断 ,1 代表定时器/计数器 0 中断 ,2 代表外部中断 1 中断, 3 代表定时器/。

    7、计数器 1, 4 代表串行中断的中断这里下写 CPU 要处理的事情就 OK 了“”“”At the end, Xiao Bian gives you a passage. Minand once said, people who learn to learn are very happy people. In every wonderful life, learning is an eternal theme. As a professional clerical and teaching position, I understand the importance of continuous 。

    8、learning, life is diligent, nothing can be gained, only continuous learning can achieve better self. Only by constantly learning and mastering the latest relevant knowledge, can employees from all walks of life keep up with the pace of enterprise development and innovate to meet the needs of the market. This document is also edited by my studio professionals, there may be errors in the document, if there are errors, please correct, thank you。

    展开全文
  • 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在上电后,PSW的RS两个位默认为0,也即51默认使用工作寄存器组BANK 0,在默认状态下,对于普通的C语言函数,其传参、申请局部变量、导出函数的返回值等功能...对于51中断服务函数,它没有形参,也不用返回值,...
  • 51单片机----中断

    千次阅读 2022-02-10 13:22:27
    51单片机有5个中断源: 2个外部中断 3个内部中断 你要是低电平触发它还是下降沿触发它。 低电平就是说你这个p32收到一个0v的时候代表外面有一个中断源产生了那么我就会进入我的一个中断程序中去。 下降沿...
  • 51单片机的几种中断的用法

    千次阅读 2021-06-19 21:07:11
    1.外部中断0
  • 单片机中断函数中的全局变量问题

    千次阅读 2020-02-19 14:02:38
    然后呢,我不想在中断函数里写太多代码,便只在中断函数里放了一个全局变量,按下按钮进入中断时改变该变量的值,然后在主程序中判断该值,来执行接下来的程序,部分程序代码如下: void main() { // PX0=3; // ...
  • (2)用接在两个外部中断上的按键调整方波信号的频率,一个按键使得频率增加,一个按键使得频率减少,频率范围和频率变化步长自定; (3)按键改变频率的同时将频率值通过串口发送给上位机,在上位机的串口调试助手...
  • CPU正在处理某个事件,突然另外一个事件需要处理,于是进入中断后,而你不想将现在执行的程序的各寄存器状态入栈,那么可以把这个中断程序放入另一个寄存器组,如切换到1组,然后退出中断时,再切回到0组(原来的...
  • 描述今天就以51单片机的外部中断0为例,来简单讲解一下单片机中断的用法。151单片机的中断源51单片机共有5个中断源,分别为:外部中断0定时器0中断外部中断1定时器1中断串口中断每一个中断都对应一个中断向量,中断...
  • C51中断函数

    2020-08-03 19:25:58
    C51的中断函数的格式为:void FuncIr(void) interrupt x [using y],本文主要对C51的中断函数进行了分析
  • //开启总中断 IT1=1; //中断触发模式 //=0为低电平触发,=1为下降沿触发 EX1=1; //外部中断允许位 while(1) { led1=0; } } void int1() interrupt 0 { led=~led1; } 解释: 1.外部中断
  • 51单片机(十四)—— 中断功能介绍

    千次阅读 多人点赞 2020-02-19 20:31:09
    中断是单片机的一个重要功能,本文我们就对51单片机中断进行介绍。 所谓“中断”,通俗一点讲,就是单片机停止正在执行的任务,转去执行其它的急需解决的任务,当这个任务完成之后,在回到原来的任务继续执行。...
  • 51单片机串口通信实操(中断函数) 详细参考单片机手册 SM0、SM1分别为0,1时为模式一,因为模式一最为常用 REN=1,为接收,REN=0,为不接收 当 SM0,SM1,SM2,REN,TB8,RB8,TI,RI分别为0 1 0 0 0 0 0时,给SCON赋值时要...
  • 本文主要介绍了关于C51的中断函数要注意的几个问题。
  • 这是一个单片机C51串口接收(中断)和发送例程,可以用来测试51单片机中断接收和查询发送,另外我觉得发送没有必要用中断,因为程序的开销是一样的
  • 51单片机中断程序大全

    千次阅读 2021-12-31 10:51:41
    51 单片机中断
  • 程序思路:该程序是利用51单片机的定时器中断,另外根据音符的频率计算每个音符定时时长从而输出不同音符对应的PWM波驱动蜂鸣器播放音乐。 使用工具:Keil4,protues8;程序具体代码和仿真原理图都已打包放到《基于...
  • 51单片机因为工作寄存器组太少,默认设置下,一组工作寄存器最多传递三个参数,多出的会通过固定存储区传送,函数指针参数最多支持三个, 但是即使少于三个也会出现问题,因为带返回值和临时函数变量的话,默认配置...
  • ---- 在定时中断函数里处理独立按键的扫描程序,可以有效地避免这个问题。 ---- 单片机:AT89C52 ************************************************************************************************************...
  • 可以看到,外部中断1(INT1)位于P3_3口,在P3_3处连接一个按钮,当按钮按下时,P3_3 = 0,由此触发中断函数 在此之前,打开中断总开关EA = 1,中断使能EX1 = 1,采用下降沿触发 #include <REGX52.H> ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,471
精华内容 6,988
关键字:

51单片机中断函数

友情链接: yuanma.rar