51单片机中断程序大全Word文件下载.docx
《51单片机中断程序大全Word文件下载.docx》由会员分享,可在线阅读,更多相关《51单片机中断程序大全Word文件下载.docx(22页珍藏版)》请在冰点文库上搜索。
while
(1)//无限循环等待查询
while(TF0==0)
;
P2=~P2;
}
//实例
43:
用定时器
T1
查询方式控制单片机发出
1KHz
音频
sbitsound=P3^7;
//将
//包含51单片机寄存器定义的头文件
sound位定义为P3.7引脚
/**************************************************************函数功能:
TMOD=0x10;
//使用定时器T1的模式1
TH1=(65536-921)/256;
//定时器T1的高8位赋初值
TL1=(65536-921)%256;
TR1=1;
//启动定时器T1
TF1=0;
while(TF1==0)
sound=~sound;
//将P3.7引脚输出电平取反TH1=(65536-921)/256;
//定时器T0的高8位赋初值TL1=(65536-921)%256;
//实例44:
将计数器T0计数的结果送P1口8位LED显示
//包含51单片机寄存器定义的头文件sbitS=P3^4;
//将S位定义为P3.4引脚/**************************************************************
TMOD=0x02;
//使用定时器T0的模式
TH0=256-156;
TL0=256-156;
2
while(TF0==0)//如果未计满就等待
if(S==0)//按键
S按下接地,电平为
P1=TL0;
//计数器TL0加1后送P1口显示
//计数器溢出后,将TF0清0
//实例45:
用定时器T0的中断控制1位LED闪烁
//包含51单片机寄存器定义的头文件sbitD1=P2^0;
//将D1位定义为P2.0引脚/**************************************************************
EA=1;
ET0=1;
//使用定时器T0的模式2
//定时器T0的高8位赋初值
while
(1)//无限循环等待中断
定时器T0的中断服务程序
voidTime0(void)interrupt1using0//“interrupt”声明函数为中断服务函数
//其后的1为定时器T0的中断编号;
0表示使用第0组工作
寄存器
D1=~D1;
//按位取反操作,将P2.0引脚输出电平取反
//定时器T0的高8位重新赋初值
//实例46:
用定时器T0的中断实现长时间定时
sbitD1=P2^0;
//将D1位定义为P2.0引脚
unsignedcharCountor;
//设置全局变量,储存定时器
T0中断次数
Countor=0;
//启动定时器T0
//从0开始累计中断次数
Countor++;
//中断次数自加1
if(Countor==20)
//若累计满
20次,即计时满
1s
//按位取反操作,将P2.0引脚输出电平取反
//将Countor清0,重新从0开始计数
//定时器T0的高8位重新赋初值TL0=(65536-46083)%256;
//实例47:
用定时器T1中断控制两个LED以不同周期闪烁
sbitD2=P2^1;
//将D2位定义为P2.1引脚
unsignedcharCountor1;
unsignedcharCountor2;
T1中断次数
ET1=1;
//定时器T1中断允许
TH1=(65536-46083)/256;
//定时器T1的高8位赋初值
TL1=(65536-46083)%256;
Countor1=0;
//从0开始累计中断次数
Countor2=0;
定时器T1的中断服务程序
voidTime1(void)interrupt3using0//“interrupt”声明函数为中断服务函数
//其后的3为定时器T1的中断编号;
Countor1++;
//Countor1自加1
Countor2++;
//Countor2自加1
if(Countor1==2)//若累计满2次,即计时满
100ms
//按位取反操作,将P2.0引脚输出电平取反
//将Countor1清0,重新从0开始计数
if(Countor2==8)//若累计满8次,即计时满400ms
D2=~D2;
//按位取反操作,将P2.1引脚输出电平取反
//定时器T1的高8位重新赋初值TL1=(65536-46083)%256;
//定时器T1的高8位重新赋初值
//实例50-1:
输出50个矩形脉冲
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<
n++)
/*******************************************
******************************************/
unsignedchari;
u=1;
//初始化输出高电平
for(i=0;
i<
50;
i++)//输出50个矩形脉冲
delay30ms();
u=0;
while
(1)
//无限循环,防止程序“跑飞”
//实例50-2:
计数器T0统计外部脉冲数
TMOD=0x06;
//TMOD=00000110B,使用计数器T0的模式2
ET0=0;
//开总中断
//不使用定时器
//启动T0
T0的中断
TH0=0;
TL0=0;
//计数器T0高8位赋初值
//计数器T0低8位赋初值
//无限循环,不停地将TL0计数结果送
P1口
//实例51-2:
定时器T0的模式2测量正脉冲宽度
sbitui=P3^2;
//将ui位定义为P3.0(INT0)引脚,表示输入电压
TMOD=0x0a;
//TMOD=00001010B,使用定时器
T0的模式
2,GATE置1
//不使用定时器T0的中断
while(ui==0)
//INT0
为低电平,
T0不能启动
//INT0为高电平,启动T0计时,所以将
while(ui==1)//在INT0高电平期间,等待,计时
TL0清
//将计时结果送
P1口显示
//实例53:
用外中断0的中断方式进行数据采集
sbitS=P3^2;
//将S位定义为P3.2,
//开放总中断
EX0=1;
//允许使用外中断
IT0=1;
//选择负跳变来触发外中断
P1=0xff;
//无限循环,防止程序跑飞
外中断T0的中断服务程序
voidint0(void)interrupt0using0//外中断0的中断编号为0
P1=~P1;
//每产生一次中断请求,P1取反一次。
//实例54-1:
输出负脉宽为200微秒的方波
//TMOD=00000010B,使用定时器T0的模式2
TH0=256-200;
TL0=256-200;
while
(1)//无限循环,等待中断
voidTime0(void)interrupt1using0//"
interrupt"
声明函数为中断服务函数
u=~u;
//将P1.4引脚输出电平取反,产生方波
//实例54-2:
测量负脉冲宽度
sbitu=P3^2;
//将u位定义为P3.2
//TMOD=00000010B,使用定时器T0的模式2
//允许定时器T0中断
//定时器T0赋初值0
TR0=0;
//先关闭T0
//无限循环,不停检测输入负脉冲宽度
外中断0的中断服务程序
voidint0(void)interrupt0using0//外中断0的中断编号为0{
//外中断一到来,即启动T0计时
//从0开始计时
while(u==0)//低电平时,等待T0计时
//将结果送P1口显示
//关闭T0
//实例55:
方式0控制流水灯循环点亮
intrins.h>
//包含函数_nop_()定义的头文件
unsignedcharcodeTab[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};
//流水灯控制码,该数组被定义为全局变量
sbitP17=P1^7;
延时约150ms
voiddelay(void)
200;
250;
发送一个字节的数据
**************************************************************/voidSend(unsignedchardat){
P17=0;
//P1.7引脚输出清0信号,对74LS164清0
_nop_();
//延时一个机器周期
//延时一个机器周期,保证清0完成
P17=1;
//结束对74LS164的清0
SBUF=dat;
//将数据写入发送缓冲器,启动发送
while(TI==0)//若没有发送完毕,等待
TI=0;
//发送完毕,TI被置“1”,需将其清0
SCON=0x00;
//SCON=0