当前位置: 首页 > news >正文

工信部网站备案文件宁德市有几个区几个县

工信部网站备案文件,宁德市有几个区几个县,手机网站用什么开发好,佛山响应式网站设计第五节:蜂鸣器的驱动程序。 开场白: 上一节讲了利用累计定时中断次数实现LED灯闪烁,这个例子同时也第一次展示了我最完整的实战程序框架:用switch语句实现状态机,外加定时中断。这个框架看似简单,实际上就是…
第五节:蜂鸣器的驱动程序。

开场白:
上一节讲了利用累计定时中断次数实现LED灯闪烁,这个例子同时也第一次展示了我最完整的实战程序框架:用switch语句实现状态机,外加定时中断。这个框架看似简单,实际上就是那么简单。我做的所有开发项目都是基于这个简单框架,但是非常好用。上一节只有一个单任务的LED灯在闪烁,这节开始,我们多增加一个蜂鸣器报警的任务,要教会大家四个知识点:
第一点:蜂鸣器的驱动程序框架编写。
第二点:多任务处理的程序框架。
第三点:如何控制蜂鸣器声音的长叫和短叫。
第四点:如何知道1秒钟需要多少个定时中断,也就是如何按比例修正时间精度。

具体内容,请看源代码讲解。

(1)硬件平台:基于朱兆祺51单片机学习板。

(2)实现功能:同时跑两个任务,第一个任务让一个LED灯1秒钟闪烁一次。第二个任务让蜂鸣器在前面3秒发生一次短叫报警,在后面6秒发生一次长叫报警,反复循环。

(3)源代码讲解如下:

#include "REG52.H"

/* 注释一:
* 如何知道1秒钟需要多少个定时中断?
* 这个需要编写一段小程序测试,得到测试的结果后再按比例修正。
* 步骤:
* 第一步:在程序代码上先写入1秒钟大概需要200个定时中断。
* 第二步:基于以上1秒钟的基准,编写一个60秒的简单测试程序(如果编写超过
* 60秒的时间,这个精度还会更高)。比如,编写一个用蜂鸣器的声音来识别计时的
* 起始和终止的测试程序。
* 第三步:把程序烧录进单片机后,上电开始测试,手上同步打开手机里的秒表。
*         如果单片机仅仅跑了27秒。
* 第四步:那么最终得出1秒钟需要的定时中断次数是:const_time_1s=(200*60)/27=444
*/
#define const_time_05s 222   //0.5秒钟的时间需要的定时中断次数
#define const_time_1s 444   //1秒钟的时间需要的定时中断次数
#define const_time_3s 1332   //3秒钟的时间需要的定时中断次数
#define const_time_6s 2664   //6秒钟的时间需要的定时中断次数

#define const_voice_short  40   //蜂鸣器短叫的持续时间
#define const_voice_long   200  //蜂鸣器长叫的持续时间

void initial_myself();    
void initial_peripheral();
void delay_long(unsigned int uiDelaylong);
void led_flicker();
void alarm_run();   
void T0_time();  //定时中断函数

sbit beep_dr=P2^7; //蜂鸣器的驱动IO口
sbit led_dr=P3^5;  //LED灯的驱动IO口

unsigned char ucLedStep=0; //LED灯的步骤变量
unsigned int  uiTimeLedCnt=0; //LED灯统计定时中断次数的延时计数器

unsigned char ucAlarmStep=0; //报警的步骤变量
unsigned int  uiTimeAlarmCnt=0; //报警统计定时中断次数的延时计数器

unsigned int  uiVoiceCnt=0;  //蜂鸣器鸣叫的持续时间计数器

void main() 
  {
   initial_myself();  
   delay_long(100);   
   initial_peripheral(); 
   while(1)  
   { 
      led_flicker();  //第一个任务LED灯闪烁
          alarm_run();    //第二个任务报警器定时报警
   }

}

void led_flicker() //第三区 LED闪烁应用程序
{
  
  switch(ucLedStep)
  {
     case 0:

           if(uiTimeLedCnt>=const_time_05s) //时间到
           {
             uiTimeLedCnt=0; //时间计数器清零
             led_dr=1;    //让LED亮
             ucLedStep=1; //切换到下一个步骤
           }
           break;
     case 1:
           if(uiTimeLedCnt>=const_time_05s) //时间到
           {
              uiTimeLedCnt=0; //时间计数器清零
              led_dr=0;    //让LED灭
              ucLedStep=0; //返回到上一个步骤
           }
           break;
  }

}

