打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
基于单片机实现声光控灯电路 C

刚学单片机,第一个单片机程序,看到仿真成功还是非常激动的,功能很简单,就是高入低出,低入高出,有点类似非门,但搞了好长时间才弄出来。。。。。。详见注释

  1. #include<reg52.h>
  2. #define CRYSTAL_FREQ 12000000//晶振频率(Hz)
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define INTERRUPT_PERIOD 16//时钟配置1/16s
  6. sbit led=P1^0;//定义led为输出端
  7. sbit key=P0^0;//key输入端
  8. void delayms(uint xms)//延时作用的子函数
  9. {
  10. uint i,j;
  11. for(i=xms;i>0;i--)
  12. for(j=110;j>0;j--);
  13. }
  14. void Interrupt_Init()
  15. {
  16. TMOD = 0x01;
  17. TH0 = (65536 - CRYSTAL_FREQ / 12 / INTERRUPT_PERIOD) / 256;
  18. TL0 = (65536 - CRYSTAL_FREQ / 12 / INTERRUPT_PERIOD) % 256;
  19. ET0 = 1;
  20. TR0 = 1;
  21. EA = 1;
  22. }
  23. void main()
  24. {
  25. Interrupt_Init();//调用中断声明子函数
  26. while(1);
  27. }
  28. void power()
  29. {
  30. if(key==0) //检测输入端是否为低电平
  31. {
  32. delayms(10); //延时再次检测输入端是否为低电平
  33. if(key==0)
  34. {
  35. led=1; //如果再次确认输入端为低,控制输出高电平,灯亮
  36. }
  37. else
  38. led=0; //否则输出低电平,灯灭
  39. }
  40. else
  41. led=0;
  42. }
  43. void Timer0() interrupt 1
  44. {
  45. TH0 = (65536 - CRYSTAL_FREQ / 12 / INTERRUPT_PERIOD) / 256;
  46. TL0 = (65536 - CRYSTAL_FREQ / 12 / INTERRUPT_PERIOD) % 256;
  47. power(); //中断里调用检测函数
  48. }




后来又加了声控功能,需要的功能是,实现声控优先级比光控高以及灯亮之后的延时,详见注释

  1. #include<reg52.h>
  2. #define CRYSTAL_FREQ 12000000//晶振频率(Hz)
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define INTERRUPT_PERIOD 16//时钟配置1/16s
  6. sbit led=P1^0;//定义led为输出端
  7. sbit voicekey=P0^1; //声控输入端
  8. sbit key=P0^0;//光控输入端
  9. uchar flag=0;
  10. void delayms(uint xms)//延时作用的子函数
  11. {
  12. uint i,j;
  13. for(i=xms;i>0;i--)
  14. for(j=110;j>0;j--);
  15. }
  16. void Interrupt_Init()
  17. {
  18. TMOD = 0x01;
  19. TH0 = (65536 - CRYSTAL_FREQ / 12 / INTERRUPT_PERIOD) / 256;
  20. TL0 = (65536 - CRYSTAL_FREQ / 12 / INTERRUPT_PERIOD) % 256;
  21. ET0 = 1;
  22. TR0 = 1;
  23. EA = 1;
  24. }
  25. void main()
  26. {
  27. Interrupt_Init(); //调用中断声明子函数
  28. while(1);
  29. }
  30. void power()
  31. {
  32. if(key==0) //先检测光控输入端是否为低电平,因为光控输入端优先级比声控高
  33. {
  34. delayms(10); //延时再次检测光控输入端是否为低电平
  35. if(key==0)
  36. {
  37. if(voicekey==1) //如果检测声控入端为高 ,输出高电平,灯亮,
  38. {
  39. led=1;
  40. delayms(10000); //延时10秒
  41. }
  42. else
  43. led=0; //否则灯灭
  44. }
  45. else
  46. led=0;
  47. }
  48. else
  49. led=0;
  50. }
  51. void Timer0() interrupt 1
  52. {
  53. TH0 = (65536 - CRYSTAL_FREQ / 12 / INTERRUPT_PERIOD) / 256;
  54. TL0 = (65536 - CRYSTAL_FREQ / 12 / INTERRUPT_PERIOD) % 256;
  55. power(); //中断里调用检测函数
  56. }




本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
关于单片机中断详解
趣味DIY:自制人体红外、声、光控小夜灯
红外检测传感器的C语言,基于51单片机的红外反射式光电传感器测速机的简易设计...
DS18B20 测温程序完全解读
CD4011工作原理及引脚图,功能,参数,作用详解
IC应用入门——学会使用LM339四电压比较器
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服