电子产业一站式赋能平台

PCB联盟网

搜索
查看: 2343|回复: 0
收起左侧

请教定时器问题

[复制链接]

591

主题

1772

帖子

5770

积分

四级会员

Rank: 4

积分
5770
发表于 2022-7-6 16:43:54 | 显示全部楼层 |阅读模式
做一个无源蜂鸣器PWM输出报警声音。
方案一:IO口翻转这条语句(Buzz=~Buzz;)放while(1)循环里,频率变化放定时中断里。正常连续发声。
方案二:IO口翻转,和频率变化都放定时中断里。 声音会间歇性中断,响一下,又停一下。


定时器初始化函数是STC-ISP里生成的,方案一也是正常,方案二为什么有问题。




======== 【定时器初始化】=========
void Timer0Init(void)   //10微秒@11.0592MHz
{
AUXR |= 0x80;//定时器时钟1T模式
TMOD &= 0xF0;//设置定时器模式
TMOD |= 0x02;//设置定时器模式0x02-8位自动重装
TL0 = 0x91;//设置定时初始值
TH0 = 0x91;//设置定时重载值
TF0 = 0;//清除TF0标志
TR0 = 1;//定时器0开始计时
}
======== 【定时器中断函数】=========
void TM0_Isr() interrupt 1
{
         tpwmcnt++;
         if(tpwmcnt==tpwm2)
         {
                  tpwmcnt=0;
                  Buzz=~Buzz;
         }
              //上面是IO口翻转,计数达到半个周期翻转一次。
              //下面频率周期变化

tchgcnt++;
if(tchgcnt==1000)      //1000个10微秒频率变化一次
{
          tchgcnt=0;
         if(updnflag==1)        //频率增大
         {
                 tpwm2++;
                  if(tpwm2==20)             //达到最大频率改变标志

                   {updnflag=0;}
         }
         if(updnflag==0)         //频率减小
         {
                  tpwm2--;
                  if(tpwm2==10)          //达到最小频率改变标志
                  {updnflag=1;}
         }
}                              
}


void main()
{
    ET0 = 1;                              
    EA = 1;
Timer0Init();                                 
    while (1)
{
}
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


联系客服 关注微信 下载APP 返回顶部 返回列表