51单片机中断程序大全.docx

上传人:b****4 文档编号:5649350 上传时间:2023-05-08 格式:DOCX 页数:22 大小:18.20KB
下载 相关 举报
51单片机中断程序大全.docx_第1页
第1页 / 共22页
51单片机中断程序大全.docx_第2页
第2页 / 共22页
51单片机中断程序大全.docx_第3页
第3页 / 共22页
51单片机中断程序大全.docx_第4页
第4页 / 共22页
51单片机中断程序大全.docx_第5页
第5页 / 共22页
51单片机中断程序大全.docx_第6页
第6页 / 共22页
51单片机中断程序大全.docx_第7页
第7页 / 共22页
51单片机中断程序大全.docx_第8页
第8页 / 共22页
51单片机中断程序大全.docx_第9页
第9页 / 共22页
51单片机中断程序大全.docx_第10页
第10页 / 共22页
51单片机中断程序大全.docx_第11页
第11页 / 共22页
51单片机中断程序大全.docx_第12页
第12页 / 共22页
51单片机中断程序大全.docx_第13页
第13页 / 共22页
51单片机中断程序大全.docx_第14页
第14页 / 共22页
51单片机中断程序大全.docx_第15页
第15页 / 共22页
51单片机中断程序大全.docx_第16页
第16页 / 共22页
51单片机中断程序大全.docx_第17页
第17页 / 共22页
51单片机中断程序大全.docx_第18页
第18页 / 共22页
51单片机中断程序大全.docx_第19页
第19页 / 共22页
51单片机中断程序大全.docx_第20页
第20页 / 共22页
亲,该文档总共22页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

51单片机中断程序大全.docx

《51单片机中断程序大全.docx》由会员分享,可在线阅读,更多相关《51单片机中断程序大全.docx(22页珍藏版)》请在冰点文库上搜索。

51单片机中断程序大全.docx

51单片机中断程序大全

 

//实例42:

用定时器T0查询方式P2口8位控制LED闪烁

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

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

函数功能:

主函数

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