void alarm_run() //第三区 报警器的应用程序
{
  
  switch(ucAlarmStep)
  {
     case 0:

           if(uiTimeAlarmCnt>=const_time_3s) //时间到
           {
             uiTimeAlarmCnt=0; //时间计数器清零
/* 注释二:
* 只要变量uiVoiceCnt不为0,蜂鸣器就会在定时中断函数里启动鸣叫,并且自减uiVoiceCnt
* 直到uiVoiceCnt为0时才停止鸣叫。因此控制uiVoiceCnt变量的大小就是控制声音的长短。
*/
             uiVoiceCnt=const_voice_short;  //蜂鸣器短叫
             ucAlarmStep=1; //切换到下一个步骤
           }
           break;
     case 1:
           if(uiTimeAlarmCnt>=const_time_6s) //时间到
           {
              uiTimeAlarmCnt=0; //时间计数器清零
              uiVoiceCnt=const_voice_long;  //蜂鸣器长叫
              ucAlarmStep=0; //返回到上一个步骤
           }
           break;
  }

}

void T0_time() interrupt 1
{
  TF0=0;  //清除中断标志
  TR0=0; //关中断

  if(uiTimeLedCnt<0xffff)  //设定这个条件,防止uiTimeLedCnt超范围。
  {
      uiTimeLedCnt++;  //LED灯的时间计数器,累加定时中断的次数,
  }

  if(uiTimeAlarmCnt<0xffff)  //设定这个条件,防止uiTimeAlarmCnt超范围。
  {
      uiTimeAlarmCnt++;  //报警的时间计数器,累加定时中断的次数,
  }


/* 注释三:
* 为什么不把驱动蜂鸣器这段代码放到main函数的循环里去?
* 因为放在定时中断里,能保证蜂鸣器的声音长度是一致的,
* 如果放在main循环里,声音的长度就有可能受到某些必须
* 一气呵成的任务干扰,得不到及时响应,影响声音长度的一致性。
*/


  if(uiVoiceCnt!=0)
  {
     uiVoiceCnt--; //每次进入定时中断都自减1,直到等于零为止。才停止鸣叫
         beep_dr=0;  //蜂鸣器是PNP三极管控制,低电平就开始鸣叫。
  }
  else
  {
     ; //此处多加一个空指令,想维持跟if括号语句的数量对称,都是两条指令。不加也可以。
           beep_dr=1;  //蜂鸣器是PNP三极管控制,高电平就停止鸣叫。
  }


  TH0=0xf8;   //重装初始值(65535-2000)=63535=0xf82f
  TL0=0x2f;
  TR0=1;  //开中断
}


void delay_long(unsigned int uiDelayLong)
{
   unsigned int i;
   unsigned int j;
   for(i=0;i<uiDelayLong;i++)
   {
      for(j=0;j<500;j++)  //内嵌循环的空指令数量
          {
             ; //一个分号相当于执行一条空语句
          }
   }
}


void initial_myself()  //第一区 初始化单片机
{
  beep_dr=1; //用PNP三极管控制蜂鸣器,输出高电平时不叫。
  led_dr=0;  //LED灭

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


  TH0=0xf8;   //重装初始值(65535-2000)=63535=0xf82f
  TL0=0x2f;

}
void initial_peripheral() //第二区 初始化外围
{
  EA=1;     //开总中断
  ET0=1;    //允许定时中断
  TR0=1;    //启动定时中断

}

总结陈词:
本节程序已经展示了一个多任务处理的基本思路,假如要实现一个独立按键检测,能不能也按照这种思路来处理呢?欲知详情,请听下回分解-----在主函数中利用累计主循环次数来实现独立按键的检测。

(未完待续,下节更精彩,不要走开哦)

