找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3007|回复: 3
打印 上一主题 下一主题
收起左侧

单片机同时用两个定时器控制蜂鸣器发声?

[复制链接]
跳转到指定楼层
楼主
ID:292262 发表于 2019-6-5 10:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
郭天祥的第三章3.3的题目:同时用两个定时器控制蜂鸣器发声,定时器0控制频率,定时器1控制同个频率持续的时间,间隔300ms依次输出1,10,50,100,200,400,800,
1k(hz)的方波?
给出的答案:                                                        
同时用两个定时器控制蜂鸣器发声,
定时器0控制频率,定时器1控制同个
频率持续的时间,间隔2s依次输出
1,10,50,100,200,400,800,
1k(hz)的方波?
设晶振频率为12MHz。
*/
/*********************************************************/
#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;
          }
}

答案是不是错了?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:557774 发表于 2019-6-14 08:13 来自手机 | 只看该作者
没看出来
回复

使用道具 举报

板凳
ID:562399 发表于 2019-6-14 10:52 | 只看该作者
学习一下
回复

使用道具 举报

地板
ID:207421 发表于 2019-6-14 16:10 | 只看该作者
if(flag==360) ----> 360*50ms=18000ms=18s
18s内必须完成,各个频率的演示.
if(flag>=40&&flag<80)  //40*50ms=2000ms  <--->  79*50ms=3950ms  在这个时间段执行如下代码
{
     tt=0;                       //计数清零
     fre=50000;               //初值 50ms
      beep=~beep;          //50ms  响一次, 周期100ms  10Hz
  }
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表