收藏 分销(赏)

51单片机中断程序大全教学内容.doc

上传人:人****来 文档编号:3869398 上传时间:2024-07-22 格式:DOC 页数:9 大小:36.04KB 下载积分:6 金币
下载 相关 举报
51单片机中断程序大全教学内容.doc_第1页
第1页 / 共9页
51单片机中断程序大全教学内容.doc_第2页
第2页 / 共9页


点击查看更多>>
资源描述
51单片机中断程序大全 精品文档 //实例42:用定时器T0查询方式P2口8位控制LED闪烁 #include<reg51.h> // 包含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<reg51.h> // 包含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<reg51.h> // 包含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<reg51.h> // 包含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<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; //启动定时器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<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的模式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<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; //启动T0 TH0=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; //启动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<reg51.h> //包含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<reg51.h> //包含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<reg51.h> //包含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<reg51.h> //包含51单片机寄存器定义的头文件 #include<intrins.h> //包含函数_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(); //延时 } }} 收集于网络,如有侵权请联系管理员删除
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 教育专区 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服