51单片机每个外部中断和定时器中断 应用模版

合集下载

有关51单片机中断的形式和C语言编程格式[精选5篇]

有关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码的字符形式。

51单片机培训—C语言版外部中断

51单片机培训—C语言版外部中断

完 处理 引 P3.2 中 脚的 , 断了 主 我回 了 程序
P3.2脚信号引 发的中断程序
取反P0.7
取反P0.7,改变P0.7引脚上接的LED小灯亮灭状 态,实现LED小灯闪烁
中断程序返回
执行RETI从P3.2引脚中断服务子程序中返回主程序
程序清单
• 汇编语言程序

ORG 0000H • SJMP START • ORG 0003H • AJMP INTERRUPT0 • ORG 0030H ;---------------------------初始化---------------------START:MOV SP, #60H • MOV P0, #0FFH • CLR IT0 • SETB EX0 • SETB EA ;---------------------------主程序---------------------MAIN:SJMP MAIN ;-------------------中断子程序-----------------------INTERRUPT0:CPL P0.7 • RETI • END
EA 空 ET2 ES ET1 EX1 ET0 EX0
使能外部中断0(P3.2)
使能外部中断1(P3.3)
中断总使能
• • •
例如:想使用中断0(P3.2引脚输入的中断信号) MOV IE , #10000001B 或SETB EX0 IE=0X81; EX0=1;

SETB EA
EA=1;
TMOD的设置
查询法程序清单
• • • • • • • • • • • • • • • •

#include<reg51.h> void main() { TMOD=0X1; TH0=0X4C; TL0=0X0; TR0=1; while(1) { if(TF0==1) { P0=~P0; TF0=0; } } }

51单片机中断程序例子

51单片机中断程序例子

51单片机中断程序例子
1. 外部中断:当外部信号引脚检测到高电平时,单片机会触发外部中断服务程序。

可以利用外部中断实现按键扫描功能,当按键按下时,触发中断程序对按键进行处理。

2. 定时器中断:利用定时器中断可以实现精确的时间控制。

例如,我们可以设置定时器中断为1秒,当定时器溢出时,触发中断程序,实现1秒钟执行一次的任务。

3. 串口中断:当接收到串口数据时,单片机会触发串口中断服务程序,可以利用串口中断实现串口通信功能。

4. ADC中断:当模数转换器完成一次转换时,单片机会触发ADC中断服务程序,可以利用ADC中断实现模拟信号的采集和处理。

5. 看门狗中断:看门狗定时器溢出时,单片机会触发看门狗中断服务程序,可以利用看门狗中断实现系统复位或其他相关功能。

6. 外部中断优先级:当多个外部中断同时触发时,可以通过设置外部中断的优先级来确定触发的顺序和优先级。

7. 定时器中断优先级:当多个定时器中断同时触发时,可以通过设置定时器中断的优先级来确定触发的顺序和优先级。

8. 中断嵌套:单片机支持中断嵌套,即在一个中断服务程序中触发
另一个中断服务程序,可以通过中断嵌套实现复杂的任务处理。

9. 中断屏蔽:单片机支持对中断的屏蔽,即可以通过设置中断屏蔽标志位来屏蔽某些中断,使其暂时不被触发。

10. 中断标志位:单片机提供中断标志位,用于标识中断是否被触发。

在中断服务程序中,可以通过读取和清除中断标志位来判断中断是否发生。

以上是根据51单片机中断程序的例子进行的描述,这些例子涵盖了常见的中断类型和相关功能。

通过学习和理解这些例子,可以更好地掌握51单片机中断编程的原理和方法。

51单片机外部中断的C51编程

51单片机外部中断的C51编程

