51单片机中断程序大全39290.pdf
.1/实例 42:用定时器 T0 查询方式 P2 口 8 位控制 LED 闪烁*include /包含 51 单片机存放器定义的头文件 void main(void)/EA=1;/开总中断/ET0=1;/定时器 T0 中断允许 TMOD=0*01;/使用定时器 T0 的模式 1 TH0=(65536-46083)/256;/定时器 T0 的高 8 位赋初值 TL0=(65536-46083)%256;/定时器 T0 的高 8 位赋初值 TR0=1;/启动定时器 T0 TF0=0;P2=0*ff;while(1)/无限循环等待查询 while(TF0=0);TF0=0;P2=P2;TH0=(65536-46083)/256;/定时器 T0 的高 8 位赋初值 TL0=(65536-46083)%256;/定时器 T0 的高 8 位赋初值/实例 43:用定时器 T1 查询方式控制单片机发出 1KHz 音频.1*include /包含 51 单片机存放器定义的头文件 sbit sound=P37;/将 sound 位定义为 P3.7 引脚 void main(void)/EA=1;/开总中断/ET0=1;/定时器 T0 中断允许 TMOD=0*10;/使用定时器 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=P34;/将 S 位定义为 P3.4 引脚.1 void main(void)/EA=1;/开总中断/ET0=1;/定时器 T0 中断允许 TMOD=0*02;/使用定时器 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=P20;/将 D1 位定义为 P2.0 引脚 void main(void)EA=1;/开总中断.1 ET0=1;/定时器 T0 中断允许 TMOD=0*01;/使用定时器 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=P20;/将 D1 位定义为 P2.0 引脚 unsigned char Countor;/设置全局变量,储存定时器 T0 中断次数 void main(void)EA=1;/开总中断 ET0=1;/定时器 T0 中断允许.1 TMOD=0*01;/使用定时器 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=P20;/将 D1 位定义为 P2.0 引脚.1 sbit D2=P21;/将 D2 位定义为 P2.1 引脚 unsigned char Countor1;/设置全局变量,储存定时器 T1 中断次数 unsigned char Countor2;/设置全局变量,储存定时器 T1 中断次数 void main(void)EA=1;/开总中断 ET1=1;/定时器 T1 中断允许 TMOD=0*10;/使用定时器 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 引脚输出电平取反.1 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=P14;/将 u 位定义为 P1.4/*函数功能:延时约 30ms(3*100*100=30 000s=30m*/void delay30ms(void)unsigned char m,n;for(m=0;m100;m+)for(n=0;n100;n+);void main(void).1 unsigned char i;u=1;/初始化输出高电平 for(i=0;i50;i+)/输出 50 个矩形脉冲 u=1;delay30ms();u=0;delay30ms();while(1):/实例 50-2:计数器 T0 统计外部脉冲数*include /包含 51 单片机存放器定义的头文件 void main(void)TMOD=0*06;/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 单片机存放器定义的头文件.1 sbit ui=P32;/将 ui 位定义为 P3.0INT0引脚,表示输入电压 void main(void)TMOD=0*0a;/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=P32;/将 S 位定义为 P3.2,void main(void)EA=1;/开放总中断.1 E*0=1;/允许使用外中断 IT0=1;/选择负跳变来触发外中断 P1=0*ff;while(1);void int0(void)interrupt 0 using 0/外中断 0 的中断编号为 0 P1=P1;/每产生一次中断请求,P1 取反一次。/实例 54-1:输出负脉宽为 200 微秒的方波*include /包含 51 单片机存放器定义的头文件 sbit u=P14;/将 u 位定义为 P1.4 void main(void)TMOD=0*02;/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 引脚输出电平取反,产生方波.1 /实例 54-2:测量负脉冲宽度*include /包含 51 单片机存放器定义的头文件 sbit u=P32;/将 u 位定义为 P3.2 void main(void)TMOD=0*02;/TMOD=0000 0010B,使用定时器 T0 的模式 2 EA=1;/开放总中断 E*0=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 口显示.1 TR0=0;/关闭 T0 /实例 55:方式 0 控制流水灯循环点亮*include /包含 51 单片机存放器定义的头文件*include/包含函数_nop_定义的头文件 unsigned char code Tab=0*FE,0*FD,0*FB,0*F7,0*EF,0*DF,0*BF,0*7F;/流水灯控制码,该数组被定义为全局变量 sbit P17=P17;/*函数功能:延时约 150ms*/void delay(void)unsigned char m,n;for(m=0;m200;m+)for(n=0;n250;n+);/*函数功能:发送一个字节的数据*/void Send(unsigned char dat).1 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=0*00;/SCON=0000 0000B,使串行口工作于方式 0 while(1)for(i=0;i8;i+)Send(Tabi);/发送数据 delay();/延时.1