51单片机中断程序大全教学内容.docx
《51单片机中断程序大全教学内容.docx》由会员分享,可在线阅读,更多相关《51单片机中断程序大全教学内容.docx(11页珍藏版)》请在冰豆网上搜索。
51单片机中断程序大全教学内容
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音频
#include//包含51单片机寄存器定义的头文件
sbitsound=P3^7;//将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的模式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单片机寄存器定义的头文件
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寄存器
{
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;//启动定时器T0
Countor=0;//从0开始累计中断次数
while
(1);}
/**************************************************************
函数功能:
定时器T0的中断服务程序
**************************************************************/
voidTime0(void)interrupt1using0
{
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单片机寄存器定义的头文件
sbitD1=P2^0;//将D1位定义为P2.0引脚
sbitD2=P2^1;//将D2位定义为P2.1引脚
unsignedcharCountor1;//设置全局变量,储存定时器T1中断次数
unsignedcharCountor2;//设置全局变量,储存定时器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);
}
voidTime1(void)interrupt3using0
{
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单片机寄存器定义的头文件
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;//不使用定时器T0的中断
TR0=1;//启动T0
TH0=0;//计数器T0高8位赋初值
TL0=0;//计数器T0低8位赋初值
while
(1)//无限循环,不停地将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;//不使用定时器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单片机寄存器定义的头文件
sbitS=P3^2;//将S位定义为P3.2,
voidmain(void)
{EA=1;//开放总中断
EX0=1;//允许使用外中断
IT0=1;//选择负跳变来触发外中断
P1=0xff;
while
(1);}
voidint0(void)interrupt0using