51单片机外部中断的C51编程相关知识:1、51单片机的5大中断源:串行口中断、定时中断1、外部中断1、定时中断0、外部中断0;2、中断源的编号:串行口中断为4、定时中断1为3、外部中断1为2、定时中断0为1、外部中断0为0;3、中断源的优先级:按以上顺序排列,串行口中断最低、外部中断0最高;4、使用外部中断0和1,必须TCON寄存器设置其触发方式是低电平触发(0)还是下降沿触发(1);5、使用前必须通过IE寄存器打开总中断和自己的中断;//外部中断基本例程-1(未使用中断,键盘扫描为一般端口扫描)//这是特意安排的一个例程,以便和使用外部中断的例程2进行对比//用一个按键控制一个灯的亮灭,开始不亮,按一下则点亮,再按一下灭掉,再按又亮........#include <reg52.h>sbit k1=P3^2;sbit led=P2^7;void delay_ms(unsigned int xms); //ms级延时子程序void key_scan(); //声明键盘扫描子函数//=================================================void main(){led=1; //上电初始化,led灯不亮while(1){key_scan();delay_ms(3000);}}//=================================================void delay_ms(unsigned int xms) //ms级延时子程序{ unsigned int x,y;for(x=xms;x>0;x--)for(y=130;y>0;y--);}//-------------------------------------------------void key_scan() //键盘扫描子函数{ if(k1==0) //有键按下吗?(k1=0 ?){ delay_ms(10); //延时消抖if(k1==0) //确实是有键按下,则:{led=!led; //翻转灯的状态while(!k1);} //等待按键放开}}//-------------------------------------------------//外部中断基本例程-2 (单个键盘的外部中断0扫描处理)//用一个按键控制一个灯的亮灭//开始不亮,按一下则点亮,再按一下灭掉,再按又亮........#include <reg52.h>sbit k1=P3^2;sbit led=P2^7;void delay_ms(unsigned int xms); //ms级延时子程序void key_scan() interrupt 0 //使用了外部中断0的键盘扫描子函数。

51单片机外部中断与定时器的实用

51单片机外部中断与定时器的实用

中断使能寄存器通过设置中断使能寄存器 IE 的 EA 位 使能所有中断 每个中断源都有单独的使能位 可通过软件设置 IE 中相应的使能位在任何时候使能或禁能中断 中断使能寄存器 IE 的各 位如下所示中断使能寄存器IE位地址 0AFH 0AEH 0ADH 0ACH 0ABH 0AAH 0A9H 0A8H 位符号 EA/ ET2 ESET1 EX1 ET0 EX0EA 使能标志位 置位则所有中断使能 复位则禁止所有中断保留 ET2 定时器2 中断使能 ES 串行通信中断使能 ET1 定时器 1 中断使能 EX1 外部中断 1 使能 ET0 定时器0 中断使能 EX0 外部中断 0使能8051 支持两个中断优先级 有标准的中断机制, 低优先级的中断只能被高优先级的中断所中断 ,而高优先级的中断不能被中断。

中断优先级寄存器每个中断源都可通过设置中断优先级寄存器IP 来单独设置中断优先级 如果每个中断源的相应位被置位 则该中断源的优先级为高,如果相应的位被复位, 则该中断源的优先级为低, 如果你觉得两个中断源不够用 ,别急以后我会教你如何增加中断优先级 表 A-5 示出了 IP 寄存器的各位 此寄存器可位寻址 IP 寄存器位地址 0BFH 0BEH 0BDH 0BCH 0BBH 0BAH 0B9H 0B8H 位符号 /// PS PT1 PX1 PT0 PX0编号 中断源中断向量上电复位 0000H 0 外部中断0 0003H 1 定时器0溢出 000BH 2 外部中断1 0013H 3 定时器1溢出 001BH 4 串行口中断 0023H 5定时器2溢出 002BHPT2 定时器 2中断优先级 PS 串行通信中断优先级 PT1 定时器 1中断优先级 PX1 外部中断1 优先级 PT0 定时器0中断优先级 PX0 外部中断0 优先级定时器控制寄存器 TCONTF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 TF1 定时器1溢出中断标志响应中断后由处理器清零TR1 定时器1控制位置位时定时器 1 工作复位时定时器 1 停止工作TF0 定时器0溢出标志位定时器 0 溢出时置位处理器响应中断后清除该位TR0 定时器0控制位置位时定时器 0 工作复位时定时器 0 停止工作IE1 外部中断1 触发标志位当检测到 P3.3 有从高到低的跳变电平时置位处理器响应中断后由硬件清除该位IT1 中断1 触发方式控制位置位时为跳变触发复位时为低电平触发IE0 外部中断1 触发标志位当检测到 P3.3 有从高到低的跳变电平时置位处理器响应中断后由硬件清除该位IT0 中断1 触发方式控制位置位时为跳变触发复位时为低电平触发定时器控制寄存器 TMODGATE C/T M1 M0 GATE C/T M1 M0 定时器1 定时器0GATE 当 GATE置位时定时器仅当 TR=1并且 INT=1 时才工作如果 GATE=0 置位TR 定时器就开始工作C/T 定时器方式选择如果 C/T=1 定时器以计数方式工作 C/T=0 时以定时方式工作M1 模式选择位高位M0 模式选择位低位定时器:1、设置TMOD工作方式2、允许定时器中断设置IE(ET0/ET1)3、启动定时器设置TCON TR0/TR14、设置定时器初值 TH0、TL0EA=1;TR0=1;ET0=1;中断:1、设置中断使能寄存器 IE的EX02、设置TCON 中断方式上升沿是下降沿(IT0/IT1)EA=1;EX0=1;IT0=1;。

