基于STC51单片机的自动门铃

发布者:huanxin最新更新时间:2024-04-07 来源: elecfans关键字:STC51  单片机 手机看文章 扫描二维码
随时随地手机看文章

设计要求:#

利用红外对管检测是否有人进出


在触发红外对管后,使用PWM驱动蜂鸣器,使其发出叮咚叮咚的声音


设计概述:#

按照设计要求,为了直观的说明脉冲宽度调制技术(PWM),所以门铃的声音效果为叮咚叮咚形式。所需要的单片机芯片为STC89C52,所用的硬件工具是由华清远见开发的基于STC89C52的智能小车。该小车配备所需要的红外探测模块和蜂鸣器模块,红外探测模块由P3口控制,蜂鸣器模块由P2口控制。STC89C52是一种低功耗,高性能的8位微控制器,是加强版的80C51单片机,但是与80C51单片机一样不具备PWM硬件模块,所以我们需要自己写一个程序来软件模拟PWM方波。


PWM是一种方波,可以实现数字信号控制模拟电路,它有两个重要参数周期或频率,占空比。占空比 = 高电平时间/周期,最小为0%,最大为100%,通过调整占空比来控制高电平,低电平所占比例,进而调控蜂鸣器的响度。


STC89C52的P2口是低电平有效,将P2.3口置0,蜂鸣器响;置1则不响。所以低电平在一定的周期内占的脉冲宽度越宽,即低电平所占百分比越大,蜂鸣器就越响


在STC89C52开发板中,当红外探测模块识别到有人进出时,会将P3.2口置0,反之置1


关于脉冲宽度调制(PWM)的详细资料可以在各大网站上查找。


源代码:#

/*


第一个文件为自定义头文件,这个文件里声明了蜂鸣器控制函数


文件名为doorbell.h


*/


#ifndef _DOORBELL_H


#define _DOORBELL_H




//char delay_ms(unsigned int ms);




char pwm_beep_ctl(unsigned int flag);




#endif




/*


第二个文件实现蜂鸣器控制函数


文件名为doorbell.c


*/




#include


#include 'doorbell.h'//引用自己定义的头文件




//P2.3口为0时,蜂鸣器响;为1时不响


sbit BEEP = P2^3;//这条语句的作用是使变量BEEP指向P2口的第3位




/*延时函数


char delay_ms(unsigned int ms)


{


   //如果不加volatile,则编译器会自动忽略无循环体的for循环


   volatile unsigned int i,j;




   if(ms<0||ms>65535)


   {


      return -1;


   }


   for(i=0;i

   {


      for(j=0;j<10;j++)


               ;


   }


   return 0;


}    


*/




char pwm_beep_ctl(unsigned int flag)


{


   //定义一个变量pwm,通过对pwm的累加来调控PWM的占空比


   //在下面的for循环中,为什么当pwm的值分别为500和1000时要改变蜂鸣器的状态?


   //因为这样刚好使PWM的占空比为50%,输出等宽方波。低电平占50%,高电平占50%。


   unsigned int pwm;


   


   for(pwm=0;pwm<=10000;pwm++)


   {


      if(pwm == 500)


      {


         BEEP = flag;


//delay_ms(1000);


//这里加一个延时函数可以让蜂鸣器响的频率慢一点


      }


      else if(pwm == 1000)


      {


         BEEP = 1;


//delay_ms(1000);


      }


   }


   return 0;


}




/*


第三个文件为主函数文件


文件名为main.c


*/




#include


#include 'doorbell.h'//引用自己定义的头文件




//定义两个宏,置0蜂鸣器响,置1蜂鸣器不响


#define BEEPON 0


#define BEEPOFF 1




//P3.2口为0时,红外探测识别到;为1时,没有识别到


sbit infrared_detector = P3^2;//这条语句的作用是让变量infrared_detector指向P3口的第2位




/*定时器中断服务函数*/


void timer0() interrupt 1


{


   if(infrared_detector == 0)


   {


      pwm_beep_ctl(BEEPON);


   }


   else if(infrared_detector == 1)


   {


      pwm_beep_ctl(BEEPOFF);


   }


}




/*主函数*/


void main()


{


   TMOD |= 1<<1;   //通过移位运算符'<<'来改变位的状态


   TMOD &= ~(1<<0); //置定时器/计数器的工作方式为方式2




   TMOD &= ~(1<<2);   //选择定时工作方式


   TMOD &= ~(1<<3);   //门控位:由运行控制位TR启动定时器




   TL0 = 156;    


   TH0 = 156;    //100us进入一次中断,0.1毫秒




   ET0 = 1;   //定时器0开中断


   EA = 1;    //CPU开中断


   TR0 = 1;   //启动定时器0


   while(1) //防止程序跑飞


        ;


}


小车部分模块原理图:#



关键字:STC51  单片机 引用地址:基于STC51单片机的自动门铃

上一篇:基于STC51单片机的霓虹灯
下一篇:DP5321超低功耗读写芯片支持NFC功能兼容pn5321

推荐阅读最新更新时间:2026-03-20 07:22

