Countor=0; //从0开始累计中断次数 while(1)//无限循环等待中断 ; }
/ 函数功能:定时器T0的中断服务程序
/ void Time0(void) interrupt 1 using 0 //“interrupt”声明函数为中断服务函数
//其后的1为定时器T0的中断编号;0表示使用第0组工作寄存器 {
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)%6; //定时器T0的高8位重新赋初值 }
//实例47:用定时器T1中断控制两个LED以不同周期闪烁
#include
unsigned char Countor1; //设置全局变量,储存定时器T1中断次数 unsigned char Countor2; //设置全局变量,储存定时器T1中断次数
/ 函数功能:主函数
/ void main(void) {
EA=1; //开总中断 ET1=1; //定时器T1中断允许 TMOD=0x10; //使用定时器T1的模式1 TH1=(65536-46083)/256; //定时器T1的高8位赋初值 TL1=(65536-46083)%6; //定时器T1的高8位赋初值 TR1=1; //启动定时器T1 Countor1=0; //从0开始累计中断次数 Countor2=0; //从0开始累计中断次数
while(1)//无限循环等待中断 ; }
/ 函数功能:定时器T1的中断服务程序
/ void Time1(void) interrupt 3 using 0 //“interrupt”声明函数为中断服务函数
//其后的3为定时器T1的中断编号;0表示使用第0组工作寄存器 {
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)%6; //定时器T1的高8位重新赋初值 }
//实例48:用计数器T1的中断控制蜂鸣器发出1KHz音频
#include
/ 函数功能:主函数
/ void main(void) {
EA=1; //开总中断 ET1=1; //定时器T1中断允许 TMOD=0x10; //TMOD=0001 000B,使用定时器T1的模式1 TH1=(65536-921)/256; //定时器T1的高8位赋初值 TL1=(65536-921)%6; //定时器T1的高8位赋初值 TR1=1; //启动定时器T1
while(1)//无限循环等待中断 ; }
/ 函数功能:定时器T1的中断服务程序
/ void Time1(void) interrupt 3 using 0 //“interrupt”声明函数为中断服务函数 {
sound=~sound;
TH1=(65536-921)/256; //定时器T1的高8位重新赋初值 TL1=(65536-921)%6; //定时器T1的高8位重新赋初值 }
//实例49:用定时器T0的中断实现\渴望\主题曲的播放
#include
#define l_dao 262 //将“l_dao”宏定义为低音“1”的频率262Hz #define l_re 286 //将“l_re”宏定义为低音“2”的频率286Hz #define l_mi 311 //将“l_mi”宏定义为低音“3”的频率311Hz #define l_fa 349 //将“l_fa”宏定义为低音“4”的频率349Hz #define l_sao 392 //将“l_sao”宏定义为低音“5”的频率392Hz #define l_la 440 //将“l_a”宏定义为低音“6”的频率440Hz #define l_xi 494 //将“l_xi”宏定义为低音“7”的频率494Hz //以下是C调中音的音频宏定义
#define dao 523 //将“dao”宏定义为中音“1”的频率523Hz #define re 587 //将“re”宏定义为中音“2”的频率587Hz #define mi 659 //将“mi”宏定义为中音“3”的频率659Hz #define fa 698 //将“fa”宏定义为中音“4”的频率698Hz #define sao 784 //将“sao”宏定义为中音“5”的频率784Hz #define la 880 //将“la”宏定义为中音“6”的频率880Hz
#define xi 987 //将“xi”宏定义为中音“7”的频率523H //以下是C调高音的音频宏定义
#define h_dao 1046 //将“h_dao”宏定义为高音“1”的频率1046Hz #define h_re 1174 //将“h_re”宏定义为高音“2”的频率1174Hz #define h_mi 1318 //将“h_mi”宏定义为高音“3”的频率1318Hz #define h_fa 1396 //将“h_fa”宏定义为高音“4”的频率1396Hz #define h_sao 1567 //将“h_sao”宏定义为高音“5”的频率1567Hz #define h_la 1760 //将“h_la”宏定义为高音“6”的频率1760Hz
#define h_xi 1975 //将“h_xi”宏定义为高音“7”的频率1975Hz / 函数功能:1个延时单位,延时200ms
/ void delay() {
unsigned char i,j; for(i=0;i<250;i++) for(j=0;j<250;j++) ; }
/ 函数功能:主函数
/ void main(void) {
unsigned char i,j; //以下是《渴望》片头曲的一段简谱
unsigned int code f[]={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, re, l_la,dao,re,l_la,dao,re,mi, re, 0xff}; //以0xff作为音符的结束标志
//以下是简谱中每个音符的节拍
//\对应4个延时单位,\对应2个延时单位,\对应1个延时单位 unsigned char code JP[ ]={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, 10, 4,4,4,2,2, 4,2,4,4, 4,2,2,2,2,2,2, 10, 4,2,2,4,4, 2,2,2,2,6, 4,2,2,4,1,1,4, 10, 4,2,2,4,1,1,4, 10 }; EA=1; //开总中断 ET0=1; //定时器T0中断允许
TMOD=0x00; // 使用定时器T0的模式1(13位计数器) while(1) //无限循环 { i=0; //从第1个音符f[0]开始播放 while(f[i]!=0xff) //只要没有读到结束标志就继续播放 {
C=460830/f[i];
TH0=(8192-C)/32; //可证明这是13位计数器TH0高8位的赋初值方法
TL0=(8192-C)2; //可证明这是13位计数器TL0低5位的赋初值方法
TR0=1; //启动定时器T0 for(j=0;j delay(); //延时1个节拍单位 TR0=0; //关闭定时器T0 i++; //播放下一个音符 } } } / 函数功能:定时器T0的中断服务子程序,使P3.7引脚输出音频的方波 / void Time0(void ) interrupt 1 using 1 { sound=!sound; //将P3.7引脚输出电平取反,形成方波 TH0=(8192-C)/32; //可证明这是13位计数器TH0高8位的赋初值方法 TL0=(8192-C)2; //可证明这是13位计数器TL0低5位的赋初值方法