51单片机每个外部中断和定时器中断 应用模版

51单片机每个外部中断和定时器中断 应用模版

第一步,中断配置/************************************************************函数名:INT0_Config功能:配置单片机与中断相关的硬件,让单片机能够正常检测中断和执行中断代码。

输入参数:输出参数:************************************************************/void INT0_Config(void){IT0=1; //中断触发方式,IT0=0,低电平触发,INT0=1下降沿触发(下降沿就是由高电平向低电平的跳变);EX0=1; //外部中断0的中断开关,每个中断源都有自己的中断开关。

EA=1; //打开总中断,如果总中断不打开,就是其他中断开关被打开,单片机也不能执行中断。

}第二步,中断服务,也就是cpu被中断后所要做的事。

/************************************************************函数名:Isr_INT0功能:中断服务输入参数:输出参数:************************************************************/void Isr_INT0() interrupt 0 //interrupt表明该函数是中断函数,后面的标号表示是哪个中断源产生的中断。

{ //(INT0)为0, Timer0为1,INT1为2,Timer3,串口中断为4。

// Add your code here //自己想要中断后发生的程序}第三部主函数/************************************************************函数名:main功能:主函数输入参数:输出参数:************************************************************/void main(){INT0_Config();//调用这个函数来配置外部中断while(1){//Add your code here//CPU一直在这里循环的执行代码,一旦发生中断,就停下来去执行中断函数Isr_INT0() interrupt 0,//执行完成后,返回从断点处继续往下执行原来的代码。

51单片机定时器中断应用实例

51单片机定时器中断应用实例

51单⽚机定时器中断应⽤实例————————————————————————————————————————————定时器中断应⽤实例- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -设计要求:每秒点亮P1.0⼝的发光⼆极管⼀次,然后熄灭,使发光⼆极管形成闪烁效果实现思路:通过定时/计数器,每秒触发⼀次P1.0取反涉及到的功能模块:定时器,中断,LED操作定时器装填:需要计数每秒的话,计数921600时溢出即可,在四种⽅式定时⽅式中,最⼤的计数范围是⽅式2:65536,将921600分解成20份,每份计数46080时溢出,当溢出20次时灯闪烁,每次定时器溢出都要重新装填模块设计初始化LED(上拉输⼊模式)定时器(T0,⼯作⽅式1,装填初值,启动(在中断初始化后启动))中断(开放中断,开放T0中断)while(1)中断重置定时器(溢出位复位,重新装填计时)判断溢出次数(到达20次时LED改变状态,计数清零。

未到达20次时溢出次数加⼀)实现代码1 #include <reg52.h>2 #include <intrins.h>3 typedef unsigned char uchar;4 sbit LED = P1 ^ 0;5 uchar count = 0;6void Interrupt() interrupt 17 {8 TH0 = (65536 - 46080) / 256; //触发中断时重新装填计时9 TL0 = (65536 - 46080) % 256;10if (count == 20)11 {12 LED = ~LED;13 count = 0;14 }15else ++count;16 }17void main(void)18 {19 LED = 0xff; //初始化LED20 TMOD = 0x01; //初始化TMOD,定时器0,⽅式121 TH0 = (65536 - 46080) / 256; //装填计数22 TL0 = (65536 - 46080) % 256;23 EA = 1; //开放所有中断24 ET0 = 1; //开放定时器0中断控制位25 TR0 = 1; //定时器0开始计时26while(1)27 {28 _nop_();29 }30 }。

51单片机各中断初始化及子程序模板

51单片机各中断初始化及子程序模板

51单片机各中断初始化及子程序模板/************************************************************ *51单片机各中断初始化及子程序模板,几乎包括了传统51单片机的全部中断*1、外部中断0*2、定时器中断0*3、外部中断1*4、定时器中断1*5、串行中断*6、定时器中断2---本中断在52时才有*以上所有中断已经在Keil软件环境上经过测试,工作正常*在使用定时中断的时候需要根据实际需要重设定时器的初值和工作方式*在串行通讯中,使用11.0592M晶振,通讯波特率为9600bps*为了保证文件的单一和方便保存,本项目只用了一个文件,没有进行模块化处理,在实际应用中不建议这样做*本程序在UE11.00b下编辑,在KeilV3.23(C8.01)下编译调试*本程序仅供初学者参考使用,细节问题未涉及,在实际项目中请谨慎使用*Author:大灵通*昌宁科技,欢迎您提出宝贵意见!*2006-12-7 15:05,OK!*************************************************************/#include<reg52.h>//如果是使用51单片机,则应该是reg51.h,//且不能使用定时器2#include<intrins.h>//以下两个包含文件在本代码中实际不需要,#include<absacc.h>//但经常用到,所以列出#define uchar unsigned char#define uint unsigned int#define TimeDelay 2//程序所用变量声明bit Time0Int;bit Int0Flag,Int1Flag;uchar Time0Count,Time1Count,Time2Count;uchar ReceiveData;//程序所用函数声明void McuInitial(void);void InitialTime0(void);void InitialTime1(void);void InitialTime2(void);void IntialSerialComm(void);void SerialSend(uchar SendData);void delay(uint n);/************************************************************ *Function: 主函数*parameter:*Return:*Modify:*************************************************************/ void main(void){uchar i;McuInitial();delay(TimeDelay);while(1){if(Int0Flag==1)//各中断的具体处理{Int0Flag = 0;}if(Int1Flag==1){Int1Flag = 0;}if(Time0Count==5){Time0Count = 0;}if(Time1Count==5){Time1Count = 0;}if(Time2Count==5){Time2Count = 0;}SerialSend(i);i++;if(i>=0xff)i=0;}}/*************************************************************Function: 单片机初始化处理*parameter:*Return:*Modify:*************************************************************/ void McuInitial(void){//外部中断0初始化IT0 = 1;EX0 = 1;//外部中断1初始化IT1 = 1;EX1 = 1;InitialTime0();//定时器0初始化// InitialTime1();//定时器1初始化InitialTime2();//定时器2初始化IntialSerialComm();//串行中断初始化,占用定时器1,//如果用串行中断,定时器1不能用于定时EA = 1;//打开中断}/************************************************************ *Function: 定时器1初始化*parameter:*Return:*Modify:*************************************************************/ void InitialTime0 (void){TMOD |= 0x01;//16位定时器TH0 = 0x06;//8msTL0 = 0xed;ET0 = 1;//使能中断TR0 = 1;//打开定时器}/************************************************************ *Function: 定时器1初始化*parameter:*Return:*Modify:*************************************************************/void InitialTime1 (void){TMOD |= 0x10;//16位定时器TH1 = 0x06;//8msTL1 = 0xed;ET1 = 1;//使能中断TR1 = 1;//打开定时器}/************************************************************ *Function: 定时器2初始化,本中断仅在52时才有*parameter:*Return:*Modify:*************************************************************/ void InitialTime2 (void){T2CON=0x04;RCAP2H=0x04;RCAP2L=0x00;ET2 = 1;}/************************************************************ *Function: 串行中断初始化*parameter:*Return:*Modify:*************************************************************/ void IntialSerialComm(void){TMOD |= 0x20;SCON=0xf0;TH1=0xfd;//fdTL1=0xfd;//fdTR1=1;ES=1;}/************************************************************ *Function: 外部中断0中断服务子程序*parameter:*Return:*Modify:*************************************************************/ void Interrupt0 (void) interrupt 0Int0Flag = 1;}/************************************************************ *Function: 外部中断1中断服务子程序*parameter:*Return:*Modify:*************************************************************/ void Interrupt1 (void) interrupt 2{Int1Flag = 1;}/************************************************************ *Function: 定时器0中断服务子程序*parameter:*Return:*Modify:*************************************************************/ void InterruptTime0(void) interrupt 1{TH0 = 0x06;//8msTL0 = 0xed;Time0Count++;}/************************************************************ *Function: 定时器1中断服务子程序*parameter:*Return:*Modify:*************************************************************/ void InterruptTime1(void) interrupt 3{TH1 = 0x06;//8msTL1 = 0xed;Time1Count++;}/************************************************************ *Function: 定时器2中断服务子程序*parameter:*Return:*Modify:*************************************************************/ void InterruptTime2(void) interrupt 5TF2=0;Time2Count++;}/************************************************************ *Function: 串行接收中断服务子程序*parameter:*Return:*Modify:*************************************************************/ void InterruptSerialComm(void) interrupt 4{if(RI){RI = 0;ReceiveData = SBUF;}}/************************************************************ *Function: 串行发送程序*parameter:*Return:*Modify:*************************************************************/ void SerialSend(uchar SendData){SBUF = SendData;while(TI==0);TI = 0;}/************************************************************ *Function: 延时*parameter:*Return:*Modify:*************************************************************/ void delay(uint n){while(n!=0){n--;}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第一步,中断配置
/************************************************************
函数名:INT0_Config
功能:配置单片机与中断相关的硬件,让单片机能够正常检测中断和执行中断代码。

输入参数:
输出参数:
************************************************************/
void INT0_Config(void)
{
IT0=1; //中断触发方式,IT0=0,低电平触发,INT0=1下降沿触发(下降沿就是由高电平向低电平的跳变);
EX0=1; //外部中断0的中断开关,每个中断源都有自己的中断开关。

EA=1; //打开总中断,如果总中断不打开,就是其他中断开关被打开,单片机也不能执行中断。

}
第二步,中断服务,也就是cpu被中断后所要做的事。

/************************************************************
函数名:Isr_INT0
功能:中断服务
输入参数:
输出参数:
************************************************************/
void Isr_INT0() interrupt 0 //interrupt表明该函数是中断函数,后面的标号表示是哪个中断源产生的中断。

{ //(INT0)为0, Timer0为1,INT1为2,Timer3,串口中断为4。

// Add your code here //自己想要中断后发生的程序
}
第三部主函数
/************************************************************
函数名:main
功能:主函数
输入参数:
输出参数:
************************************************************/
void main()
{
INT0_Config();//调用这个函数来配置外部中断
while(1)
{
//Add your code here
//CPU一直在这里循环的执行代码,一旦发生中断,就停下来去执行中断函数Isr_INT0() interrupt 0,
//执行完成后,返回从断点处继续往下执行原来的代码。

}
}
外部中断INT0:
void INT0_Config(void)
{
EA=1; //开总中断
EX0=1; //开外部中断INT0
IT0=1; //1为下降沿触发,0为低电平触发}
Void Isr_INT0() interrupt 0
{
// Add your code here
}
Void main()
{
INT0_Config();
While(1)
{
/Add your code here
//CPU一直在这里循环的执行代码,
//一旦发生中断,就停下来去执行中断函数Isr_INT0() interrupt 0,
//执行完成后,返回从断点处继续往下执行原来的代码。

}
}
外部中断INT1:void INT1_Config(void)
{
EA=1; //开总中断
EX1=1; //开外部中断INT0
IT0=1; //1为下降沿触发,0为低电平触发}
Void Isr_INT1() interrupt 2
{
// Add your code here
}
Void main()
{
INT0_Config();
While(1)
{
/Add your code here
//CPU一直在这里循环的执行代码,
//一旦发生中断,就停下来去执行中断函数Isr_INT0() interrupt 0,
//执行完成后,返回从断点处继续往下执行原来的代码。

}
}。

相关文档
最新文档