搜档网
当前位置:搜档网 › 单片机中断程序大全

单片机中断程序大全

单片机中断程序大全
单片机中断程序大全

//实例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位赋初值

}

}

//实例44:将计数器T0计数的结果送P1口8位LED显示#include // 包含51单片机寄存器定义的头文件

sbit S=P3^4; //将S位定义为P3.4引脚

void main(void)

{

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

// ET0=1; //定时器T0中断允许

TMOD=0x02; //使用定时器T0的模式2

TH0=256-156; //定时器T0的高8位赋初值

TL0=256-156; //定时器T0的高8位赋初值

TR0=1; //启动定时器T0

while(1)//无限循环等待查询

{

while(TF0==0) //如果未计满就等待

{

if(S==0) //按键S按下接地,电平为0

P1=TL0; //计数器TL0加1后送P1口显示

}

TF0=0; //计数器溢出后,将TF0清0}}

//实例45:用定时器T0的中断控制1位LED闪烁

#include // 包含51单片机寄存器定义的头文件

sbit D1=P2^0; //将D1位定义为P2.0引脚

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; //启动定时器T0

while(1);}

函数功能:定时器T0的中断服务程序

**************************************************************/ void Time0(void) interrupt 1 using 0寄存器

{

D1=~D1; //按位取反操作,将P2.0引脚输出电平取反

TH0=(65536-46083)/256; //定时器T0的高8位重新赋初值

TL0=(65536-46083)%256; //定时器T0的高8位重新赋初值

}

//实例46:用定时器T0的中断实现长时间定时

#include // 包含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; //启动定时器T0

Countor=0; //从0开始累计中断次数

while(1);}

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

函数功能:定时器T0的中断服务程序

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

void Time0(void) interrupt 1 using 0

