当前位置首页 > 建筑/施工 > 施工组织
搜柄,搜必应! 快速导航 | 使用教程  [会员中心]

中断、定时器实例

文档格式:DOC| 40 页|大小 73.50KB|积分 10|2022-11-17 发布|文档ID:169716759
第1页
下载文档到电脑,查找使用更方便 还剩页未读,继续阅读>>
1 / 40
此文档下载收益归作者所有 下载文档
  • 版权提示
  • 文本预览
  • 常见问题
  • 实例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 //“interrupt”声明函数为中断服务函数 //其后的1为定时器T0的中断编号;0表示使用第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 //“interrupt”声明函数为中断服务函数 //其后的1为定时器T0的中断编号;0表示使用第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)//无限循环等待中断 ; }/**********************************************************函数功能:定时器T1的中断服务程序**********************************************************/void Time1(void) interrupt 3 using 0 //“interrupt”声明函数为中断服务函数 //其后的3为定时器T1的中断编号;0表示使用第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位重新赋初值 }实例48:用计数器T1的中断控制蜂鸣器发出1KHz音频#include // 包含51单片机寄存器定义的头文件sbit sound=P3^7; //将sound位定义为P3.7引脚/**********************************************************函数功能:主函数**********************************************************/void main(void){ EA=1; //开总中断 ET1=1; //定时器T1中断允许 TMOD=0x10; //TMOD=0001 000B,使用定时器T1的模式1 TH1=(65536-921)/256; //定时器T1的高8位赋初值 TL1=(65536-921)%256; //定时器T1的高8位赋初值 TR1=1; //启动定时器T1 while(1)//无限循环等待中断 ; }/**********************************************************函数功能:定时器T1的中断服务程序**********************************************************/void Time1(void) interrupt 3 using 0 //“interrupt”声明函数为中断服务函数 { sound=~sound; TH1=(65536-921)/256; //定时器T1的高8位重新赋初值 TL1=(65536-921)%256; //定时器T1的高8位重新赋初值 }实例49:用定时器T0的中断实现"渴望"主题曲的播放#include //包含51单片机寄存器定义的头文件sbit sound=P3^7; //将sound位定义为P3.7unsigned int C; //储存定时器的定时常数//以下是C调低音的音频宏定义#define l_dao 262 //将“l_dao”宏定义为低音“1”的频率262Hz#define l_re 286 //将“l_re”宏定义为低音“2”的频率286Hz#define l_mi 311 //将“l_mi”宏定义为低音“3”的频率311Hz#define l_fa 349 //将“l_fa”宏定义为低音“4”的频率349Hz#define l_sao 392 //将“l_sao”宏定义为低音“5”的频率392Hz#define l_la 440 //将“l_a”宏定义为低音“6”的频率440Hz#define l_xi 494 //将“l_xi”宏定义为低音“7”的频率494Hz//以下是C调中音的音频宏定义#define dao 523 //将“dao”宏定义为中音“1”的频率523Hz#define re 587 //将“re”宏定义为中音“2”的频率587Hz#define mi 659 //将“mi”宏定义为中音“3”的频率659Hz#define fa 698 //将“fa”宏定义为中音“4”的频率698Hz#define sao 784 //将“sao”宏定义为中音“5”的频率784Hz#define la 880 //将“la”宏定义为中音“6”的频率880Hz#define xi 987 //将“xi”宏定义为中音“7”的频率523H //以下是C调高音的音频宏定义#define h_dao 1046 //将“h_dao”宏定义为高音“1”的频率1046Hz#define h_re 1174 //将“h_re”宏定义为高音“2”的频率1174Hz#define h_mi 1318 //将“h_mi”宏定义为高音“3”的频率1318Hz#define h_fa 1396 //将“h_fa”宏定义为高音“4”的频率1396Hz#define h_sao 1567 //将“h_sao”宏定义为高音“5”的频率1567Hz#define h_la 1760 //将“h_la”宏定义为高音“6”的频率1760Hz#define h_xi 1975 //将“h_xi”宏定义为高音“7”的频率1975Hz/*******************************************函数功能:1个延时单位,延时200ms******************************************/void delay() { unsigned char i,j; for(i=0;i<250;i++) for(j=0;j<250;j++) ; }/*******************************************函数功能:主函数******************************************/ void main(void) { unsigned char i,j; //以下是《渴望》片头曲的一段简谱 unsigned int code f[]={re,mi,re,dao,l_la,dao,l_la, //每行对应一小节音符 l_sao,l_mi,l_sao,l_la,dao, l_la,dao,sao,la,mi,sao, re, mi,re,mi,sao,mi, l_sao,l_mi,l_sao,l_la,dao, l_la,l_la,dao,l_la,l_sao,l_re,l_mi, l_sao, re,re,sao,la,sao, fa,mi,sao,mi, la,sao,mi,re,mi,l_la,dao, re, mi,re,mi,sao,mi, l_sao,l_mi,l_sao,l_la,dao, l_la,dao,re,l_la,dao,re,mi, re, l_la,dao,re,l_la,dao,re,mi, re, 0xff}; //以0xff作为音符的结束标志//以下是简谱中每个音符的节拍//"4"对应4个延时单位,"2"对应2个延时单位,"1"对应1个延时单位 unsigned char code JP[ ]={4,1,1,4,1,1,2, 2,2,2,2,8, 4,2,3,1,2,2, 10, 4,2,2,4,4, 2,2,2,2,4, 2,2,2,2,2,2,2, 10, 4,4,4,2,2, 4,2,4,4, 4,2,2,2,2,2,2, 10, 4,2,2,4,4, 2,2,2,2,6, 4,2,2,4,1,1,4, 10, 4,2,2,4,1,1,4, 10 }; EA=1; //开总中断 ET0=1; //定时器T0中断允许 TMOD=0x00; // 使用定时器T0的模式1(13位计数器) while(1) //无限循环 { i=0; //从第1个音符f[0]开始播放 while(f[i]!=0xff) //只要没有读到结束标志就继续播放 { C=/f[i]; TH0=(8192-C)/32; //可证明这是13位计数器TH0高8位的赋初值方法 TL0=(8192-C)%32; //可证明这是13位计数器TL0低5位的赋初值方法 TR0=1; //启动定时器T0 for(j=0;j //包含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口显示 } } 实例52:用定时器T0控制输出高低宽度不同的矩形波#include //包含51单片机寄存器定义的头文件sbit u=P3^0; //将u位定义为P3.0,从该引脚输出矩形脉冲unsigned char Countor; //设置全局变量,储存负跳变累计数/*************************************************函数功能:延时约30ms (3*100*100=30 000μs =30ms)*************************************************/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; EA=1; //开放总中断 EX0=1; //允许使用外中断 IT0=1; //选择负跳变来触发外中断 Countor=0; for(i=0;i<100;i++) //输出100个负跳变 { u=1; delay30ms(); u=0; delay30ms(); } while(1) ; //无限循环, 防止程序跑飞 }/**************************************************************函数功能:外中断T0的中断服务程序**************************************************************/void int0(void) interrupt 0 using 0 //外中断0的中断编号为0{ Countor++; P1=Countor; } 实例53:用外中断0的中断方式进行数据采集#include //包含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取反一次。

    } 实例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) //无限循环,等待中断 ; }/**************************************************************函数功能:定时器T0的中断服务程序**************************************************************/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) ; //无限循环, 不停检测输入负脉冲宽度 }/**************************************************************函数功能:外中断0的中断服务程序**************************************************************/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(); //延时 } } } 实例56-1:数据发送程序#include //包含单片机寄存器的头文件unsigned char code Tab[ ]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};//流水灯控制码,该数组被定义为全局变量/*****************************************************函数功能:向PC发送一个字节数据***************************************************/void Send(unsigned char dat){ SBUF=dat; while(TI==0) ; TI=0;}/**************************************************************函数功能:延时约150ms**************************************************************/ void delay(void) { unsigned char m,n; for(m=0;m<200;m++) for(n=0;n<250;n++) ; }/*****************************************************函数功能:主函数***************************************************/void main(void){ unsigned char i; TMOD=0x20; //TMOD=0010 0000B,定时器T1工作于方式2 SCON=0x40; //SCON=0100 0000B,串口工作方式1 PCON=0x00; //PCON=0000 0000B,波特率9600 TH1=0xfd; //根据规定给定时器T1赋初值 TL1=0xfd; //根据规定给定时器T1赋初值 TR1=1; //启动定时器T1 while(1) { for(i=0;i<8;i++) //模拟检测数据 { Send(Tab[i]); //发送数据i delay(); //50ms发送一次检测数据 } }}实例56-2:数据接收程序#include //包含单片机寄存器的头文件/*****************************************************函数功能:接收一个字节数据***************************************************/ unsigned char Receive(void){ unsigned char dat; while(RI==0) //只要接收中断标志位RI没有被置“1” ; //等待,直至接收完毕(RI=1) RI=0; //为了接收下一帧数据,需将RI清0 dat=SBUF; //将接收缓冲器中的数据存于dat return dat;}/*****************************************************函数功能:主函数***************************************************/void main(void){ TMOD=0x20; //定时器T1工作于方式2 SCON=0x50; //SCON=0101 0000B,串口工作方式1,允许接收(REN=1) PCON=0x00; //PCON=0000 0000B,波特率9600 TH1=0xfd; //根据规定给定时器T1赋初值 TL1=0xfd; //根据规定给定时器T1赋初值 TR1=1; //启动定时器T1 REN=1; //允许接收 while(1) { P1=Receive(); //将接收到的数据送P1口显示 }}实例57-1:数据发送程序#include //包含单片机寄存器的头文件sbit p=PSW^0;unsigned char code Tab[ ]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};//流水灯控制码,该数组被定义为全局变量/*****************************************************函数功能:向PC发送一个字节数据***************************************************/void Send(unsigned char dat){ ACC=dat; TB8=p; SBUF=dat; while(TI==0) ; TI=0;}/**************************************************************函数功能:延时约150ms**************************************************************/ void delay(void) { unsigned char m,n; for(m=0;m<200;m++) for(n=0;n<250;n++) ; }/*****************************************************函数功能:主函数***************************************************/void main(void){ unsigned char i; TMOD=0x20; //TMOD=0010 0000B,定时器T1工作于方式2 SCON=0xc0; //SCON=1100 0000B,串口工作方式3, //SM2置0,不使用多机通信,TB8置0 PCON=0x00; //PCON=0000 0000B,波特率9600 TH1=0xfd; //根据规定给定时器T1赋初值 TL1=0xfd; //根据规定给定时器T1赋初值 TR1=1; //启动定时器T1 while(1) { for(i=0;i<8;i++) //模拟检测数据 { Send(Tab[i]); //发送数据i delay(); //50ms发送一次检测数据 } }} 实例57-2:数据接收程序#include //包含单片机寄存器的头文件sbit p=PSW^0;/*****************************************************函数功能:接收一个字节数据***************************************************/ unsigned char Receive(void){ unsigned char dat; while(RI==0) //只要接收中断标志位RI没有被置"1" ; //等待,直至接收完毕(RI=1) RI=0; //为了接收下一帧数据,需将RI清0 ACC=SBUF; //将接收缓冲器中的数据存于dat if(RB8==p) { dat=ACC; return dat; }}/*****************************************************函数功能:主函数***************************************************/void main(void){ TMOD=0x20; //定时器T1。

    点击阅读更多内容
    卖家[上传人]:痛苦女王
    资质:实名认证