中断定时器实例Word文档格式.docx
《中断定时器实例Word文档格式.docx》由会员分享,可在线阅读,更多相关《中断定时器实例Word文档格式.docx(28页珍藏版)》请在冰豆网上搜索。
P2=~P2;
}
实例43:
用定时器T1查询方式控制单片机发出1KHz音频
sbitsound=P3^7;
//将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);
TF1=0;
sound=~sound;
//将P3.7引脚输出电平取反
实例44:
将计数器T0计数的结果送P1口8位LED显示
sbitS=P3^4;
//将S位定义为P3.4引脚
TMOD=0x02;
//使用定时器T0的模式2
TH0=256-156;
TL0=256-156;
while(TF0==0)//如果未计满就等待
{
if(S==0)//按键S按下接地,电平为0
P1=TL0;
//计数器TL0加1后送P1口显示
}
//计数器溢出后,将TF0清0
实例45:
用定时器T0的中断控制1位LED闪烁
sbitD1=P2^0;
//将D1位定义为P2.0引脚
EA=1;
ET0=1;
//使用定时器T0的模式2
while
(1)//无限循环等待中断
;
定时器T0的中断服务程序
voidTime0(void)interrupt1using0//“interrupt”声明函数为中断服务函数
//其后的1为定时器T0的中断编号;
0表示使用第0组工作寄存器
D1=~D1;
//按位取反操作,将P2.0引脚输出电平取反
TH0=(65536-46083)/256;
//定时器T0的高8位重新赋初值
实例46:
用定时器T0的中断实现长时间定时
unsignedcharCountor;
//设置全局变量,储存定时器T0中断次数
Countor=0;
//从0开始累计中断次数
Countor++;
//中断次数自加1
if(Countor==20)//若累计满20次,即计时满1s
Countor=0;
//将Countor清0,重新从0开始计数
实例47:
用定时器T1中断控制两个LED以不同周期闪烁
sbitD2=P2^1;
//将D2位定义为P2.1引脚
unsignedcharCountor1;
//设置全局变量,储存定时器T1中断次数
unsignedcharCountor2;
ET1=1;
//定时器T1中断允许
TH1=(65536-46083)/256;
TL1=(65536-46083)%256;
Countor1=0;
Countor2=0;
//从0开始累计中断次数
定时器T1的中断服务程序
voidTime1(void)interrupt3using0//“interrupt”声明函数为中断服务函数
//其后的3为定时器T1的中断编号;
Countor1++;
//Countor1自加1
Countor2++;
//Countor2自加1
if(Countor1==2)//若累计满2次,即计时满100ms
D1=~D1;
Countor1=0;
//将Countor1清0,重新从0开始计数
}
if(Countor2==8)//若累计满8次,即计时满400ms
D2=~D2;
//按位取反操作,将P2.1引脚输出电平取反
Countor2=0;
}
TH1=(65536-46083)/256;
//定时器T1的高8位重新赋初值
实例48:
用计数器T1的中断控制蜂鸣器发出1KHz音频
//TMOD=0001000B,使用定时器T1的模式1
sound=~sound;
TH1=(65536-921)/256;
实例49:
用定时器T0的中断实现"
渴望"
主题曲的播放
//包含51单片机寄存器定义的头文件
//将sound位定义为P3.7
unsignedintC;
//储存定时器的定时常数
//以下是C调低音的音频宏定义
#definel_dao262//将“l_dao”宏定义为低音“1”的频率262Hz
#definel_re286//将“l_re”宏定义为低音“2”的频率286Hz
#definel_mi311//将“l_mi”宏定义为低音“3”的频率311Hz
#definel_fa349//将“l_fa”宏定义为低音“4”的频率349Hz
#definel_sao392//将“l_sao”宏定义为低音“5”的频率392Hz
#definel_la440//将“l_a”宏定义为低音“6”的频率440Hz
#definel_xi494//将“l_xi”宏定义为低音“7”的频率494Hz
//以下是C调中音的音频宏定义
#definedao523//将“dao”宏定义为中音“1”的频率523Hz
#definere587//将“re”宏定义为中音“2”的频率587Hz
#definemi659//将“mi”宏定义为中音“3”的频率659Hz
#definefa698//将“fa”宏定义为中音“4”的频率698Hz
#definesao784//将“sao”宏定义为中音“5”的频率784Hz
#definela880//将“la”宏定义为中音“6”的频率880Hz
#definexi987//将“xi”宏定义为中音“7”的频率523H
//以下是C调高音的音频宏定义
#defineh_dao1046//将“h_dao”宏定义为高音“1”的频率1046Hz
#defineh_re1174//将“h_re”宏定义为高音“2”的频率1174Hz
#defineh_mi1318//将“h_mi”宏定义为高音“3”的频率1318Hz
#defineh_fa1396//将“h_fa”宏定义为高音“4”的频率1396Hz
#defineh_sao1567//将“h_sao”宏定义为高音“5”的频率1567Hz
#defineh_la1760//将“h_la”宏定义为高音“6”的频率1760Hz
#defineh_xi1975//将“h_xi”宏定义为高音“7”的频率1975Hz
/*******************************************
1个延时单位,延时200ms
******************************************/
voiddelay()
unsignedchari,j;
for(i=0;
i<
250;
i++)
for(j=0;
j<
j++)
;
******************************************/
//以下是《渴望》片头曲的一段简谱
unsignedintcodef[]={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,
0xff};
//以0xff作为音符的结束标志
//以下是简谱中每个音符的节拍
//"
4"
对应4个延时单位,"
2"
对应2个延时单位,"
1"
对应1个延时单位
unsignedcharcodeJP[]={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,
4,4,4,2,2,
4,2,4,4,
4,2,2,2,2,2,2,
2,2,2,2,6,
4,2,2,4,1,1,4,
10
};
//定时器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位的赋初值方法
for(j=0;
JP[i];
j++)//控制节拍数
delay();
//延时1个节拍单位
TR0=0;
//关闭定时器T0
i++;
//播放下一个音符
}
}
}
定时器T0的中断服务子程序,使P3.7引脚输出音频的方波
voidTime0(void)interrupt1using1
sound=!
sound;
//将P3.7引脚输出电平取反,形成方波
//可证明这是13位计数器TL0低5位的赋初值方法
实例50-1:
输出50个矩形脉冲
//包含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<
n++)
}
unsignedchari;
u=1;
//初始化输出高电平
50;
i++)//输出50个矩形脉冲
u=1;
delay30ms();
u=0;
while
(1)
;
//无限循环,防止程序“跑飞”
实例50-2:
计数器T0统计外部脉冲数
TMOD=0x06;
//TMOD=00000110B,使用计数器T0的模式2
ET0=0;
//不使用定时器T0的中断
//启动T0
TH0=0;
//计数器T0高8位赋初值
TL0=0;
//计数器T0低8位赋初值
while
(1)//无限循环,不停地将TL0计数结果送P1口
P1=TL0;
实例51-2:
定时器T0的模式2测量正脉冲宽度
sbitui=P3^2;
//将ui位定义为P3.0(INT0)引脚,表示输入电压
TMOD=0x0a;
//TMOD=00001010B,使用定时器T0的模式2,