找回密码
 立即注册

QQ登录

只需一步,快速开始

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

定时器设置频率和间隔的难题

[复制链接]
跳转到指定楼层
楼主
ID:129083 发表于 2016-7-19 13:51 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
3、同时用两个定时器控制蜂鸣器发声,定时器0控制频率,定时器1控制同个频率持续的时间,间隔300ms依次输出1,10,50,100,200,400,800,1k(hz)的方波。
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar num,j;
sbit beep=P3^6;
uint code PL[]={500,625,1250,2500,5000,10000};//1,10,50,100,200,400,800,1k(hz)方波
//我取他们定时的一半来对他们取反,但800HZ 和1khz太大我无法取半一次性放上去
void main()
{        EA=1;
        ET0=1;
        ET1=1;
        TR0=1;
        TH0=(65536-30000)/256;
        TL0=(65536-30000)%256;        //定时器0赋初值
        while(1)
        {
        if(num==10)                 //300MS到了后开始输出
        {
        num=0;                        //300ms重新计数
        TH1=(65536-PL[j]);       
        TL1=(65536-PL[j]);
        j++;                        //读取数组值得变量         
        if(j==6)
                {
        j=0;                                 //         j清零
                }
        }
        }
}

void T0_time()interrupt 1
{
        num++;                                         //计10次的300ms
        TH0=(65536-30000)/256;
        TL0=(65536-30000)%256;         

}
void T1_time() interrupt 1
{        TH1=(65536-PL[j]);
        TL1=(65536-PL[j]);                 //重装初值
        beep=~beep;                                 //取反

}
希望能告诉我哪里错了,那部分理解的不对。谢谢大神了

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:129083 发表于 2016-7-21 16:08 | 显示全部楼层
答案如下
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar num,j,bp;
sbit beep=P3^6;
uint code PL[]={50000,10000,5000,2500,1250,625,500} ;//1,10,50,100,200,400,800,1k(hz)方波
//我取他们定时的一半来对他们取反,但800HZ 和1khz太大我无法取半一次性放上去
void main()
{        TMOD=0x11;
        EA=1;
        ET0=1;
        ET1=1;
        TR0=1;
        TR1=1;
        TH0=(65536-30000)/256;
        TL0=(65536-30000)%256;        //定时器0赋初值
        TH1=(65536-PL[j])/256;       
        TL1=(65536-PL[j])%256;
        bp=0;num=0;j=0;beep=1;
        while(1)
        {
                if(bp>0)
                {
                        TR0=0;                 //防止混乱
                        bp=0;
                        beep=~beep;         //取反
                        if(num>5)        //300毫秒间隔
                        {
                                num=0;
                                j++;
                        }
                        if(j>6)                 //j清零
                        {
                        j=0;
                        }
                TR0=1;                        //开启定时器1
                }
        }

       
}

void T0_time()interrupt 1
{
        TH0=(65536-30000)/256;
        TL0=(65536-30000)%256;       
        num++;         

}
void T1_time() interrupt 3
{        TH1=(65536-PL[j])/256;
        TL1=(65536-PL[j])%256;                 //重装初值
        bp++;                                 
}
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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