{

Countor++; //中断次数自加1

if(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 // 包含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的模式1

TH1=(65536-46083)/256; //定时器T1的高8位赋初值

TL1=(65536-46083)%256; //定时器T1的高8位赋初值

TR1=1; //启动定时器T1

Countor1=0; //从0开始累计中断次数

Countor2=0; //从0开始累计中断次数

while(1);

}

void Time1(void) interrupt 3 using 0

{

Countor1++; //Countor1自加1

Countor2++; //Countor2自加1

if(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 //包含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 //包含51单片机寄存器定义的头文件

void main(void)

{

TMOD=0x06; // TMOD=0000 0110B,使用计数器T0的模式2

EA=1; //开总中断

ET0=0; //不使用定时器T0的中断

TR0=1; //启动T0

TH0=0; //计数器T0高8位赋初值

TL0=0; //计数器T0低8位赋初值

while(1) //无限循环,不停地将TL0计数结果送P1口

P1=TL0; }

//实例51-2:定时器T0的模式2测量正脉冲宽度

#include //包含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; //启动T0

TH0=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高电平期间,等待,计时

P1=TL0; //将计时结果送P1口显示} }

//实例53:用外中断0的中断方式进行数据采集

#include //包含51单片机寄存器定义的头文件

sbit S=P3^2; //将S位定义为P3.2,

void main(void)

{EA=1; //开放总中断

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

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

P1=0xff;

while(1) ; }

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

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

//实例54-1:输出负脉宽为200微秒的方波

#include //包含51单片机寄存器定义的头文件

sbit u=P1^4; //将u位定义为P1.4

void main(void)

{

TMOD=0x02; //TMOD=0000 0010B,使用定时器T0的模式2 EA=1; //开总中断

ET0=1; //定时器T0中断允许

TH0=256-200; //定时器T0的高8位赋初值

TL0=256-200; //定时器T0的高8位赋初值

TR0=1; //启动定时器T0

while(1) : } //无限循环,等待中断

void Time0(void) interrupt 1 using 0 //"interrupt"声明函数为中断服务函数

{u=~u; //将P1.4引脚输出电平取反,产生方波

}

//实例54-2:测量负脉冲宽度

#include //包含51单片机寄存器定义的头文件

sbit u=P3^2; //将u位定义为P3.2

void main(void)

{

TMOD=0x02; //TMOD=0000 0010B,使用定时器T0的模式2

EA=1; //开放总中断

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

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

ET0=1; //允许定时器T0中断

TH0=0; //定时器T0赋初值0

TL0=0; //定时器T0赋初值0

TR0=0; //先关闭T0

while(1) ; //无限循环,不停检测输入负脉冲宽度

}

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

{ TR0=1; //外中断一到来,即启动T0计时

TL0=0; //从0开始计时

while(u==0) //低电平时,等待T0计时

;

P1=TL0; //将结果送P1口显示

TR0=0; //关闭T0

}

//实例55:方式0控制流水灯循环点亮

#include //包含51单片机寄存器定义的头文件

#include //包含函数_nop_()定义的头文件

unsigned char code Tab[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};//流水灯控制码,该数组被定义为全局变量

sbit P17=P1^7;

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

函数功能:延时约150ms

**************************************************************/ void delay(void)

{

unsigned char m,n;

for(m=0;m<200;m++)

for(n=0;n<250;n++); }

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

函数功能:发送一个字节的数据

**************************************************************/ void Send(unsigned char dat)

{

P17=0; //P1.7引脚输出清0信号,对74LS164清0

_nop_(); //延时一个机器周期

_nop_(); //延时一个机器周期,保证清0完成

P17=1; //结束对74LS164的清0

SBUF=dat; //将数据写入发送缓冲器,启动发送

while(TI==0) //若没有发送完毕,等待

;

TI=0; //发送完毕,TI被置“1”,需将其清0

}

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

函数功能:主函数

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

void main(void)

{

unsigned char i;

SCON=0x00; //SCON=0000 0000B,使串行口工作于方式0

while(1)

{

for(i=0;i<8;i++)

{

Send(Tab[i]); //发送数据

delay(); //延时

}

}}

AVR单片机教程13—第十三课 ATMEAG16L的外部中断编程实践

—————————————————————————— 第十三课ATMEAG16L的外部中断编程实践 本教程节选自周兴华老师《手把手教你学AVR单片机C程序设计》教程,如需转载,请注明出处!读者可通过当当网、淘宝网等网站购买本教程,如需购买配书 实验器材,可登陆周兴华单片机培训中心网购部自助购买! Atmega16L具有多达20个中断源,这里我们进行外部中断的实验,其它的等到介绍到相关内容时可进行适当的实验。 1.外部中断0 外部中断0由引脚INT0(PIND2)触发。如果INT0引脚按照MCUCR寄存器中的ISC01、ISC00设置的方式发生跳变,则不管是否lNT0中断使能,INT0中断标志位INTF0都将置位。如果SREG 寄存 器的全局中断位I和通用中断控制寄存器GICR中的INT0中断使能位INT0置位,则单片机培训开始 执行中断程序。在进入中断服务程序时,INTF0被硬件清零。必须指出,不管INT0(PIND2)引脚 方向位设置如何,只要INT0引脚发生规定的跳变,都会触发中断。中断标志位INTF0只在满足发生 中断的条件时置位,一旦条件变化,INTF0被硬件清零。向INTF0位写“1”也会对其清零。 2.外部中断1 外部中断0由引脚INT1(PIND3)触发。如果INT1引脚按照MCUCR寄存器中的ISC11、ISC10设置的方式发生跳变,则不管是否lNT1中断使能,INT1中断标志位INTF1都将置位。如果SREG 寄存 器的全局中断位I和通用中断控制寄存器GICR中的INT1中断使能位INT1置位,则开始执行中断程 序。在进入中断服务程序时,INTF1被硬件清零。必须指出,不管INT1(PIND3)引脚方向位设置 如何,只要INT1引脚发生规定的跳变,FPGA培训都会触发中断。中断标志位INTF1只在满足发生 中断的条件时置位,一旦条件变化,INTF1被硬件清零。向INTF1位写“1”也会对其清零。 3.外部中断2 外部中断2由引脚INT2(PINB2)触发。如果INT2引脚按照MCUCR寄存器中的ISC2设置的方式发生跳变,则不管是否lNT2中断使能,INT2中断标志位INTF2都将置位。如果SREG 寄存器的全局 中断位I和通用中断控制寄存器GICR中的INT2中断使能位INT2置位,则开始执行中断程序。在进 入中断服务程序时,INTF2被硬件清零。必须指出,不管INT2(PINB2)引脚方向位设置如何,只 要INT2引脚发生规定的跳变,都会触发中断。中断标志位INTF2只在满足发生中断的条件时置位, 一旦条件变化,INTF2被硬件清零。向INTF1位写“1”也会对其清零。 8.2.1 INT1中断实验

51单片机中断程序大全

//实例42 :用定时器T0 查询方式 P2 口8 位控制LED 闪烁 //#include单片机寄存器定义的头文件 51包含 /******************************************************* *******函数功能:主函数 ******************************************************** ******/void main(void){ // EA=1;开总中断// 中断允许T0 // 定时器// ET0=1; 1的模式TMOD=0x01;// 使用定时器T0 位赋初值定时器T0 的高8 TH0=(65536-46083)/256; // 位赋初值的高8 TL0=(65536-46083)%6; // 定时器T0 T0启动定时器TR0=1;// TF0=0;P2=0xff; 无限循环等待查询while(1)// {while(TF0==0); TF0=0;P2=~P2; 位赋初值的高8 定时器TH0=(65536-46083)/256; // T0 位赋初值T0 TL0=(65536-46083)%6; //

定时器的高8 }} 1KHzT1:用定时器43 实例// 音频查询方式控制单片机发出 #include 单片机寄存器定义的头文件51 // 包含sbit sound=P3^7;将// 引脚sound P3.7 位定义为 /********************************************************** **** 函数功能:主函数 ******************************************************** ******/void main(void){// EA=1;开总中断// 中断允许ET0=1;// // 定时器T0 1的模式使用定时器// T1 TMOD=0x10; 位赋初值// TH1=(65536-921)/256; T1 定时器的高8 TL1=(65536-921)%6; // 定时器T1 的高8 位赋初值 TR1=1;// 启动定时器T1TF1=0; while(1)// 无限循环等待查询{while(TF1==0); TF1=0;

单片机中断程序大全

单片机中断程序大全公司内部编号:(GOOD-TMMT-MMUT-UUPTY-UUYY-DTTI-

//实例42:用定时器T0查询方式P2口8位控制L E D闪烁#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位赋初值 } } //实例44:将计数器T0计数的结果送P1口8位LED显示 #include // 包含51单片机寄存器定义的头文件sbit S=P3^4; //将S位定义为P3.4引脚

51单片机独立按键程序查询法和外部中断两种

//以下程序都是在VC++6.0 上调试运行过的程序,没有错误,没有警告。 //单片机是STC89C52RC,但是在所有的51 52单片机上都是通用的。51只是一个学习的基础平台,你懂得。 //程序在关键的位置添加了注释。 //用//11111111111111111代表第一个程序。//2222222222222222222222222代表第二个程序,以此类推 //1111111111111111111111111111111111111111111111111111111111111111111 //1111111111111111111111111111111111111111111111111111111111111111111 /****************************************************************************** * * 实验名: 左右流水灯实验 * 使用的IO : LED使用P2,键盘使用P3.1 * 实验效果: 按下K1键, * 注意: ******************************************************************************* / #include #include #define GPIO_LED P2 sbit K1=P3^1; void Delay10ms( ); //延时10ms /****************************************************************************** * * 函数名: main * 函数功能: 主函数 * 输入: 无 * 输出: 无 ******************************************************************************* / void main(void) { unsigned int i,j; j=0xfe; //1111_1110 while(1) { GPIO_LED=j; if(K1==0) //检测按键K1是否按下 { Delay10ms(); //消除抖动 if(K1==0) {

ATMega16单片机外部中断的使用

ATMega16单片机外部中断的使用[日期:2010-09-24 ] [来源:本站原创作者:佚名] [字体:大中小] (投递新闻) // Crystal: 7.3728Mhz ,功能:学习外部中断0的程序 #include #include #define LED_COM PORTA ^= (1 << PA6) // void port_init(void) { PORTA = 0x40; DDRA = 0x40; PORTB = 0x00; DDRB = 0x00; PORTC = 0x00; //m103 output only DDRC = 0x00; PORTD = 0x04; DDRD = 0x00; } #pragma interrupt_handler int0_isr:2 void int0_isr(void)

LED_COM; } //call this routine to initialize all peripherals void init_devices(void) { //stop errant interrupts until set up CLI(); //disable all interrupts port_init(); MCUCR = 0x00; GICR = 0x40; TIMSK = 0x00; //timer interrupt sources SEI(); //re-enable interrupts //all peripherals are now initialized } void main() { init_devices(); while(1)

51单片机中断程序大全

//实例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位赋初值

单片机外部中断线的作用

单片机外部中断线的作用 这张图是一条外部中断线或外部事件线的示意图,图中信号线上划有一条斜线,旁边标志19字样的注释,表示这样的线路共有19套。图中的蓝色虚线箭头,标出了外部中断信号的传输路径。 首先外部信号从编号1的芯片管脚进入,经过编号2的边沿检测电路,通过编号3的或门进入中断挂起请求寄存器,最后经过编号4的与门输出到NVIC中断检测电路,这个边沿检测电路受上升沿或下降沿选择寄存器控制,用户可以使用这两个寄存器控制需要哪一个边沿产生中断,因为选择上升沿或下降沿是分别受2个平行的寄存器控制,所以用户可以同时选择上升沿或下降沿,而如果只有一个寄存器控制,那么只能选择一个边沿了。 接下来是编号3的或门,这个或门的另一个输入是软件中断/事件寄存器,从这里可以看出,软件可以优先于外部信号请求一个中断或事件,即当软件中断/事件寄存器的对应位为“1”时,不管外部信号如何,编号3的或门都会输出有效信号。 一个中断或事件请求信号经过编号3的或门后,进入挂起请求寄存器,到此之前,中断和事件的信号传输通路都是一致的,也就是说,挂起请求寄存器中记录了外部信号的电平变化。 外部请求信号最后经过编号4的与门,向NVIC中断控制器发出一个中断请求,如果中断屏蔽寄存器的对应位为“0”,则该请求信号不能传输到与门的另一端,实现了中断的屏蔽。明白了外部中断的请求机制,就很容易理解事件的请求机制了。图中红色虚线箭头,标出了外部事件信号的传输路径,外部请求信号经过编号3的或门后,进入编号5的与门,这个与门的作用与编号4的与门类似,用于引入事件屏蔽寄存器的控制;最后脉冲发生器的一个跳变的信号转变为一个单脉冲,输出到芯片中的其它功能模块。从这张图上我们也可以知道,从外部激励信号来看,中断和事件的产生源都可以是一样的。之所以分成2个部分,由于中断是需要CPU参与的,需要软件的中断服务函数才能完成中断后产生的结果;但是事件,是靠脉冲发生器产生一个脉冲,进而由硬件自动完成这个事件产生的结果,当然相应的联动部件需要先设置好,比如引起DMA操作,AD转换等;

51单片机定时中断C语言的写法步骤

51单片机定时中断C语言的写法步骤 程序说明:51单片机定时器0工作于方式一,定时50ms中断一次 晶振为12M #include void main { TOMD = 0X01;//配置定时器0工作于方式一 TH1 = (65536-50000)/256; //高八位装入初值 TL1 = (65536-50000)%256; //低八位装入初值 ET0 = 1; //开定时器0中断 EA = 1; //开总中断 TR0 = 1; //启动定时器0 while(1) { ; } } void Timer0_int() interrupt 1 { //重新装初值 TH1 = (65536-50000)/256; //高八位装入初值 TL1 = (65536-50000)%256; //低八位装入初值 } /****************************************************************************** *********************************/ 上面是比较好理解的。如果实在要求简洁的话,看下面的,跟上面功能一样 #include void main { TOMD = 0X01;//配置定时器0工作于方式一 TH1 = 0x3c; //高八位装入初值 TL1 = 0xb0; //低八位装入初值 IE = 0x82;//开总中断并开定时器0中断 TR0 = 1; //启动定时器0 while(1) { ; } }

void Timer0_int() interrupt 1 { //重新装初值 TH1 = 0x3c; //高八位装入初值TL1 = 0xb0; //低八位装入初值}

单片机外部中断实验(附C语言程序)

单片机外部中断实验(附c程序) 一、实验目的 掌握外部中断的C语言和汇编语言编程方法,会用外部中断解决实际应用问题。 。 二、实验内容 8051C51单片机P2.0接一个发光二极管LED1、P2.1接一个发光二极管LED2,P3.2接一个开关、P3.3接一个开关要求实现以下功能: (1)合上、P3.3断开时LED1闪烁 (2)P3.2断开、P3.3合上时LED2闪烁 (3)P3.2合上后(不断开)再合上P3.3,LED1闪烁LED2不闪烁 (4)P3.3合上后(不断开)再合上P3.2,LED2不闪烁LED1闪烁 试编写C语言和汇编语言程序 使用自然优先级就可以 也可 XO 高级X1低级PX0=1 PX1=0 四、实验电路 五、参考程序(自己完成) C程序: Include Sbit P2_0=P2^0; Sbit P2_1=P2^1; Sbit P3_2=P3^2; Sbit P3_3=P3^3; void delay02s(void) //延时0.2秒子程序 { unsigned char i,j,k; for(i=20;i>0;i--) for(j=20;j>0;j--) for(k=248;k>0;k--); }

Void main { EA=1; EX0=1; EX1=1; ITO=1; IT1=1; PX0=1; PX1=0; While(1); } Void int0(void) interrupt 0 { if(!P3_2) { While(1) { P2_0=1; delay02s(); P2_0=0; delay02s(); } } } Void int1(void) interrupt 2 { if(!P3_3) { While(1) { P2_1=1; delay02s(); P2_1=0; delay02s(); } } }

最新单片机课程设计 外部中断控制流水灯变化

单片机课程设计报告 设计题目:外部中断控制流水灯变化 姓名

一.设计目的 通过学习单片机工作原理和各种工作方式及各管脚的功能,想通过P3口的俩管脚P3.2和P3.3第二功能,即外部中断来使CPU响应,达到控制流水灯的目的。 二.设计要求 主程序实现8个灯从P2.0到P2.7依次亮灭,灯与灯 之间间歇约0.5秒.当P3.3口是低电平时,灯从P2.7到P2.0依次亮灭,灯与灯之之间间歇约0.5秒.循环3次返回主程序.当P3.2口是低电平时,灯全灭,当P3.2口是高电平时,返回主程序.当同时使P3.2和P3.3为低电平时,灯全灭,因为外部中断0的优先级高于外部中断1的优先级. 三.MCS-51的硬件结构: 四.P3口的状态 P3口是双功能口,默认为第一功能(通用I/O口),通过编程可设置第二功能。

五.中断传送方式: 中断方式则是在外设为数据传送做好准备之后,就向CPU发出中断请求信号(相当于通知CPU)。CPU接收到中断请求信号之后立即作 出响应,暂停正在执行的原程序(主程序),而转去外设的数据输入输 出服务,待服务完之后,程序返回。CPU再继续执行被中断的原程序。六.外部中断 外部中断是指从单片机外部引脚输入请求信号。输入/输出的中断请求、实时事件的中断请求、掉电和设备故障的中断请求都可以作为 外部中断源,从引脚INT0、INT1输入。 外部中断请求、有两种触发方式:电平触发及跳变(边沿)触发。 这两种触发方式可以通过对特殊功能寄存器TCON编程来选择。七.电路原理逻辑图如下:

P3.3 P3.2 灯亮情况 0 0 全灭 0 1 全灭 1 0 从P2.0到P2.7依次亮灭 1 1 从P2.7到P2.0依次亮灭八.实验硬件电路图如下

51单片机中断程序大全

//实例42 :用定时器TO查询方式P2 口8位控制LED闪烁#include // 包含 51 单片机寄存器定义的头文件/************************************************************** 函数功能:主函数 void main(void) { // EA=1; // 开总中断 // ETO=1; // 定时器 TO 中断允许 TMOD=OxO1; // 使用定时器 TO 的模式 1 THO=(65536-46O83)/256; // 定时器 TO 的高 8 位赋初值 TLO=(65536-46O83)%256; // 定时器 TO 的高 8 位赋初值 TRO=1; // 启动定时器 TO TFO=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 // 包含 51 单片机寄存器定义的头文件 sbit sou nd=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)// 无限循环等待查询 {

单片机外部中断的使用

哈尔滨理工大学荣成学院 单片机原理及应用Protues 仿真实验 班级: 学号: 姓名: 日期:

实验三单片机外部中断的使用 一、实验名称:单片机外部中断的使用 二、实验目的 1.掌握在Keil环境下建立项目、添加、保存源文件文件、编译源程序的方法; 2.掌握运行、步进、步越、运行到光标处等几种调试程序的方法; 3.掌握在Proteus环境下建立文件原理图的方法; 4..实现Proteus与Keil联调软件仿真。 三、使用仪器设备编号、部件及备件 1.实验室电脑; 2.单片机实验箱。 四、实验过程及数据、现象记录 在Proteus 环境下建立如下仿真原理图,并保存为文件;

原理图中常用库元件的名称: 无极性电容:CAP 极性电容:CAP-ELEC 单片机:AT89C51 晶体振荡器:CRYSTAL 电阻:RES 按键:BUTTON 发光二极管:红色LED-RED 绿色LED-GREEN 蓝色LED-BLUE 黄色LED-YELLOW 在Keil环境下建立源程序并保存为.ASM文件,生成.HEX文件;汇编语言参考程序如下:ORG 0000H

LJMP MAIN ORG H ;外部中断0程序入口地址LJMP EXINT0 ORG 0030H MAIN: MOV SP,#60H ;堆栈指针初始化 SETB ;设置外部中断 0 为边沿触发 SETB ;开外部中断0 SETB ;开CPU总中断MOV A,#01H LOOP: MOV P1,A RL A CALL DELAY SJMP LOOP DELAY: MOV R1,# ;延时250ms子程序DL1: MOV R2,# DL2: MOV R3,# DJNZ R3,$ DJNZ R2,DL2 DJNZ R1,DL1 ;延时子程序返回EXINT0: PUSH PUSH CLR RS1 SETB RS0 MOV R0,# LP: MOV P1,#0FFH CALL DELAY MOV P1,#00H CALL DELAY DJNZ R0,LP POP PSW POP ACC ;中断返回END 将以上程序补充完整,流水时间间隔,闪烁时间间隔为250ms。C51语言参考程序: #include #include #define uchar unsigned char #define uint unsigned int void delay_ms(uint x) { uint i; uchar j; for(i=0;i

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

中断使能寄存器 通过设置中断使能寄存器 IE 的 EA 位 使能所有中断 每个中断源都有单独的使能位 可通过软件设置 IE 中相应的使能位在任何时候使能或禁能中断 中断使能寄存器 IE 的各 位如下所示 中断使能寄存器IE 位地址 0AFH 0AEH 0ADH 0ACH 0ABH 0AAH 0A9H 0A8H 位符号 EA / ET2 ES ET1 EX1 ET0 EX0 EA 使能标志位 置位则所有中断使能 复位则禁止所有中断保留 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溢出 002BH PT2 定时器 2中断优先级 PS 串行通信中断优先级 PT1 定时器 1中断优先级 PX1 外部中断1 优先级 PT0 定时器0中断优先级 PX0 外部中断0 优先级

51单片机中断程序大全

( //实例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位定义为引脚 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;

单片机外部中断详解

单片机外部中断详解 Document serial number【UU89WT-UU98YT-UU8CB-UUUT-UUT108】

一.外部中断相关寄存器 1.定时器/计数器控制寄存器控制寄存器(TCON)? ? IT0:外部中断0触发方式控制位? 当IT0=0时,为电平触发方式(低电平有效)? 当IT0=1时,为边沿触发方式(下降沿有效)? IT1:外部中断1触发方式控制位? 当IT1=0时,为电平触发方式(低电平有效)? 当IT1=1时,为边沿触发方式(下降沿有效) 2.中断允许控制寄存器(IE)? ?

EX0:外部中断0允许位;? EX1:外部中断1允许位;? EA :CPU中断允许(总允许)位。 二.外部中断的处理过程 1、设置中断触发方式,即IT0=1或0,IT1=1或0? 2、开对应的外部中断,即EX0=1或EX1=1;? 3、开总中断,即EA=1;? 4、等待外部设备产生中断请求,即通过P3.2,P.3.3口连接外部设备产生中断? 5、中断响应,执行中断服务函数 三.程序编写 要求:通过两位按键连接外部中断0和1,设定外部中断0为下降沿触发方式,外部中断1为低电平触发方式,按键产生中断使数字加减,用一位共阳极数码管来显示数值。? 目的:感受外部中断对程序的影响,体会低电平触发和下降沿触发的区别。

#include#define uint unsigned int #define uchar unsign ed char uchar code dat[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0x f8,0x80,0x90};uint num; void main() { EA=1; //开总中断 IT0=1; //下降沿触发 IT1=0; //低电平触发 EX0=1; //外部中断0允许 EX1=1; //外部中断1允许 while(1) { P0=dat[num%10]; } } void plus() interrupt 0???? //外部中断0 {

51单片机中断系统编程

51单片机中断系统编程 51单片机中断系统编程 上传的图片 抱歉,您所在的组无权下载附件,请注册或登陆中断是指如下过程(如下图所示):CPU 与外设同时工作,CPU执行主程序,外设做准备工作。当外设准备好时向CPU发中断请求信 号,若条件满足,则CPU终止主程序的执行,转去执行中断服务程序。在中断服务程序中 CPU与外设交换信息,待中断服务程序执行完后,CPU再返回刚才终止的主程序继续执行。 5.3.1 中断系统 MCS-51单片机提供了5个固定的可屏蔽中断源,3个在片内,2个在片外,它们在程序存储 器中各有固定的中断入口地址,由此进入中断服务程序。5个中断源的符号、名称及产生 的条件如下。 ? INT0:外部中断0,由P3.2端口线引入,低电平或下跳沿引起。 ? INT1:外部中断1,由P3.3端口线引入,低电平或下跳沿引起。 ? T0:定时器/计数器0中断,由T0计数溢出引起。 ? T1:定时器/计数器l中断,由T1计数溢出引起。 ? TI/RI:串行I/O中断,串行端口完成一帧字符发送/接收后引起。 中断源有两级中断优先级,可形成中断嵌套。两个特殊功能寄存器用于中断控制和条件设 置。整个中断系统的结构框图如图所示。 上传的图片 抱歉,您所在的组无权下载附件,请注册或登陆 中断系统结构框图 2 中断系统的控制寄存器 中断系统有两个控制寄存器(IE和IP),它们分别用来设定各个中断源的打开/关闭和中

断优先级。此外,在TCON中另有4位用于选择引起外部中断的条件并作为标志位。 (1)中断允许寄存器IE IE在特殊功能寄存器中,字节地址为A8H,位地址(由低位到高位)分别是A8H-AFH。IE 用 来打开或关断各中断源的中断请求,基本格式如下: 上传的图片 抱歉,您所在的组无权下载附件,请注册或登陆 ? EA:全局中断允许位。EA=0,禁止一切中断;EA=1,打开全局中断控制,此时,由各 个中断控制位确定相应中断的打开或关闭。 ? ×:无效位。 ? ES:串行I/O中断允许位。ES=1,允许串行I/O中断;ES=0,禁止串行I/O中断。 ? ETl;定时器/计数器T1中断允许位。ETl=1,允许T1中断;ETl=0,禁止T1中断。 ? EXl:外部中断l中断允许位。EXl=1,允许外部中断1中断;EXl=0,禁止外部中断1中 断。 ? ET0:定时器/计数器T0中断允许位。ET0=1,允许T0中断;ET0=0,禁止TO中断。 ? EX0:外部中断0中断允许位。EX0=1,允许外部中断0中断;EX0=0,禁止外部中断0中 断。 (2)中断优先级寄存器IP IP在特殊功能寄存器中,字节地址为B8H,位地址(由低位到高位)分别是B8H一BFH。 MCS-51单片机的中断分为两个优先级,IP用来设定各个中断源属于两级中断中的哪一级, 其基本格式如下: 上传的图片

51单片机外部中断实验

实验6 外部中断实验 (仿真部分) 一、实验目的 1. 学习外部中断技术的基本使用方法。 2. 学习中断处理程序的编程方法。 二、实验内容 在INT0和INT1上分别接了两个可回复式按钮,其中INT0上的按钮每按下一次则计数加一,其中INT1上的按钮每按下一次则计数减一。P1.0~ P1.3接LED灯,以显示计数信号。 三、实验说明 编写中断处理程序需要注意的问题是: 1.保护进入中断时的状态,并在退出中断之前恢复进入时的状态。 2.必须在中断处理程序中设定是否允许中断重入,即设置EX0位。 3.INT0和INT1分别接单次脉冲发生器。P1.0~ P1.3接LED灯,以查看计数信号. 四、硬件设计 利用以下元件:AT89C51、BOTTON、CAP、CAP-POL、CRYSTAL、RES、NOT、LED-Yellow。设计出如下的硬件电路。晶振频率为12MHz。 五、参考程序框图 设置P1.0~ 3初始状态

主程序框图 INT0中断处理程序框图 实验6 外部中断实验 (实验箱部分) 1.实验目的 认识中断的基本概念 学会外部中断的基本用法 学会asm和C51的中断编程方法 2.实验原理 图按键中断 【硬件接法】 控制LED,低电平点亮 INT1接按键,按下时产生低电平 【运行效果】 程序工作于中断方式,按下按键K2后,LED点亮,秒后自动熄灭。

8051单片机有/INT0和/INT1两条外部中断请求输入线,用于输入两个外部中断源的中断请求信号,并允许外部中断源以低电平或下降沿触发方式来输入中断请求信号。/INT0和/INT1中断的入口地址分别是0003H和0013H。 TCON寄存器(SFR地址:88H)中的IT0和IT1位分别决定/INT0和/INT1的触发方式,置位时为下降沿触发,清零时为低电平触发。实际应用时,如果外部的中断请求信号在产生后能够在较短时间内自动撤销,则可以选择低电平触发。在中断服务程序里要等待其变高后才能返回主程序,否则会再次触发中断,产生不必要的麻烦。 如果外部的中断请求信号产生后可能长时间后才能撤销,则为了避免在中断服务程序里长时间无谓等待,可以选择下降沿触发。下降沿触发是“一次性”的,每次中断只会有1个下降沿,因此中断处理程序执行完后可以立即返回主程序,而不必等待中断请求信号恢复为高电平,这是一个重要的技巧。 3. 实验步骤 参考实验例程,自己动手建立Keil C51工程。注意选择CPU类型。Philips半导体的P89V51RB2。 编辑源程序,编译生成HEX文件。 ISP下载开关扳到“00”,用Flash Magic软件下载程序HEX文件到MCU BANK1,运行。 运行Flash Magic软件。各步骤操作如下: Step 1: COM Port:选择实际使用的串行口,通常为COM1; Baud Rate:波特率不可设置得过高,推荐用9600; Device:请选择正确的型号89V51RB2; Interface:选择None(ISP)。 Step 2:请勾中“Erase blocks used by Hex File”。 Step 3:装入你的程序文件,注意必须为HEX格式。 Step 4: 请勾中“Verify after programming”(编程后校验); 对其它几项如果不了解,请不要勾中。 Step 5: 请先给电路板上电,同时按住复位键不松手,然后点击Flash Magic软件的“Start”按

单片机外部中断实验(附C语言程序)复习进程

单片机外部中断实验(附C语言程序)

单片机外部中断实验(附c程序) 一、实验目的 掌握外部中断的C语言和汇编语言编程方法,会用外部中断解决实际应用问题。 。 二、实验内容 8051C51单片机P2.0接一个发光二极管LED1、P2.1接一个发光二极管LED2,P3.2接一个开关、P3.3接一个开关要求实现以下功能:(1)合上、P3.3断开时LED1闪烁 (2)P3.2断开、P3.3合上时LED2闪烁 (3)P3.2合上后(不断开)再合上P3.3,LED1闪烁LED2不闪烁 (4)P3.3合上后(不断开)再合上P3.2,LED2不闪烁LED1闪烁 试编写C语言和汇编语言程序 使用自然优先级就可以 也可 XO 高级X1低级PX0=1 PX1=0 四、实验电路 五、参考程序(自己完成)

C程序: Include Sbit P2_0=P2^0; Sbit P2_1=P2^1; Sbit P3_2=P3^2; Sbit P3_3=P3^3; void delay02s(void) //延时0.2秒子程序{ unsigned char i,j,k; for(i=20;i>0;i--) for(j=20;j>0;j--) for(k=248;k>0;k--); } Void main { EA=1; EX0=1; EX1=1 ; ITO=1 ; IT1=1 ; PX0=1; PX1=0; While(1) ; } Void int0(void) interrupt 0 { if(!P3_2) { While(1) { P2_0=1; delay02s(); P2_0=0; delay02s(); } } } Void int1(void) interrupt 2 { if(!P3_3) {

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

51单片机中断系统程序实例(STC89C52RC) 51单片机有了中断,在程序设计中就可以做到,在做某件事的过程中,停下来先去响应中断,做别的事情,做好别的事情再继续原来的事情。中断优先级是可以给要做的事情排序。 单片机的学习不难,只要掌握学习方法,学起来并不难。什么是好的学习方法呢,一定要掌握二个要点: 1. 要知道寄存器的英文全拼,比如IE = interrupt中断 不知道全拼,要去猜,去查。这样就可以理解为什么是这个名称,理解了以后就不用记忆了。 2. 每个知识点要有形像的出处 比如看到TF0,脑子里马上要形像地定位到TCON寄存器的某位 看到ET0, 马上要形像地定位到IE寄存器的第2位 https://www.sodocs.net/doc/8715448275.html,/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单片机开发板的电路原理图。离开形像的记忆是没有意义的。读到上面这句,你应该回忆起原理图上的连接。任何记忆都转化为形像,这是学习的根本原理,我们通过学习单片机要学会这种学习方法,会让你一辈子受益无穷。 TCON的结构如下图: (a)定时器T0的运行控制位TR0

相关主题