voidmain(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

 

音频

#includesbitsound=P3^7;

 

//将

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

sound位定义为P3.7引脚

/**************************************************************函数功能:

主函数

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

voidmain(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单片机寄存器定义的头文件sbitS=P3^4;//将S位定义为P3.4引脚/**************************************************************

函数功能:

主函数

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

voidmain(void)

{

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

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

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

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

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

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

while

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

{

 

2

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

{

if(S==0)//按键

S按下接地,电平为

0

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

}

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

 

}

}

 

//实例45:

用定时器T0的中断控制1位LED闪烁

#include//包含51单片机寄存器定义的头文件sbitD1=P2^0;//将D1位定义为P2.0引脚/**************************************************************

函数功能:

主函数

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

voidmain(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的中断服务程序

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

voidTime0(void)interrupt1using0//“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单片机寄存器定义的头文件

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

unsignedcharCountor;//设置全局变量,储存定时器

 

T0中断次数

/**************************************************************函数功能:

主函数

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

 

voidmain(void)

{

EA=1;//开总中断

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

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

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

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

TR0=1;

Countor=0;

//启动定时器T0

//从0开始累计中断次数

while

(1)//无限循环等待中断

;

}

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

函数功能:

定时器T0的中断服务程序

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

voidTime0(void)interrupt1using0//“interrupt”声明函数为中断服务函数

//其后的1为定时器T0的中断编号;0表示使用第0组工作

寄存器

{

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

if(Countor==20)

//若累计满

20次,即计时满

1s

{

D1=~D1;

Countor=0;

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

//将Countor清0,重新从0开始计数

}

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

}

 

//实例47:

用定时器T1中断控制两个LED以不同周期闪烁

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

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

sbitD2=P2^1;//将D2位定义为P2.1引脚

unsignedcharCountor1;//设置全局变量,储存定时器

unsignedcharCountor2;//设置全局变量,储存定时器

 

T1中断次数

T1中断次数

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

函数功能:

主函数

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

voidmain(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的中断服务程序

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

voidTime1(void)interrupt3using0//“interrupt”声明函数为中断服务函数

//其后的3为定时器T1的中断编号;0表示使用第0组工作

寄存器

{

Countor1++;//Countor1自加1

Countor2++;//Countor2自加1

if(Countor1==2)//若累计满2次,即计时满

{

 

100ms

D1=~D1;

Countor1=0;

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

//将Countor1清0,重新从0开始计数

}

if(Countor2==8)//若累计满8次,即计时满400ms

{

D2=~D2;

Countor2=0;

//按位取反操作,将P2.1引脚输出电平取反

//将Countor1清0,重新从0开始计数

}

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

}

 

//实例50-1:

输出50个矩形脉冲

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

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

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

函数功能:

延时约30ms(3*100*100=30000μs=30m

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

voiddelay30ms(void)

 

{

unsignedcharm,n;

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

for(n=0;n<100;n++)

;

}

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

函数功能:

主函数

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

voidmain(void)

{

unsignedchari;

u=1;//初始化输出高电平

for(i=0;i<50;i++)//输出50个矩形脉冲

{

u=1;

delay30ms();

u=0;

delay30ms();

}

while

(1)

;//无限循环,防止程序“跑飞”

}

 

//实例50-2:

计数器T0统计外部脉冲数

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

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

函数功能:

主函数

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

voidmain(void)

{

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

EA=1;

ET0=0;

TR0=1;

//开总中断

//不使用定时器

//启动T0

 

T0的中断

TH0=0;

TL0=0;

while

(1)

//计数器T0高8位赋初值

//计数器T0低8位赋初值

//无限循环,不停地将TL0计数结果送

 

P1口

P1=TL0;

}

 

//实例51-2:

定时器T0的模式2测量正脉冲宽度

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

sbitui=P3^2;//将ui位定义为P3.0(INT0)引脚,表示输入电压

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

函数功能:

主函数

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

voidmain(void)

{

TMOD=0x0a;

//TMOD=00001010B,使用定时器

T0的模式

2,GATE置1

EA=1;

ET0=0;

TR0=1;

TH0=0;

TL0=0;

while

(1)

//开总中断

//不使用定时器T0的中断

//启动T0

//计数器T0高8位赋初值

//计数器T0低8位赋初值

//无限循环,不停地将TL0计数结果送

 

P1口

{

while(ui==0)

//INT0

为低电平,

T0不能启动

;

TL0=0;//INT0为高电平,启动T0计时,所以将

while(ui==1)//在INT0高电平期间,等待,计时

TL0清

0

;

P1=TL0;

//将计时结果送

P1口显示

}

}

 

//实例53:

用外中断0的中断方式进行数据采集

#includesbitS=P3^2;

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

//将S位定义为P3.2,

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

函数功能:

主函数

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

voidmain(void)

{

EA=1;//开放总中断

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

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

 

P1=0xff;

while

(1)

;//无限循环,防止程序跑飞

}

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

函数功能:

外中断T0的中断服务程序

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

voidint0(void)interrupt0using0//外中断0的中断编号为0

{

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

 

}

 

//实例54-1:

输出负脉宽为200微秒的方波

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

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

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

函数功能:

主函数

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

voidmain(void)

{

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

EA=1;//开总中断

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

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

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

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

while

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

;

}

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

函数功能:

定时器T0的中断服务程序

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

voidTime0(void)interrupt1using0//"interrupt"声明函数为中断服务函数

{

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

 

}

 

//实例54-2:

测量负脉冲宽度

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

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

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

函数功能:

主函数

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

voidmain(void)

{

TMOD=0x02;//TMOD=00000010B,使用定时器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的中断服务程序

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

voidint0(void)interrupt0using0//外中断0的中断编号为0{

 

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

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

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

;

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

TR0=0;//关闭T0

}

 

//实例55:

方式0控制流水灯循环点亮

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

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

 

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

sbitP17=P1^7;

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

函数功能:

延时约150ms

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

voiddelay(void)

{

unsignedcharm,n;

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

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

;

}

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

函数功能:

发送一个字节的数据

**************************************************************/voidSend(unsignedchardat){

P17=0;

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

_nop_();

//延时一个机器周期

_nop_();

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

P17=1;

//结束对74LS164的清0

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

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

;

TI=0;

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

}

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

函数功能:

主函数

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

voidmain(void)

{

unsignedchari;

SCON=0x00;//SCON=0

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2