51单片机中断程序大全
MCS-51单片机的中断系统
MCS-51单⽚机的中断系统单⽚机中断技术概述在任何⼀款事件驱动型的CPU⾥⾯都应该会有中断系统,因为中断就是为响应某种事件⽽存在的。
中断的灵活应⽤不仅能够实现想要的功能,⽽且合理的中断安排可以提⾼事件执⾏的效率,因此中断在单⽚机应⽤中的地位是⾮常重要的。
单⽚机中断(Interrupt)是硬件驱动事件,它使得CPU暂停当前的主程序,转⽽去执⾏⼀个中断服务⼦程序。
为了更形象地理解中断,下⾯以学⽣上⾃习时接电话为例阐述⼀下中断的概念。
单⽚机的中断系统有5个中断源、2个中断优先级,可实现两级中断服务程序嵌套。
如果单⽚机没有中断系统,单⽚机的⼤量时间可能会浪费在查询是否有服务请求发⽣的定时査询操作上。
采⽤中断技术完全消除了单⽚机在査询⽅式中的等待现象,⼤⼤地提⾼了单⽚机的⼯作效率和实时性。
单⽚机中断系统结构及中断控制中断系统结构图如图5-2所⽰。
由图5-2可见,MCS-51中断系统共有5个中断请求源:INT0——外部中断请求0,中断请求信号由INT0引脚输⼊。
定时/计数器T0计数溢出发出的中断请求。
INT1——外部中断请求1,中断请求信号由INT1引脚输⼊。
定时/计数器T1计数溢出发出的中断请求。
串⾏⼝中断请求。
中断优先级从⾼到底排列。
单⽚机如何知道有中断请求信号?是否能够响应该中断?若5个中断源请求信号同时到来,单⽚机如何响应?这些问题都可以由中断寄存器来解决。
单⽚机中断寄存器有中断标志寄存器TCON和SCON、中断使能寄存器IE和中断优先级寄存器IP,这些寄存器均为8位。
中断标志寄存器5个中断请求源的中断请求标志分别由TCON和SCON的相应位锁存,单⽚机通过这些中断标志位的状态便能知道具体是哪个中断源正在申请中断。
TCON寄存器TCON寄存器为定时/计数器的控制寄存器,字节地址为88H,可位寻址。
特殊功能寄存器TCON的格式如图5-3所⽰。
TCON各标志位功能如下。
TF1——定时/计数器T1的溢出中断请求标志位。
51单片机中断程序大全
//实例 42 :用定时器 T0 查询方式 P2 口 8 位控制 LED 闪烁#include<reg51.h>//包含51单片机寄存器定义的头文件/**************************************************************函数功能:主函数**************************************************************/void main(void){// EA=1;// 开总中断// ET0=1;// 定时器 T0 中断允许TMOD=0x01;// 使用定时器 T0 的模式 1TH0=(65536-46083)/256; // 定时器 T0 的高 8 位赋初值TL0=(65536-46083)%256; // 定时器 T0 的高 8 位赋初值TR0=1;// 启动定时器 T0TF0=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<reg51.h>sbit sound=P3^7;// 将// 包含 51 单片机寄存器定义的头文件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;// 启动定时器 T1TF1=0;while(1)// 无限循环等待查询{while(TF1==0);TF1=0;sound=~sound; // 将 P3.7 引脚输出电平取反TH1=(65536-921)/256; // 定时器 T0 的高 8 位赋初值TL1=(65536-921)%256; // 定时器 T0 的高 8 位赋初值}}//实例 44 :将计数器 T0 计数的结果送 P1 口 8 位 LED 显示#include<reg51.h> // 包含 51 单片机寄存器定义的头文件 sbitS=P3^4; // 将 S位定义为 P3.4 引脚/**************************************************************函数功能:主函数**************************************************************/void main(void){// EA=1;// 开总中断// ET0=1;// 定时器 T0 中断允许2TMOD=0x02;// 使用定时器 T0 的模式TH0=256-156; // 定时器 T0 的高 8 位赋初值TL0=256-156; // 定时器 T0 的高 8 位赋初值TR0=1;// 启动定时器 T0while(1)// 无限循环等待查询{while(TF0==0)// 如果未计满就等待{if(S==0)// 按键S 按下接地,电平为0P1=TL0; //计数器 TL0 加 1 后送 P1 口显示}TF0=0; // 计数器溢出后,将TF0清 0}}//实例 45 :用定时器 T0 的中断控制 1 位 LED 闪烁#include<reg51.h> // 包含 51 单片机寄存器定义的头文件sbit D1=P2^0; // 将 D1 位定义为 P2.0 引脚/**************************************************************函数功能:主函数**************************************************************/void main(void){EA=1;// 开总中断ET0=1;// 定时器 T0 中断允许TMOD=0x01;// 使用定时器 T0 的模式 2TH0=(65536-46083)/256; //定时器 T0 的高 8 位赋初值TL0=(65536-46083)%256; //定时器 T0 的高 8 位赋初值TR0=1;// 启动定时器 T0while(1)// 无限循环等待中断;}/**************************************************************函数功能:定时器T0 的中断服务程序**************************************************************/void Time0(void) interrupt 1 using 0 // “interrupt ”声明函数为中断服务函数// 其后的 1 为定时器 T0 的中断编号; 0 表示使用第 0 组工作寄存器{D1=~D1; // 按位取反操作,将P2.0 引脚输出电平取反TH0=(65536-46083)/256; //定时器 T0 的高 8 位重新赋初值TL0=(65536-46083)%256; //定时器 T0 的高 8 位重新赋初值}//实例 46 :用定时器 T0 的中断实现长时间定时#include<reg51.h> //包含51单片机寄存器定义的头文件sbit D1=P2^0; // 将 D1 位定义为 P2.0 引脚unsigned char Countor; //设置全局变量,储存定时器T0 中断次数/**************************************************************函数功能:主函数**************************************************************/void main(void){EA=1;// 开总中断ET0=1;// 定时器 T0 中断允许TMOD=0x01;// 使用定时器 T0 的模式 2 TH0=(65536-46083)/256; //定时器 T0 的高 8 位赋初值TL0=(65536-46083)%256; //定时器 T0 的高 8 位赋初值TR0=1; Countor=0;// 启动定时器 T0// 从 0 开始累计中断次数while(1)// 无限循环等待中断;}/**************************************************************函数功能:定时器T0 的中断服务程序**************************************************************/void Time0(void) interrupt 1 using 0 // “interrupt ”声明函数为中断服务函数// 其后的 1 为定时器 T0 的中断编号; 0 表示使用第 0 组工作寄存器{Countor++; // 中断次数自加 1if(Countor==20)// 若累计满20 次,即计时满1s{D1=~D1; Countor=0;// 按位取反操作,将P2.0 引脚输出电平取反// 将 Countor 清 0,重新从 0 开始计数}TH0=(65536-46083)/256; //定时器 T0 的高 8 位重新赋初值TL0=(65536-46083)%256; //定时器 T0 的高 8 位重新赋初值}//实例 47 :用定时器 T1 中断控制两个 LED 以不同周期闪烁#include<reg51.h> //包含51单片机寄存器定义的头文件sbit D1=P2^0; // 将 D1 位定义为 P2.0 引脚sbit D2=P2^1; // 将 D2 位定义为 P2.1 引脚unsigned char Countor1; //设置全局变量,储存定时器unsigned char Countor2; //设置全局变量,储存定时器T1 中断次数T1 中断次数/**************************************************************函数功能:主函数**************************************************************/ void main(void){EA=1;// 开总中断ET1=1;// 定时器 T1 中断允许TMOD=0x10;// 使用定时器 T1 的模式 1TH1=(65536-46083)/256; //定时器 T1 的高 8 位赋初值TL1=(65536-46083)%256; //定时器 T1 的高 8 位赋初值TR1=1;// 启动定时器 T1Countor1=0;// 从 0 开始累计中断次数Countor2=0;// 从 0 开始累计中断次数while(1)// 无限循环等待中断;}/**************************************************************函数功能:定时器T1 的中断服务程序**************************************************************/void Time1(void) interrupt 3 using 0 // “interrupt ”声明函数为中断服务函数// 其后的 3 为定时器 T1 的中断编号; 0 表示使用第 0 组工作寄存器{Countor1++; //Countor1 自加 1Countor2++; //Countor2 自加 1if(Countor1==2) // 若累计满 2 次,即计时满{100msD1=~D1; Countor1=0;// 按位取反操作,将P2.0引脚输出电平取反// 将 Countor1 清 0,重新从 0 开始计数}if(Countor2==8) // 若累计满 8 次,即计时满 400ms {D2=~D2; Countor2=0;// 按位取反操作,将P2.1引脚输出电平取反// 将 Countor1 清 0,重新从 0 开始计数}TH1=(65536-46083)/256; //定时器 T1 的高 8 位重新赋初值TL1=(65536-46083)%256; //定时器 T1 的高 8 位重新赋初值}//实例 50-1 :输出 50 个矩形脉冲#include<reg51.h> // 包含 51 单片机寄存器定义的头文件sbit u=P1^4;// 将 u 位定义为 P1.4/*************************************************函数功能:延时约30ms (3*100*100=30 000μs =30m*************************************************/void delay30ms(void){unsigned char m,n;for(m=0;m<100;m++)for(n=0;n<100;n++);}/*******************************************函数功能:主函数******************************************/void main(void){unsigned char i;u=1;// 初始化输出高电平for(i=0;i<50;i++) // 输出 50 个矩形脉冲{u=1;delay30ms();u=0;delay30ms();}while(1);// 无限循环,防止程序“跑飞”}//实例 50-2 :计数器 T0 统计外部脉冲数#include<reg51.h> // 包含 51 单片机寄存器定义的头文件/*******************************************函数功能:主函数******************************************/void main(void){TMOD=0x06;// TMOD=0000 0110B,使用计数器 T0 的模式 2EA=1; ET0=0; TR0=1;// 开总中断// 不使用定时器// 启动 T0T0 的中断TH0=0; TL0=0; while(1)// 计数器 T0 高 8 位赋初值// 计数器 T0 低 8 位赋初值// 无限循环,不停地将TL0 计数结果送P1 口P1=TL0; }//实例 51-2 :定时器 T0 的模式 2 测量正脉冲宽度#include<reg51.h> // 包含 51 单片机寄存器定义的头文件sbit ui=P3^2;// 将 ui 位定义为 P3.0( INT0)引脚,表示输入电压/*******************************************函数功能:主函数******************************************/void main(void){TMOD=0x0a;// TMOD=0000 1010B,使用定时器T0 的模式2, GATE置 1EA=1; ET0=0; TR0=1; TH0=0; TL0=0; while(1)// 开总中断// 不使用定时器 T0 的中断// 启动 T0// 计数器 T0 高 8 位赋初值// 计数器 T0 低 8 位赋初值// 无限循环,不停地将TL0 计数结果送P1 口{while(ui==0)//INT0为低电平,T0 不能启动;TL0=0;//INT0 为高电平,启动T0 计时,所以将while(ui==1) // 在 INT0 高电平期间,等待,计时TL0清;P1=TL0;// 将计时结果送P1 口显示}}//实例 53 :用外中断 0 的中断方式进行数据采集#include<reg51.h> sbit S=P3^2;// 包含 51 单片机寄存器定义的头文件// 将 S位定义为 P3.2,/*******************************************函数功能:主函数******************************************/ void main(void){EA=1; // 开放总中断EX0=1; // 允许使用外中断IT0=1;// 选择负跳变来触发外中断P1=0xff;while(1);// 无限循环,防止程序跑飞}/**************************************************************函数功能:外中断T0 的中断服务程序**************************************************************/void int0(void) interrupt 0 using 0 // 外中断 0 的中断编号为 0{P1=~P1; // 每产生一次中断请求,P1 取反一次。
有关51单片机中断的形式和C语言编程格式[精选5篇]
有关51单片机中断的形式和C语言编程格式[精选5篇]第一篇:有关51单片机中断的形式和C语言编程格式有关51单片机中断的形式和C语言编程格式void INT0()interrupt 0 using 1 {.........} interrupt 0 指明是外部中断0; interrupt 1 指明是定时器中断0; interrupt 2 指明是外部中断1; interrupt 3 指明是定时器中断1; interrupt 4 指明是串行口中断;using 0 是第0组寄存器; using 1 是第1组寄存器; using 2 是第2组寄存器; using 3 是第3组寄存器;例如:/*-----------------外部中断程序-----------------*/ void ISR_Key(void)interrupt 0 using 1 { P1=~P1;//s3按下触发一次,P1取反一次 }/*-----------------串口中断程序-----------------*/ void UART_SER(void)interrupt 4 //串行中断服务程序 {unsigned char Temp;//定义临时变量if(RI)//判断是接收中断产生{RI=0;//标志位清零Temp=SBUF;//读入缓冲区的值P1=Temp;//把值输出到P1口,用于观察SBUF=Temp;//把接收到的值再发回电脑端}if(TI)//如果是发送标志位,清零TI=0;}第二篇:--单片机C语言编程实训实习报告实习地点:201机房实习时间:2014.12.1——2014.12.6 实习项目:单片机C语言编程实训指导老师:骆乐姓名:班级:电信3121一、实习内容 1.计算字符的ASCII码编写一个程序,在终端输入一个字符,输出它的ASCII码。
解题思路:通常我们输出一个字符一般用printf(“%c”,c);的形式,因为输出格式规定的是“%c”,因此表示以字符的形式输出,所以我们看到的是相对应的ASCII码的字符形式。
简述msc-51单片机中断处理过程的步骤
简述msc-51单片机中断处理过程的步骤1.引言1.1 概述MSC-51单片机是一种广泛应用的微控制器,其中断处理过程是系统中一个重要的组成部分。
中断处理指的是当外部设备或内部程序发生特定的事件时,单片机会中断正在执行的任务,转而处理这个事件。
中断处理过程的步骤是指在中断事件发生后,单片机执行的一系列操作以响应并处理这个事件。
中断处理过程的步骤包括中断请求检测和中断优先级判断。
首先,单片机会不断地检测是否发生了中断请求,这可以通过外部设备引起的中断请求信号或内部程序的中断请求指令来实现。
一旦检测到中断请求,单片机会停止当前正在执行的任务,保存当前的程序状态和现场信息。
接下来,单片机会进行中断优先级判断,确定哪个中断事件具有更高的优先级。
这意味着,如果同时发生多个中断请求,单片机需要根据优先级确定要先处理哪个中断。
一般而言,不同的中断请求会有不同的优先级,高优先级的中断请求会中断低优先级的中断请求。
一旦确定了中断优先级,单片机会保存当前的执行现场,并跳转到相应的中断服务程序。
中断服务程序是为了处理特定中断事件而编写的程序代码,它会执行一系列的操作,完成中断事件的处理。
处理完成后,单片机会从中断服务程序返回到中断发生时的位置,并恢复之前保存的程序状态和现场信息。
总之,MSC-51单片机中断处理过程是一个相对复杂的过程,涉及到中断请求检测、中断优先级判断以及中断服务程序的执行。
这个过程可以有效地响应和处理外部设备或内部程序的中断请求,提高单片机系统的实时性和可靠性。
文章结构部分主要介绍了本文的整体架构和章节安排。
以下是文章1.2文章结构部分的内容:1.2 文章结构本文分为引言、正文和结论三个部分。
具体结构如下:引言部分首先概述了MSC-51单片机中断处理过程的重要性和背景,接着介绍了本文的目的和意义。
正文部分主要包含两个章节。
第一个章节是MSC-51单片机中断处理过程的概述,详细介绍了中断处理的基本概念和原理。
51单片机中断程序大全
//实例42 :用定时器TO查询方式P2 口8位控制LED闪烁#include<reg51.h> // 包含 51 单片机寄存器定义的头文件/************************************************************** 函数功能:主函数void main(void){// EA=1; // 开总中断// ETO=1; // 定时器 TO 中断允许TMOD=OxO1; // 使用定时器 TO 的模式 1THO=(65536-46O83)/256; // 定时器 TO 的高 8 位赋初值TLO=(65536-46O83)%256; // 定时器 TO 的高 8 位赋初值TRO=1; // 启动定时器 TOTFO=O;P2=Oxff;while(1)// 无限循环等待查询{while(TFO==O)TFO=O;P2=~P2;THO=(65536-46O83)/256; // 定时器 TO 的高 8 位赋初值TL0=(65536-46083)%256; // 定时器 T0 的高 8 位赋初值}// 实例43 :用定时器T1 查询方式控制单片机发出1KHz 音频#include<reg51.h> // 包含 51 单片机寄存器定义的头文件sbit sou nd=P3^7; // 将 sound 位定义为 P3.7 引脚/**************************************************************函数功能:主函数**************************************************************/void main(void){// EA=1; // 开总中断// ET0=1; // 定时器 T0 中断允许TMOD=0x10; // 使用定时器 T1 的模式 1TH1=(65536-921)/256; // 定时器 T1 的高 8 位赋初值TL1=(65536-921)%256; // 定时器 T1 的高 8 位赋初值TR1=1; // 启动定时器 T1TF1=0;while(1)// 无限循环等待查询{while(TF1==0)TF1=0;sound=~sound; // 将 P3.7 引脚输出电平取反TH1=(65536-921)/256; // 定时器 T0 的高 8 位赋初值TL1=(65536-921)%256; // 定时器 T0 的高 8 位赋初值}}// 实例44 :将计数器T0 计数的结果送P1 口8 位LED 显示#include<reg51.h> // 包含 51 单片机寄存器定义的头文件sbit S=P3A4; //将S位定义为P3.4引脚/************************************************************** 函数功能:主函数**************************************************************/void main(void){// EA=1; // 开总中断// ET0=1; // 定时器 T0 中断允许TMOD=0x02; // 使用定时器 T0 的模式 2TH0=256-156; // 定时器 T0 的高 8 位赋初值TL0=256-156; // 定时器 T0 的高 8 位赋初值TR0=1; // 启动定时器 T0while(1)// 无限循环等待查询{while(TF0==0) // 如果未计满就等待{if(S==0) // 按键 S 按下接地,电平为 0P1=TL0; // 计数器 TL0 加 1 后送 P1 口显示}TFO=O; //计数器溢出后,将TFO清0}}// 实例45 :用定时器TO 的中断控制1 位LED 闪烁#include<reg51.h> // 包含 51 单片机寄存器定义的头文件sbit D仁P2A0; //将D1位定义为P2.0引脚/************************************************************** 函数功能:主函数**************************************************************/void main(void)ET0=1; // 定时器 T0 中断允许TMOD=0x01; // 使用定时器 T0 的模式 2TH0=(65536-46083)/256; // 定时器 T0 的高 8 位赋初值TL0=(65536-46083)%256; // 定时器 T0 的高 8 位赋初值TR0=1; // 启动定时器 T0while(1)// 无限循环等待中断J}/**************************************************************函数功能:定时器 T0 的中断服务程序**************************************************************/ void Time0(void) interrupt 1 using 0 // “ interrupt ”声明函数为中断服务函数// 其后的 1 为定时器 T0 的中断编号;0 表示使用第 0 组工作寄存器{D1=~D1; // 按位取反操作,将 P2.0 引脚输出电平取反TH0=(65536-46083)/256; // 定时器 T0 的高 8 位重新赋初值TL0=(65536-46083)%256; // 定时器 T0 的高 8 位重新赋初值}// 实例46 :用定时器T0 的中断实现长时间定时#include<reg51.h> // 包含 51 单片机寄存器定义的头文件sbit D仁P2P; //将D1位定义为P2.0引脚unsigned char Countor; 设置全局变量,储存定时器 T0 中断次数/**************************************************************函数功能:主函数**************************************************************/void main(void){EA=1; // 开总中断ET0=1; // 定时器 T0 中断允许TMOD=0x01; // 使用定时器 T0 的模式 2TH0=(65536-46083)/256; // 定时器 T0 的高 8 位赋初值TL0=(65536-46083)%256; // 定时器 T0 的高 8 位赋初值TR0=1; // 启动定时器 T0Countor=0; //从0开始累计中断次数while(1)// 无限循环等待中断J}函数功能:定时器 T0 的中断服务程序void Time0(void) interrupt 1 using 0 // “ interrupt ”声明函数为中断服务函数// 其后的 1 为定时器 T0 的中断编号;0 表示使用第 0 组工作寄存器{Countor++; // 中断次数自加 1if(Countor==20) // 若累计满 20 次,即计时满 1s{D1=~D1; // 按位取反操作,将 P2.0 引脚输出电平取反Countor=0; // 将 Countor 清 0 ,重新从 0 开始计数}TH0=(65536-46083)/256; // 定时器 T0 的高 8 位重新赋初值TL0=(65536-46083)%256; // 定时器 T0 的高 8 位重新赋初值}// 实例47 :用定时器T1 中断控制两个LED 以不同周期闪烁#include<reg51.h> // 包含 51 单片机寄存器定义的头文件sbit D仁P2P; //将D1位定义为P2.0引脚sbit D2=P2A1; //将D2位定义为P2.1引脚unsigned char Countor1; // 设置全局变量,储存定时器 T1 中断次数unsigned char Countor2; // 设置全局变量,储存定时器 T1 中断次数函数功能:主函数void main(void){EA=1; // 开总中断ET1=1; // 定时器 T1 中断允许TMOD=0x10; // 使用定时器 T1 的模式 1TH1=(65536-46083)/256; // 定时器 T1 的高 8 位赋初值TL1=(65536-46083)%256; // 定时器 T1 的高 8 位赋初值TR1=1; // 启动定时器 T1Countor1=0; // 从0 开始累计中断次数Countor2=0; // 从0 开始累计中断次数while(1)// 无限循环等待中断}函数功能:定时器 T1 的中断服务程序**************************************************************/void Time1(void) interrupt 3 using 0 // “ interrupt ”声明函数为中断服务函// 其后的 3 为定时器 T1 的中断编号;0 表示使用第 0 组工作寄存器g =30m {Countor1++;//Countor1 自加 1 Countor2++; //Countor2 自加 1if(Countor1==2) // 若累计满 2 次,即计时满 100ms{D1=~D1; // 按位取反操作,将 P2.0 引脚输出电平取反Countor1=0; // 将 Countor1 清 0 ,重新从 0 开始计数 }if(Countor2==8) // 若累计满 8 次,即计时满 400ms{D2=~D2; // 按位取反操作,将 P2.1 引脚输出电平取反Countor2=0; // 将 Countor1 清 0 ,重新从 0 开始计数 }TH1=(65536-46083)/256; // 定时器 T1 的高 8 位重新赋初值 TL1=(65536-46083)%256; // 定时器 T1 的高 8 位重新赋初值 }// 实例 50-1 :输出 50 个矩形脉冲#include<reg51.h> // 包含 51 单片机寄存器定义的头文件 sbit u=P1A 4; // 将 u 位定义为 P1.4***********************************************函数功能:延时约 30ms (3*100*100=30 000*************************************************/ void delay30ms(void) {unsigned char m,n;for(m=0;m<100;m++)for(n=0;n<100;n++)J}/*******************************************函数功能:主函数******************************************/void main(void){unsigned char i;u=1; // 初始化输出高电平for(i=0;i<50;i++) // 输出 50 个矩形脉冲{u=1;delay30ms();u=0;delay30ms();while(1); // 无限循环,防止程序“跑飞”}// 实例50-2 :计数器T0 统计外部脉冲数#include<reg51.h> // 包含 51 单片机寄存器定义的头文件/*******************************************函数功能:主函数******************************************/ void main(void) {TMOD=0x06; // TMOD=0000 0110B, 使用计数器 T0 的模式 2 EA=1; // 开总中断ET0=0; // 不使用定时器 T0 的中断TR0=1; // 启动 T0TH0=0; // 计数器 T0 高 8 位赋初值TL0=0; // 计数器 T0 低 8 位赋初值while(1) // 无限循环,不停地将 TL0 计数结果送 P1 口P1=TL0;// 实例51-2 :定时器T0 的模式2 测量正脉冲宽度#include<reg51.h> // 包含 51 单片机寄存器定义的头文件sbit ui=P3A2; //将ui位定义为P3.0 (INTO )引脚,表示输入电压/*******************************************函数功能:主函数******************************************/ void main(void) {TMOD=0x0a; // TMOD=0000 1010B, 使用定时器 TO 的模式 2 , GATE 置1EA=1; //开总中断ET0=0; // 不使用定时器 T0 的中断TR0=1; // 启动 T0TH0=0; // 计数器 T0 高8 位赋初值TL0=0; // 计数器 T0 低8 位赋初值while(1) //无限循环,不停地将TL0计数结果送P1 口{while(ui==0) //INT0为低电平,T0不能启动TL0=0; //INT0 为高电平,启动 T0 计时,所以将 TL0 清 0 while(ui==1)// 在 INT0 高电平期间,等待,计时JP1=TL0; // 将计时结果送 P1 口显示}}// 实例53 :用外中断0 的中断方式进行数据采集#include<reg51.h> // 包含 51 单片机寄存器定义的头文件sbit S=P3A2; // 将 S 位定义为 P3.2 ,/*******************************************函数功能:主函数******************************************/void main(void){EA=1; // 开放总中断EX0=1;// 允许使用外中断IT0=1; // 选择负跳变来触发外中断P1=0xff;while(1); // 无限循环,防止程序跑飞函数功能:外中断 T0 的中断服务程序**************************************************************/ void int0(void) interrupt 0 using 0 // 外中断 0 的中断编号为 0 {P1=~P1; // 每产生一次中断请求, P1 取反一次。
51单片机中断汇编
2.要读或写外部的RAM,当然也必须要知道RAM的地址,在后两条指令中,地址是被直接放在DPTR中的。而前两条指令,由于Ri(即R0或R1)只是8位的寄存器,所以只提供低8位地址。高8位地址由P2口来提供。 3.使用时应先将要读或写的地址送入DPTR或Ri中,然后再用读写命令。 例:将外部RAM中100H单元中的内容送入外部RAM中200H单元中。 MOV DPTR,#0100H MOVX A,@DPTR MOV DPTR,#0200H MOVX @DPTR,A
1.给出每条指令执行后的结果
MOV 23H,#30H MOV 12H,#34H MOV R0,#23H MOV R7,12H MOV R1,#12H MOV A,@R0 MOV 34H,@R1 MOV 45H,34H MOV DPTR,#6712H MOV 12H,DPH MOV R0,DPL MOV A,@R0
3.3.3 读程序存储器指令(2条)
MOVC A,@A+DPTR MOVC A,@A+PC 本组指令是将ROM中的数送入A中。本组指令也被称为查表指令,常用此指令来查一个已做好在ROM中的表格 说明:查找到的结果被放在A中,因此,本条指令执行前后,A 中的值不一定相同。 例:有一个数在R0中,要求用查表的方法确定它的平方值(此 数的取值范围是0-5) MOV DPTR,#100H MOV A,R0 MOVC A,@A+DPTR . … ORG 0100H DB 0,1,4,9,16,25
操作数存在程序存储器中
3.2.2 直接寻址 Direct Addressing 直接使用数所在单元的地址找到了操作数,所以称 这种方法为直接寻址。 操作数在SFR、内部RAM、位地址空间。 如: MOV A,00H MOV C,60H MOV A,0F0H
51单片机中断系统程序实例
51单片机中断系统程序实例(STC89C52RC)51单片机有了中断,在程序设计中就可以做到,在做某件事的过程中,停下来先去响应中断,做别的事情,做好别的事情再继续原来的事情。
中断优先级是可以给要做的事情排序。
单片机的学习不难,只要掌握学习方法,学起来并不难。
什么是好的学习方法呢,一定要掌握二个要点:1. 要知道寄存器的英文全拼,比如IE = interrupt中断不知道全拼,要去猜,去查。
这样就可以理解为什么是这个名称,理解了以后就不用记忆了。
2. 每个知识点要有形像的出处比如看到TF0,脑子里马上要形像地定位到TCON寄存器的某位看到ET0, 马上要形像地定位到IE寄存器的第2位/tuenhai/独家揭秘:形像是记忆的最大技巧。
当人眼看到某个图时,是把视觉信号转化成电信号,再转化成人能理解的形像。
当我们回忆形像时,就是在重新检索原先那个视觉信号,并放大。
在学习过程中,不断练习检索、放大信号,我们的学习能力就会越来越强。
写程序代码时,也要把尽量把每行代码形像化。
51单片机内中断源8051有五个中断源,有两个优先级。
与中断系统有关的特殊功能寄存器有IE(中断允许寄存器)、IP(中断优先级控制寄存器)、中断源控制寄存器(如TCON、SCON的有关位)。
51单片机的中断系统结构如下图(注意,IF0应为TF0):8052有6个中断源,它比8051多一个定时器/计数器T2中断源。
8051五个中断源分别是:(1)51单片机外部中断源8051有两个外部中断源,分别是INT0和INT1,分别从P3.2和P3.3两个引脚引入中断请求信号,两个中断源的中断触发允许由TCON的低4位控制,TCON的高4位控制运行和溢出标志。
INT0也就是Interrupt 0。
在这里应该看一下你的51单片机开发板的电路原理图。
离开形像的记忆是没有意义的。
读到上面这句,你应该回忆起原理图上的连接。
任何记忆都转化为形像,这是学习的根本原理,我们通过学习单片机要学会这种学习方法,会让你一辈子受益无穷。
51单片机中断系统详解
51单片机中断系统详解51 单片机中断系统详解(定时器、计数器)51 单片机中断级别中断源INT0---外部中断0/P3.2 T0---定时器/计数器0 中断/P3.4 INT1---外部中断1/P3.3 T1----定时器/计数器1 中断/P3.5 TX/RX---串行口中断T2---定时器/计数器 2 中断第5 最低4 5 默认中断级别最高第2 第3 第4 序号(C 语言用) 0 1 2 3 intrrupt 0中断允许寄存器IE位序号符号位EA/0 ------ET2/1 ES ET1 EX1 ET0 EX0 DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 EA---全局中允许位。
EA=1,打开全局中断控制,在此条件下,由各个中断控制位确定相应中断的打开或关闭。
EA=0,关闭全部中断。
-------,无效位。
ET2---定时器/计数器2 中断允许位。
ET2=1, 打开T2 中断。
ET2=0,关闭T2 中断。
关,。
ES---串行口中断允许位。
关,。
ES=1,打开串行口中断。
关,。
ES=0,关闭串行口中断。
关,。
ET1---定时器/计数器1 中断允许位。
关,。
ET1=1,打开T1 中断。
ET1=0,关闭T1 中断。
EX1---外部中断1 中断允许位。
EX1=1,打开外部中断1 中断。
EX1=0,关闭外部中断1 中断。
ET0---定时器/计数器0 中断允许位。
ET0=1,打开T0 中断。
EA 总中断开关,置1 为开;EX0 为外部中断0 (INT0) 开关,。
ET0 为定时器/计数器0(T0)开EX1 为外部中断1(INT1)开ET1 为定时器/计数器1(T1)开ES 为串行口(TX/RX)中断开ET2 为定时器/计数器2(T2)开ET0=0,关闭T0 中断。
EX0---外部中断0 中断允许位。
EX0=1,打开外部中断0 中断。
EX0=0,关闭外部中断0 中断。
中断优先级寄存器IP位序号位地址------PS/0 PT1/0 PX1/0 PT0/0 PX0/0 DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 -------,无效位。
C51单片机中断
T0
① EA —— CPU中断允许控制位 EA=1,CPU开中; EA=0,CPU关中,且屏蔽所有5个中断源。
② EX0 —— 外中断INT0中断允许控制位 EX0=1,INT0开中;EX0=0,INT0关中。
③ EX1 —— 外中断INT1中断允许控制位 EX1=1,INT1开中;EX1=0,INT1关中。
⑵ 对外中断电平触发方式,需要采取软硬结合的方法消除后 果。
⑶ 对串行口中断,用户应在串行中断服务程序中用软件清除 TI或RI。
六. 中断优先控制和中断嵌套
⒈ 中断优先控制
80C51中断优先控制首先根据中断优先级,此外还规定了 同一中断优先级之间的中断优先权。其从高到低的顺序为:
INT0、INT1、T0、T1、串行口。 中断优先级是可编程的,而中断优先权是固定的,不能设 置,仅用于同级中断源同时请求中断时的优先次序。 80C51中断优先控制的基本原则: ① 高优先级中断可以中断正在响应的低优先级中断,反之 则不能。 ② 同优先级中断不能互相中断。 ③ 同一中断优先级中,若有多个中断源同时请求中断,CPU 将先响应优先权高的中断,后响应优先权低的中断。
5.中断返回
执行中断返回指令RETI,从堆栈中弹出断点地 址到PC,继续执行被中断的程序。 6.中断优点
提高单片机CPU的工作效率。
二. 中断源和中断控制寄存器
⒈ 中断源
中断源是指能发出中断请求,引起中断的 装置或事件。
80C51单片机的中断源共有5个,其中2个 为外部中断源,3个为内部中断源:
⑴ INT0:外部中断0,中断请求信号由P3.2输入。 ⑵ INT1:外部中断1,中断请求信号由P3.3输入。 ⑶ T0:定时/计数器0溢出中断,对外部脉冲计数由P3.4输入。 ⑷ T1:定时/计数器1溢出中断,对外部脉冲计数由P3.5输入。 ⑸ 串行中断:包括串行接收中断RI和串行发送中断TI。
51单片机中断程序例子
51单片机中断程序例子1. 外部中断程序:外部中断是指由外部设备或外部信号触发的中断。
在51单片机中,通过设置中断允许位和中断优先级来实现对外部中断的响应。
例如,当外部设备发出一个信号时,单片机可以立即停止当前任务,转而执行外部中断程序。
外部中断程序的编写需要根据具体的外部设备和信号进行相应的处理,如读取设备状态、处理数据等。
通过外部中断程序,可以实现单片机与外部设备的互动和数据交换。
2. 定时器中断程序:定时器中断是指通过设置定时器的计数值和中断允许位,使得在指定的时间间隔内触发中断。
在51单片机中,可以通过定时器中断来实现定时任务的执行。
例如,可以设置一个定时器,在每隔一定的时间就触发中断,然后在中断程序中执行相应的任务,如数据采集、数据处理等。
通过定时器中断程序,可以实现定时任务的自动执行,提高系统的实时性和可靠性。
3.串口中断程序:串口中断是指通过串口通信接口接收或发送数据时触发的中断。
在51单片机中,可以通过设置串口中断允许位和中断优先级来实现对串口数据的中断处理。
例如,当接收到一个完整的数据包时,单片机可以立即停止当前任务,转而执行串口中断程序,对接收到的数据进行处理。
通过串口中断程序,可以实现单片机与外部设备的数据交换和通信。
4. ADC中断程序:ADC(模数转换器)中断是指在进行模数转换时触发的中断。
在51单片机中,可以通过设置ADC中断允许位和中断优先级来实现对模数转换结果的中断处理。
例如,当模数转换完成后,单片机可以立即停止当前任务,转而执行ADC中断程序,对转换结果进行处理和分析。
通过ADC中断程序,可以实现对模拟信号的采集和处理,用于实时监测和控制。
5. 外部中断优先级设置:在51单片机中,可以通过设置外部中断的中断优先级来确定中断的响应顺序。
中断优先级越高,优先级越高的中断会先被响应。
通过合理设置中断优先级,可以确保关键任务的及时响应和执行。
例如,当多个外部设备同时发出中断信号时,可以通过设置优先级,确保先响应优先级高的设备,保证系统的正常运行。
c51单片机定时器中断的执行过程
c51单片机定时器中断的执行过程
C51单片机定时器中断的执行过程可以分为以下几个步骤:
1. 初始化定时器:首先需要对定时器进行初始化,设置定时器的计数模式、计数值、溢出方式等参数。
这些参数可以通过编程实现,也可以通过硬件电路进行调整。
2. 启动定时器:初始化完成后,需要启动定时器。
启动定时器后,定时器开始按照预设的参数进行计数。
当计数值达到预设的溢出值时,定时器会产生一个溢出信号。
3. 设置中断服务程序:为了在定时器溢出时执行特定的操作,需要设置一个中断服务程序 ISR)。
中断服务程序是一段特殊的代码,它会在定时器溢出时被自动调用。
4. 开启中断:在中断服务程序设置完成后,需要开启相应的中断。
开启中断后,当定时器溢出时,CPU会自动跳转到中断服务程序执行。
5. 执行中断服务程序:当定时器溢出时,CPU会暂停当前任务,跳转到中断服务程序执行。
在中断服务程序中,可以执行一些特定的操作,如更新显示、读取传感器数据等。
6. 返回主程序:中断服务程序执行完成后,CPU会自动返回到主程序继续执行。
这样,通过定时器中断,可以实现对单片机的周期性控制和数据采集等功能。
51单片机INTO、INT1中断计数c语言源程序
单片机C语言程序设计:INT0 中断计数来源:21ic作者:关键字:INT0单片机C语言程序设计/* 名称:INT0 中断计数说明:每次按下计数键时触发INT0 中断,中断程序累加计数,计数值显示在 3 只数码管上,按下清零键时数码管清零*/#include<reg51.h>#define uchar unsigned char#define uint unsigned int//0~9 的段码uchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f ,0x6f,0x00};//计数值分解后各个待显示的数位uchar DSY_Buffer[]={0,0,0};uchar Count=0;sbit Clear_Key=P3^6;//数码管上显示计数值void Show_Count_ON_DSY(){DSY_Buffer[2]=Count/100; //获取3 个数DSY_Buffer[1]=Count%100/10;DSY_Buffer[0]=Count%10;if(DSY_Buffer[2]==0) //高位为0 时不显示{DSY_Buffer[2]=0x0a;if(DSY_Buffer[1]==0) //高位为0,若第二位为0 同样不显示DSY_Buffer[1]=0x0a;}P0=DSY_CODE[DSY_Buffer[0]];P1=DSY_CODE[DSY_Buffer[1]];P2=DSY_CODE[DSY_Buffer[2]];}//主程序void main(){P0=0x00;P1=0x00;P2=0x00;IE=0x81; //允许INT0 中断IT0=1; //下降沿触发while(1){if(Clear_Key==0) Count=0; //清0Show_Count_ON_DSY();}}//INT0 中断函数void EX_INT0() interrupt 0{Count++; 计数值递增}单片机C语言程序设计:INT0 及 INT1 中断计数来源:21ic作者:关键字:INT0INT1单片机C语言/* 名称:INT0 及INT1 中断计数说明:每次按下第 1 个计数键时,第 1 组计数值累加并显示在右边3 只数码管上,每次按下第 2 个计数键时,第2 组计数值累加并显示在左边3 只数码管上,后两个按键分别清零。
51单片机中断代码解释
51单片机中断代码解释一、引言51单片机是一种广泛使用的微控制器,具有丰富的中断功能。
中断是单片机在执行程序过程中,由于某种原因需要暂停当前的任务,转而处理更为紧急的事件。
处理完该事件后,再返回到之前被中断的程序继续执行。
本文将对51单片机的中断代码进行详细解释,包括中断概念、中断源、中断寄存器和寄存器功能与赋值说明等方面。
二、中断概念中断是一种计算机系统中处理优先级更高任务的方式。
当某个事件发生时,CPU会暂时停止当前任务的执行,转而处理该事件。
处理完该事件后,CPU会返回到之前被中断的程序继续执行。
三、中断源51单片机有多种中断源,包括外部中断0、外部中断1、定时器0、定时器1等。
每个中断源都可以独立地开启或关闭,并且可以设置优先级。
四、中断寄存器51单片机与中断相关的寄存器主要有:1.ICON(中断允许控制寄存器):用于控制中断的开启和关闭。
可以通过设置ICON寄存器的相关位来启用或禁用某个中断。
2.INT0/INT1(外部中断0/1控制寄存器):用于控制外部中断0和外部中断1的触发方式、触发边沿和触发方式等。
3.TMOD(定时器模式控制寄存器):用于设置定时器的模式和工作方式。
4.TH0/TH1(定时器0/1计数器高8位寄存器):用于存储定时器的计数值。
5.TL0/TL1(定时器0/1计数器低8位寄存器):用于存储定时器的计数值。
五、寄存器功能与赋值说明1.ICON寄存器:o EA:全局中断允许位,设置为1时允许所有中断,设置为0时禁止所有中断。
o ET0:定时器0中断允许位,设置为1时允许定时器0中断,设置为0时禁止定时器0中断。
o ET1:定时器1中断允许位,设置为1时允许定时器1中断,设置为0时禁止定时器1中断。
o EX0:外部中断0允许位,设置为1时允许外部中断0,设置为0时禁止外部中断0。
o EX1:外部中断1允许位,设置为1时允许外部中断1,设置为0时禁止外部中断1。
2.INT0/INT1寄存器:o IT0/IT1:外部中断0/1触发方式选择位,设置为0时选择下降沿触发,设置为1时选择低电平触发。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//实例42:用定时器T0查询方式P2口8位控制LED闪烁#include<reg51.h> // 包含51单片机寄存器定义的头文件/**************************************************************函数功能:主函数**************************************************************/void main(void){// EA=1; //开总中断// ET0=1; //定时器T0中断允许TMOD=0x01; //使用定时器T0的模式1TH0=(65536-46083)/256; //定时器T0的高8位赋初值TL0=(65536-46083)%256; //定时器T0的高8位赋初值TR0=1; //启动定时器T0TF0=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<reg51.h> // 包含51单片机寄存器定义的头文件sbit sound=P3^7; //将sound位定义为P3.7引脚/**************************************************************函数功能:主函数**************************************************************/void main(void){// EA=1; //开总中断// ET0=1; //定时器T0中断允许TMOD=0x10; //使用定时器T1的模式1TH1=(65536-921)/256; //定时器T1的高8位赋初值TL1=(65536-921)%256; //定时器T1的高8位赋初值TR1=1; //启动定时器T1TF1=0;while(1)//无限循环等待查询{while(TF1==0);TF1=0;sound=~sound; //将P3.7引脚输出电平取反TH1=(65536-921)/256; //定时器T0的高8位赋初值TL1=(65536-921)%256; //定时器T0的高8位赋初值}}//实例44:将计数器T0计数的结果送P1口8位LED显示#include<reg51.h> // 包含51单片机寄存器定义的头文件sbit S=P3^4; //将S位定义为P3.4引脚/**************************************************************函数功能:主函数**************************************************************/ void main(void){// EA=1; //开总中断// ET0=1; //定时器T0中断允许TMOD=0x02; //使用定时器T0的模式2TH0=256-156; //定时器T0的高8位赋初值TL0=256-156; //定时器T0的高8位赋初值TR0=1; //启动定时器T0while(1)//无限循环等待查询{while(TF0==0) //如果未计满就等待{if(S==0) //按键S按下接地,电平为0P1=TL0; //计数器TL0加1后送P1口显示}TF0=0; //计数器溢出后,将TF0清0}}//实例45:用定时器T0的中断控制1位LED闪烁#include<reg51.h> // 包含51单片机寄存器定义的头文件sbit D1=P2^0; //将D1位定义为P2.0引脚/**************************************************************函数功能:主函数**************************************************************/void main(void){EA=1; //开总中断ET0=1; //定时器T0中断允许TMOD=0x01; //使用定时器T0的模式2TH0=(65536-46083)/256; //定时器T0的高8位赋初值TL0=(65536-46083)%256; //定时器T0的高8位赋初值TR0=1; //启动定时器T0while(1)//无限循环等待中断;}/**************************************************************函数功能:定时器T0的中断服务程序**************************************************************/void Time0(void) interrupt 1 using 0 //“interrupt”声明函数为中断服务函数//其后的1为定时器T0的中断编号;0表示使用第0组工作寄存器{D1=~D1; //按位取反操作,将P2.0引脚输出电平取反TH0=(65536-46083)/256; //定时器T0的高8位重新赋初值TL0=(65536-46083)%256; //定时器T0的高8位重新赋初值}//实例46:用定时器T0的中断实现长时间定时#include<reg51.h> // 包含51单片机寄存器定义的头文件sbit D1=P2^0; //将D1位定义为P2.0引脚unsigned char Countor; //设置全局变量,储存定时器T0中断次数/**************************************************************函数功能:主函数**************************************************************/void main(void){EA=1; //开总中断ET0=1; //定时器T0中断允许TMOD=0x01; //使用定时器T0的模式2TH0=(65536-46083)/256; //定时器T0的高8位赋初值TL0=(65536-46083)%256; //定时器T0的高8位赋初值TR0=1; //启动定时器T0Countor=0; //从0开始累计中断次数while(1)//无限循环等待中断;}/**************************************************************函数功能:定时器T0的中断服务程序**************************************************************/void Time0(void) interrupt 1 using 0 //“interrupt”声明函数为中断服务函数//其后的1为定时器T0的中断编号;0表示使用第0组工作寄存器{Countor++; //中断次数自加1if(Countor==20) //若累计满20次,即计时满1s{D1=~D1; //按位取反操作,将P2.0引脚输出电平取反Countor=0; //将Countor清0,重新从0开始计数}TH0=(65536-46083)/256; //定时器T0的高8位重新赋初值TL0=(65536-46083)%256; //定时器T0的高8位重新赋初值}//实例47:用定时器T1中断控制两个LED以不同周期闪烁#include<reg51.h> // 包含51单片机寄存器定义的头文件sbit D1=P2^0; //将D1位定义为P2.0引脚sbit D2=P2^1; //将D2位定义为P2.1引脚unsigned char Countor1; //设置全局变量,储存定时器T1中断次数unsigned char Countor2; //设置全局变量,储存定时器T1中断次数/**************************************************************函数功能:主函数**************************************************************/void main(void){EA=1; //开总中断ET1=1; //定时器T1中断允许TMOD=0x10; //使用定时器T1的模式1TH1=(65536-46083)/256; //定时器T1的高8位赋初值TL1=(65536-46083)%256; //定时器T1的高8位赋初值TR1=1; //启动定时器T1Countor1=0; //从0开始累计中断次数Countor2=0; //从0开始累计中断次数while(1)//无限循环等待中断;}/**************************************************************函数功能:定时器T1的中断服务程序**************************************************************/void Time1(void) interrupt 3 using 0 //“interrupt”声明函数为中断服务函数//其后的3为定时器T1的中断编号;0表示使用第0组工作寄存器{Countor1++; //Countor1自加1Countor2++; //Countor2自加1if(Countor1==2) //若累计满2次,即计时满100ms{D1=~D1; //按位取反操作,将P2.0引脚输出电平取反Countor1=0; //将Countor1清0,重新从0开始计数}if(Countor2==8) //若累计满8次,即计时满400ms{D2=~D2; //按位取反操作,将P2.1引脚输出电平取反Countor2=0; //将Countor1清0,重新从0开始计数}TH1=(65536-46083)/256; //定时器T1的高8位重新赋初值TL1=(65536-46083)%256; //定时器T1的高8位重新赋初值}//实例50-1:输出50个矩形脉冲#include<reg51.h> //包含51单片机寄存器定义的头文件sbit u=P1^4; //将u位定义为P1.4/*************************************************函数功能:延时约30ms (3*100*100=30 000μs =30m*************************************************/void delay30ms(void)unsigned char m,n;for(m=0;m<100;m++)for(n=0;n<100;n++);}/*******************************************函数功能:主函数******************************************/void main(void){unsigned char i;u=1; //初始化输出高电平for(i=0;i<50;i++) //输出50个矩形脉冲{u=1;delay30ms();u=0;delay30ms();}while(1); //无限循环,防止程序“跑飞”}//实例50-2:计数器T0统计外部脉冲数#include<reg51.h> //包含51单片机寄存器定义的头文件/*******************************************函数功能:主函数******************************************/void main(void){TMOD=0x06; // TMOD=0000 0110B,使用计数器T0的模式2 EA=1; //开总中断ET0=0; //不使用定时器T0的中断TR0=1; //启动T0TH0=0; //计数器T0高8位赋初值TL0=0; //计数器T0低8位赋初值while(1) //无限循环,不停地将TL0计数结果送P1口P1=TL0;}//实例51-2:定时器T0的模式2测量正脉冲宽度#include<reg51.h> //包含51单片机寄存器定义的头文件sbit ui=P3^2; //将ui位定义为P3.0(INT0)引脚,表示输入电压/*******************************************函数功能:主函数******************************************/void main(void){TMOD=0x0a; // TMOD=0000 1010B,使用定时器T0的模式2,GATE置1 EA=1; //开总中断ET0=0; //不使用定时器T0的中断TR0=1; //启动T0TH0=0; //计数器T0高8位赋初值TL0=0; //计数器T0低8位赋初值while(1) //无限循环,不停地将TL0计数结果送P1口{while(ui==0) //INT0为低电平,T0不能启动;TL0=0; //INT0为高电平,启动T0计时,所以将TL0清0while(ui==1) //在INT0高电平期间,等待,计时;P1=TL0; //将计时结果送P1口显示}}//实例53:用外中断0的中断方式进行数据采集#include<reg51.h> //包含51单片机寄存器定义的头文件sbit S=P3^2; //将S位定义为P3.2,/*******************************************函数功能:主函数******************************************/void main(void){EA=1; //开放总中断EX0=1; //允许使用外中断IT0=1; //选择负跳变来触发外中断P1=0xff;while(1); //无限循环,防止程序跑飞}/**************************************************************函数功能:外中断T0的中断服务程序**************************************************************/ void int0(void) interrupt 0 using 0 //外中断0的中断编号为0{P1=~P1; //每产生一次中断请求,P1取反一次。