微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 新手求问,关于定时器和中断

新手求问,关于定时器和中断

时间:10-02 整理:3721RD 点击:

程序要求:同时用两个定时器控制蜂鸣器发声,定时器0控制频率,定时器1控制同个频率持续的时间,间隔2s依次输出1,10,50,100,200.400,800,1000hz的方波,晶振频率12mhz

timer0 函数实现的应该是依次输出不同频率的功能,想问下timer0 函数里面为什么那么写?里面的40,80,120,160,320什么的都是怎么出来的,还有,flag和tt是想做什么用?谢谢大家

#include<reg52.h>  //52单片机头文件

#include <intrins.h> //包含有左右循环移位子函数的库

#define uint unsigned int    //宏定义

#define uchar unsigned char  //宏定义

sbit beep=P2^3; uchar tt; uint fre,flag;  

void main()      //主函数

{  fre=50000;  beep=0;

TMOD=0x11;//设置定时器0,定时器1为工作方式1

TH0=(65536-fre)/256;  

TL0=(65536-fre)%256;

TH1=(65536-50000)/256;  

TL1=(65536-50000)%256;

EA=1;//开总中断

ET0=1;//开定时器0中断  

ET1=1;

TR1=1;

TR0=1;//启动定时器0  

while(1);//等待中断产生   }  


void timer0() interrupt 1   //定时器0中断

{  TR0=0;    //进中断后先把定时器0中断关闭,防止内部程序过多而造成中断丢失  TH0=(65536-fre)/256;  TL0=(65536-fre)%256;  tt++;

if(flag<40)    //以下几个if分别用来选取不同的频率

  if(tt==10)   

{     tt=0;     fre=50000;     beep=~beep;    }

if(flag>=40&&flag<80)  

{  

  tt=0;

  fre=50000;   

  beep=~beep;   

}

if(flag>=80&&flag<120)   

{    tt=0;  

  fre=10000;  

  beep=~beep;   

}

if(flag>=120&&flag<160)  

{    tt=0;   

fre=5000;   

beep=~beep;   

}

if(flag>=160&&flag<200)  

{    tt=0;   

fre=2500;   

beep=~beep;  

  }

if(flag>=200&&flag<240)  

{    tt=0;   

fre=1250;   

beep=~beep;   

}

if(flag>=240&&flag<280)   

{    tt=0;   

fre=625;   

beep=~beep;   

}

if(flag>=280&&flag<320)   

{    tt=0;

   fre=312;   

beep=~beep;   

}

if(flag>=320&&flag<360)  

{    tt=0;   

fre=156;   

beep=~beep;  

}

TR0=1;

}

void timer1() interrupt 3  //定时器1中断用来产生2秒时间定时

{  TH1=(65536-50000)/256;

TL1=(65536-50000)%256;

flag++;

if(flag==360)   

{      flag=0;     

fre=50000;

   }

}


timer0函数为中断函数·····标准格式是::
void 函数名() 中断号 using 工作组
{
中断服务程序内容
}
using 工作组可省略;
flag,tt;为标志常量,因为一次16位定时器最多能定时65536ns;所以2s要用flag来累加;

flag是用来计时的,两秒自加一次

谢谢

谢谢,终于搞明白了

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top