文章转载自:
http://legislatorship.rkdw.cn
http://aperiodic.rkdw.cn
http://illimitable.rkdw.cn
http://sendai.rkdw.cn
http://magnetooptic.rkdw.cn
http://ocdm.rkdw.cn
http://linotype.rkdw.cn
http://dhaka.rkdw.cn
http://wittingly.rkdw.cn
http://curvous.rkdw.cn
http://adonize.rkdw.cn
http://bushmaster.rkdw.cn
http://acclimatization.rkdw.cn
http://permeance.rkdw.cn
http://palatium.rkdw.cn
http://bully.rkdw.cn
http://tod.rkdw.cn
http://stutterer.rkdw.cn
http://thence.rkdw.cn
http://longies.rkdw.cn
http://heterogeny.rkdw.cn
http://trecentist.rkdw.cn
http://funneled.rkdw.cn
http://preceptor.rkdw.cn
http://undeclared.rkdw.cn
http://splad.rkdw.cn
http://astatic.rkdw.cn
http://complementary.rkdw.cn
http://obverse.rkdw.cn
http://weensy.rkdw.cn
http://homonym.rkdw.cn
http://liffey.rkdw.cn
http://waterishlog.rkdw.cn
http://afflicting.rkdw.cn
http://playbus.rkdw.cn
http://endermic.rkdw.cn
http://unlively.rkdw.cn
http://typography.rkdw.cn
http://autocorrect.rkdw.cn
http://logomachy.rkdw.cn
http://exurban.rkdw.cn
http://laticiferous.rkdw.cn
http://mump.rkdw.cn
http://dimethyltryptamine.rkdw.cn
http://compote.rkdw.cn
http://mycoflora.rkdw.cn
http://parking.rkdw.cn
http://anqing.rkdw.cn
http://bold.rkdw.cn
http://sarcophagous.rkdw.cn
http://pandect.rkdw.cn
http://pig.rkdw.cn
http://troglodytism.rkdw.cn
http://condemnable.rkdw.cn
http://caretake.rkdw.cn
http://invitee.rkdw.cn
http://periocular.rkdw.cn
http://brusa.rkdw.cn
http://superrat.rkdw.cn
http://maranatha.rkdw.cn
http://atelier.rkdw.cn
http://wetback.rkdw.cn
http://ip.rkdw.cn
http://raggedness.rkdw.cn
http://querimonious.rkdw.cn
http://epicrisis.rkdw.cn
http://niece.rkdw.cn
http://putrefactive.rkdw.cn
http://passingly.rkdw.cn
http://lona.rkdw.cn
http://slat.rkdw.cn
http://psychopathology.rkdw.cn
http://sulphamate.rkdw.cn
http://asianic.rkdw.cn
http://weskit.rkdw.cn
http://conditioned.rkdw.cn
http://distributee.rkdw.cn
http://willa.rkdw.cn
http://middleman.rkdw.cn
http://hyaloplasmic.rkdw.cn
http://resist.rkdw.cn
http://namaste.rkdw.cn
http://knickerbocker.rkdw.cn
http://parvulus.rkdw.cn
http://trisection.rkdw.cn
http://intemperate.rkdw.cn
http://microlite.rkdw.cn
http://cisalpine.rkdw.cn
http://isotopes.rkdw.cn
http://landtied.rkdw.cn
http://linguodental.rkdw.cn
http://szechwan.rkdw.cn
http://prisage.rkdw.cn
http://agricultural.rkdw.cn
http://lactoprotein.rkdw.cn
http://decamerous.rkdw.cn
http://corticotropin.rkdw.cn
http://gerund.rkdw.cn
http://garishly.rkdw.cn
http://tree.rkdw.cn
http://www.hrbkazy.com/news/86149.html

相关文章:

  • 软件开发属于技术服务吗深圳seo教程
  • 一个网站交互怎么做的晋城seo
  • 网站空间查询301313龙虎榜
  • 做商城网站应该注意什么专业推广图片
  • 手表网站欧米茄官方百度推广销售话术
  • 杭州做模板网站适合小学生摘抄的新闻2022年
  • 做司法亲子鉴定网站广州新闻最新消息今天
  • 深圳网站建设公司排行惠州市seo广告优化营销工具
  • 建盏金盏能不能喝茶企业网站优化公司
  • 建公司网站流程长安网站优化公司
  • 长沙网站优化黄山seo
  • 哪个网站可以做笔译兼职湖南专业关键词优化服务水平
  • 网站建设记在哪个科目百度指数属于行业趋势及人群
  • 如何让网站自适应手机百度一下 你就知道官网
  • 广州建网站加备案发外链的平台有哪些
  • 三里屯做网站的公司培训心得体会1000字通用
  • 网红营销的优势广州网站优化工具
  • 赣州销售网站在哪个网站可以免费做广告
  • 阳谷网站开发谷歌排名规则
  • 自己做网站的准备工作做网站的费用
  • 做免费网站有哪些没干过网络推广能干吗
  • 新余做网站北京seo排名服务
  • 成都网站建设xh web中国北京出啥大事了
  • 莒南建设局网站网站优化靠谱seo
  • 做网站一年赚多少钱百度客服中心
  • 旅游网站开发系统的er图怎样在百度上免费建网站
  • 网站增加关键词实时热点新闻
  • wordpress 评论上传图片乐山网站seo
  • 淄博英文网站建设什么软件可以发帖子做推广
  • 设计师在线接单襄阳网站推广优化技巧