找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5726|回复: 6
收起左侧

同时用两个定时器控制蜂鸣器发声

  [复制链接]
ID:21069 发表于 2019-3-4 01:52 | 显示全部楼层 |阅读模式
本帖最后由 jinsheng7533967 于 2019-3-4 01:55 编辑

                                                         111.jpg

#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit sond=P3^7;

uint yanshi[]={50000,10000,5000,2500,1250,625,500}
uchar t,f,pd;  //t为50mS时间脉冲信号f为变频信号,pd为所选频段
void timer0() interrupt 1 // 定时器0控制频率
{
TH0=(65536-yanshi[pd])/256;
TL0=(65536-yanshi[pd])%256;
f++;        //bp为变频信号
}

void timer1() interrupt 3 // 定时器1控制同个频率持续的时间,50mS脉冲
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
t++;
}

void init()
{
EA=1;  //开启总中断
ET0=1;ET1=1;               //开启外部定时器中断允许位
TMOD=0x11;                 //同时定义两个定时器的工作模式
TH0=(65536-yanshi[f])/256;
TL0=(65536-yanshi[f])%256;//给定时器0赋初值
TH1=(65536-50000)/256;
TL1=(65536-50000)%256; //给定时器1赋初值
TR0=1;TR1=1;//启动两个定时器可以测试一次给字节赋值
}

void main()
{
f=0;pd=0;sond=1;t=0;
init();
while(1)
{
  if(f>0)  
  {

   TR0=0;  //关闭定时器0防止在执行定时器1时被中断会引起混乱    bp=0; 将变频信号bp归零等待下一个信号1
   sond=~sond;  //变频信号发生后beep取反
   if(t>5)    //测试定时器0脉冲是否达到6个即300mS
   {
    pd++;  //如果达到300mS频段改变
    t=0;   //将定时器脉冲数归零
   }
   if(pd>6)  //频段pd超出6个即第7个时将频段归零
   {
    pd=0;   
   }
   TR0=1;    //开启定时器0让定时器0继续工作定时器0在每执行一次以
  }
}
}

同时用两个定时器控制蜂鸣器发声.rar (13.93 KB, 下载次数: 56)

评分

参与人数 7黑币 +74 收起 理由
嘉立创AAA + 8 赞一个!
zhengchong60 + 6 赞一个!
正规007 + 8 很给力!
Sawardeakar + 10 很给力!
yoxi + 16 赞一个!
shuisheng + 16 很给力!
春风十里吹 + 10 赞一个!

查看全部评分

回复

使用道具 举报

ID:478073 发表于 2019-3-4 04:35 | 显示全部楼层
好样的!棒棒哒!
回复

使用道具 举报

ID:473186 发表于 2019-3-7 23:02 | 显示全部楼层
真心不错,资源也很多!
回复

使用道具 举报

ID:21069 发表于 2019-5-20 22:19 | 显示全部楼层
其实是一个定时器嵌套的案例,懂的人就明白
回复

使用道具 举报

ID:292262 发表于 2019-6-5 10:36 | 显示全部楼层
比原版视频里写的好
回复

使用道具 举报

ID:292262 发表于 2019-6-5 10:37 | 显示全部楼层
可以下载吗
回复

使用道具 举报

ID:454000 发表于 2020-3-24 20:10 | 显示全部楼层
精品啊!值得收藏!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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