中断定时器实例Word文档格式.docx

上传人:b****6 文档编号:19129856 上传时间:2023-01-04 格式:DOCX 页数:28 大小:21.80KB
下载 相关 举报
中断定时器实例Word文档格式.docx_第1页
第1页 / 共28页
中断定时器实例Word文档格式.docx_第2页
第2页 / 共28页
中断定时器实例Word文档格式.docx_第3页
第3页 / 共28页
中断定时器实例Word文档格式.docx_第4页
第4页 / 共28页
中断定时器实例Word文档格式.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

中断定时器实例Word文档格式.docx

《中断定时器实例Word文档格式.docx》由会员分享,可在线阅读,更多相关《中断定时器实例Word文档格式.docx(28页珍藏版)》请在冰豆网上搜索。

中断定时器实例Word文档格式.docx

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,

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

当前位置:首页 > 自然科学 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1