STC51从入门到精通(汇编)----第四讲:80C51单片机的指令系统(二)寻址方式
4.2.1 指令系统中使用的常用符号: Rn: 当前寄存器工作区中的寄存器, 其中, n=0 -- 7; direct: 内部数据存储器地址, 可指定一个内部RAM单元(0-- 127)或一个专用寄存器(128-- 255); @Ri: 通过R1或R0间接寻址, 指定数据存储器RAM中的一个单元(0-- 255); #data: 在指令中指明8位常数; #data16: 在指令中指明16位常数; addr11: 11位目的地址, 用在ACALL或AJMP指令中,表示调用或转移地址, 寻址范围为2KB; addr16: 16位目的地址, 用在LCALL或LJ MP指令中, 表示调用或转换地址,
[单片机]
<font color='red'>STC51</font>从入门到精通(汇编)----第四讲:80C51<font color='red'>单片机</font>的指令系统(二)寻址方式
STC51从入门到精通(汇编)----第四讲:80C51单片机的指令系统(一)程序设计语言和指令
学习指令系统重点要掌握以下几点: 指令功能 寻址方式 操作数的位数和存储结构 对PSW的影响 指令与存储区的对应关系 各类指针及其指向的地址范围 转移指令的转移范围 指令字节数和机器周期数 & 本章主要介绍单片机的寻址方式及指令系统,是必须掌握的内容。 & 一台计算机所有指令的集合, 称为该计算机的指令系统。 & 各种计算机都有专用的指令系统。 4.1.1 程序设计语言和指令: 程序设计语言是实现人机交换信息的重要工具。机器语言指令是单片机能直接识别、分祈和执行的二进制码,用机器语言写的程序称为目标程序。 例如, 要做 10+20 的加法, 在51中可用机器码指令编程: 01110100
[单片机]
<font color='red'>STC51</font>从入门到精通(汇编)----第四讲:80C51<font color='red'>单片机</font>的指令系统(一)程序设计语言和指令
STC51单片机实例之05数码管的各种显示方式
简介:本文主要是STC51单片机实例之05数码管的各种显示方式的程序代码,希望对你的学习有所帮助。
[单片机]
<font color='red'>STC51</font><font color='red'>单片机</font>实例之05数码管的各种显示方式
STC51单片机实例之03单灯闪烁
简介:该程序是一个最简单的单片机代码。实现了一个LED的不停闪烁。 STC51单片机实例之03单灯闪烁 该程序是一个最简单的单片机代码。实现了一个LED的不停闪烁。
[单片机]
<font color='red'>STC51</font><font color='red'>单片机</font>实例之03单灯闪烁
stc51单片机内部扩展RAM应用
我写贪吃蛇程序的时候存放蛇身数据的100个point类型量总是无法全部定出来,我就只能把最大长度定位十几二十几左右,突然想起郭天祥的书上的stc扩展功能,找了一下果然,使用xdata就能完美解决这个问题。哈哈哈哈哈哈~~~~ 以下图片截自《郭天祥新概念51单片机C语言教程 入门、提高、开发、拓展全攻略》
[单片机]
<font color='red'>stc51</font><font color='red'>单片机</font>内部扩展RAM应用
STC51单片机SPI接口单主单从模式通信-汇编语言
;============================================ ;STC12C5410 spi 通信 ;单主单从模式 ;============================================ ;MASTER EQU 1 ;主单片机 MASTER EQU 0 ;从机 ;------------------------------------- ;定义COM波特率自动重装常数 ; RELOAD_8BIT_DATA EQU 0F6H; Fosc=18.432 ,4800 ;-------------------------------------
[单片机]
Linux下构建stc51单片机开发环境
只是做几个软件的推荐。具体什么情况我也正在研究中。 开发环境(编译器):mcu 8051 ide ~$sudo apt-get install mcu8051ide 软件包大概有600多兆。总之我很坑的给下载下来了。这个编译器有一个问题,就是它的方式和keil不同。比如,你定义 sbit led=P0^0; 会提示有问题,因为引用的头文件不再是reg52.h,而是8052.h。这个软件自带hex转bin的功能,还是很全的。(压根不会用) 烧写器: 不要用gstcisp来烧写。写不上去的 。使用stcflash 下载界面:github.com/laborer/stcflash 下载下来有一个zip包。可以直接解压,进入解压目录 首
[单片机]
基于stc51单片机的电子时钟设计
硬件资源 焊接电路板中使用STC系列单片机,一个四位一体数码管、一个二极管,以及一些必要辅助子电路。数码管的位选端口为P3^0、P3^1、P3^2、P3^3,段选端口为P1的8个端口;调节小时、分钟端口分别为P0^0、P0^4,二极管指示灯接P2^2口。 由于使用的数码管为共阳极数码管,因此根据数码管结构图可知,P3口必须置高电平选通其中一位,P0口低电平点亮相应的断码,这和共阴极数码管0x3f代表0不一样,这里表示为0xc0,编程时应该注意。 在数码管的段码连接上,我用的是a、b、c、d、e、f、g、h所对应的管脚11、7、4、2、1、10、5、3分别接P1^0、P1^1、P1^2、P1^3、P1^4、P1^5、P1^6、
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved