找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1751|回复: 0
收起左侧

单片机门铃程序Proteus仿真图 带音量调节,带光照检测 可以判断是否天黑亮灯

[复制链接]
ID:197152 发表于 2022-3-4 15:45 | 显示全部楼层 |阅读模式
使用51单片机,带音量调节,带光照检测。可以判断是否天黑亮灯,等白天后灯自动熄灭,也可以手动熄灭,能够选择铃声,共四首,带指示灯。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei.gif 51hei图片20220304154420.png

单片机源程序如下:
  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int


  4. sbit BeepIO = P3^2; //定义音频输出管脚
  5. sbit LED1=P2^0;
  6. sbit LED2=P2^1;
  7. sbit LED3=P2^2;
  8. sbit LED4=P2^3;
  9. sbit KEY1 = P1^1;
  10. sbit KEY2 = P1^2;
  11. sbit KEY8 = P1^0; //按键8 音乐切换
  12. sbit GM=P1^3;
  13. sbit LED_L=P3^7;
  14. uchar music=1;
  15. uchar n=0;
  16. uchar n1=0;
  17. uchar n2=0;
  18. uchar n3=0;
  19. uchar key=0;
  20. char temp1,temp2; //存放初值的中间变量
  21. int flag_clock=0;
  22. uchar code music_dat[][2]= //校歌《蔚蓝之歌》音乐数据
  23. {
  24. 3,4, 3,4, 2,4, 1,4, //第一节
  25. 2,6, 2,2, 1,4, 8,6, //第二节
  26. 0,4, 9,2, 10,2, 1,4, 2,4, //第三节
  27. 3,4, 3,2, 2,4, 1,4, 5,16, //第四节
  28. 6,6, 6,2, 5,4, 3,4, 2,2, 2,2, 1,4, 10,4, 9,6, //第五节
  29. 0,2, 8,2, 9,2, 1,2, 9,4, 3,4, //第六节
  30. 2,6, 2,2, 2,4, 1,4, 8,16, //第七节
  31. 0XFF //结束
  32. };

  33. uchar code music_dat1[][2]= //小苹果
  34. {
  35. 1,2, 1,2, 2,4, 1,4, 4,4, 3,8, //第一节
  36. 1,2, 1,2, 2,4, 1,4, 5,4, 4,8, //第二节
  37. 1,2, 1,2, 8,4, 6,4, 4,4, 3,4, 2,4, //第三节
  38. 7,2, 7,2, 6,4, 4,4, 5,4, 4,8, //第四节
  39. 0XFF //结束
  40. };

  41. uchar code music_dat2[][2]= //铃儿响叮当音乐数据
  42. {
  43. 6,2, 6,2, 6,4, 6,2, 6,2, 6,4, //第一节
  44. 6,2, 8,2, 4,3, 5,1, 6,8, //第二节
  45. 7,2, 7,2, 7,3, 7,1, 7,2, 6,2, 6,2, 6,1, 6,1, //第三节
  46. 6,2, 5,2, 5,2, 4,2, 5,4, 8,4, //第四节
  47. 6,2, 6,2, 6,4, 6,2, 6,2, 6,4, //第五节
  48. 6,2, 8,2, 4,3, 5,1, 6,8, //第六节
  49. 7,2, 7,2, 7,3, 7,1, 7,2, 6,2, 6,2, 6,1, 6,1, //第七节
  50. 8,2, 8,2, 7,2, 5,2, 4,6, //第八节
  51. 0XFF //结束
  52. };

  53. uchar code music_dat3[][2]= //音乐数据
  54. {
  55. 6,4,4,4,5,4,2,4,6,2,5,2,4,2,5,2,2,4,6,4,4,4,5,4,5,2,5,2,8,2,6,2,3,4,4,4,4,1,3,1,
  56. 2,4,3,2,4,2,5,4,1,4,9,2,8,2,6,4,6,4,5,2,4,4,5,2,6,2,5,4,1,4,2,4,2,1,4,1,2,4,
  57. 0XFF //结束
  58. };

  59. uint code table[]={ //数组存放的数据是各个音调的初始值
  60. 0Xfc,0X8e,0Xfc,0Xed,0Xfd,0X43,0Xfd,0X6a,0Xfd,0Xb3,0Xfd,0Xf3,0Xfe,0X2d,0Xfb,0X00,0Xfb,0X8c,0Xfc,0X0e};
  61. unsigned int code table1[12]={ //这个数组里存放的是1-7的音调的初始值
  62. 0xfc5b,0xfc8e,0xfced,0xfd43,0xfd6a,0xfdb3,0xfdf3,0xfe2d,0xfb00,0xfb8c,0xfcc0e,0xfb68
  63. };

  64. void delay100ms(unsigned char z)
  65. {
  66. unsigned int i;
  67. z++;
  68. while(--z)
  69. {
  70. for(i=11502;i;i--);
  71. }
  72. }

  73. void delay(uint z)
  74. {
  75. uint x,y;
  76. for(x=z;x>0;x--)
  77. for(y=110;y>0;y--);
  78. }

  79. void key_scan()
  80. {
  81. if(KEY8 == 0)
  82. {delay(5);
  83. if(KEY8 == 0)
  84. {
  85. music++;
  86. flag_clock=0;       
  87. if(music == 5)
  88. {
  89. music = 1;
  90. }       
  91. while(!KEY8);
  92. }
  93. }
  94. TR0=0; //计时器停止,也就是停止放音
  95. }

  96. void systimer0_init(void)
  97. {
  98. TMOD |=0x01;//设置为1时用或(|)
  99. TMOD &=0xfd;//设置为0时用与(&)
  100. EA = 1;
  101. ET0 = 1;
  102. TR0 = 1;
  103. }

  104. void key_sw()
  105. {
  106. if(KEY1==0)
  107. {
  108.   flag_clock=1;
  109. }
  110. }

  111. int flag_led=0;
  112. void light()
  113. {
  114. if(GM!=0)
  115. {
  116.   if(KEY2==0)
  117.         {
  118.          flag_led++;
  119.          if(flag_led==2) flag_led=0;
  120.    while(KEY2==0);               
  121.         }
  122.   if(flag_led==1||flag_clock==1)  {LED_L=0;}
  123.         if(flag_led==0&&flag_clock==0)  LED_L=1;
  124. }
  125. if(GM==0)
  126. {
  127.   LED_L=1;flag_led=0;
  128. }
  129. }
  130. void main()
  131. {
  132. BeepIO=0;
  133. LED_L=1;
  134. systimer0_init();
  135. while(1)
  136. {       

  137. key_sw();
  138. BeepIO=1;
  139. key_scan();
  140. if(music > 0)
  141. {light();
  142. light();
  143. key_sw();
  144. key_scan();
  145. if(music == 4) //判断按键是否按下
  146. {
  147. LED1=1;LED2=1;LED3=1;LED4=0;

  148. key_sw();
  149. key_scan();
  150. if(flag_clock==1)
  151. {       
  152. light();
  153. TH0=table1[music_dat1[n1][0]]/256; //赋初值
  154. TL0=table1[music_dat1[n1][0]]%256;
  155. TR0=1; //音乐开始
  156. delay100ms(music_dat1[n1][1]); //调用延时,用做节拍的发生
  157. n1++; //下个音调开始
  158. if(music_dat1[n1][0]==0xff)
  159. {
  160. n1=0; //判断是否到最后一个音调
  161. TR0=0; //一个调放完,即将进行下一个调
  162. flag_clock=0;
  163. }
  164. }
  165. }

  166. if(music == 3) //判断按键是否按下
  167. {
  168. LED1=1;LED2=1;LED3=0;LED4=1;

  169. key_scan();
  170. key_sw();
  171. if(flag_clock==1)
  172. {light();
  173. TH0=table1[music_dat2[n2][0]]/256; //赋初值
  174. TL0=table1[music_dat2[n2][0]]%256;
  175. TR0=1; //音乐开始
  176. delay100ms(music_dat2[n2][1]); //调用延时,用做节拍的发生
  177. n2++; //下个音调开始
  178. if(music_dat2[n2][0]==0xff)
  179. {
  180. n2=0; //判断是否到最后一个音调
  181. TR0=0; //一个调放完,即将进行下一个调
  182. flag_clock=0;

  183. }
  184. }
  185. }

  186. if(music == 1) //判断按键是否按下
  187. {
  188. LED1=0;LED2=1;LED3=1;LED4=1;

  189. key_scan();
  190. key_sw();
  191. while(flag_clock==1)
  192. {light();
  193. TH0=table1[music_dat[n][0]]/256; //赋初值
  194. TL0=table1[music_dat[n][0]]%256;
  195. TR0=1; //音乐开始
  196. delay100ms(music_dat[n][1]); //调用延时,用做节拍的发生
  197. n++; //下个音调开始
  198. if(music_dat[n][0]==0xff)
  199. {
  200. n=0; //判断是否到最后一个音调
  201. TR0=0; //一个调放完,即将进行下一个调
  202. flag_clock=0;

  203. }
  204. }
  205. }

  206. if(music == 2) //判断按键是否按下
  207. {LED1=1;LED2=0;LED3=1;LED4=1;

  208. key_scan();
  209. key_sw();
  210. if(flag_clock==1)
  211. {light();
  212. TH0=table1[music_dat3[n3][0]]/256; //赋初值
  213. TL0=table1[music_dat3[n3][0]]%256;
  214. TR0=1; //音乐开始
  215. delay100ms(music_dat3[n3][1]); //调用延时,用做节拍的发生
  216. n3++; //下个音调开始
  217. if(music_dat3[n3][0]==0xff)
  218. {
  219. n3=0; //判断是否到最后一个音调
  220. TR0=0; //一个调放完,即将进行下一个调
  221. flag_clock=0;

  222. }
  223. }
  224. }

  225. }
  226. }
  227. }
  228. void time0() interrupt 1
  229. {

  230. if(music == 1)
  231. {
  232. TH0=table1[music_dat[n][0]]/256; //赋初值
  233. TL0=table1[music_dat[n][0]]%256;
  234. }
  235. else if(music == 4)
  236. {
  237. TH0=table1[music_dat1[n1][0]]/256; //赋初值
  238. TL0=table1[music_dat1[n1][0]]%256;
  239. }
  240. else if(music == 3)
  241. {
  242. TH0=table1[music_dat2[n2][0]]/256; //赋初值
  243. TL0=table1[music_dat2[n2][0]]%256;
  244. }
  245. else if(music == 2)
  246. {
  247. TH0=table1[music_dat3[n3][0]]/256; //赋初值
  248. TL0=table1[music_dat3[n3][0]]%256;
  249. }
  250. else
  251. {
  252. TH0=temp1;
  253. TL0=temp2;
  254. }
  255. BeepIO=~BeepIO; //不断取反得到相应的音调
  256. }
复制代码

所有资料51hei附件下载:
仿真代码.7z (120.07 KB, 下载次数: 38)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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