找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STC12C5A60S2单片机烟雾报警系统的设计

[复制链接]
ID:729211 发表于 2020-4-14 19:34 | 显示全部楼层 |阅读模式
      这是前几天做的一个基于51单片机的一个烟雾报警系统,采用有ADC功能的STC12C5A60S2单片机,通过MQ-2烟雾模块检测,温度传感器DS18B20检测温度,通过LCD12864实时显示浓度和温度,可以调节浓度值,并且有声光报警功能。附件中是原理图以及ADC采集电压源码。

单片机源程序如下:
  1. //****************************************STC12C5A60S2 AD转换***********************************************//
  2. #include <reg60.h>
  3. #include <intrins.h>                                   //包含_nop_()函数定义的头文件
  4. #include <stdio.h>

  5. //------------------------------------------------------------------------------
  6. void AD_init();
  7. void serial_init();
  8. void delay(unsigned int a);
  9. float AD_work(unsigned char channel);
  10. unsigned int AD_get(unsigned char channel);
  11. //------------------------------------------------------------------------------
  12. void main()
  13. {
  14. AD_init();    //A/D转换初始化
  15. serial_init();   //串口初始化
  16. while(1)
  17. {
  18. //   unsigned char i;
  19. //   for(i=0;i<8;i++) //循环发送P1.0-P1.7的转换数值
  20. //   {
  21. //    TI=1;    //使用printf函数前须先将发送标志位TI置1
  22. //    printf("The P1.%bd voltage is %f\n",i,AD_work(i));
  23. //    TI=0;
  24. //    delay(1000); //延时约1s
  25. //   }
  26.       TI=1;    //使用printf函数前须先将发送标志位TI置1
  27.      printf("The P1.%bd voltage is %f\n",7,AD_work(7));
  28.      TI=0;
  29.     delay(1000); //延时约1s

  30. }
  31. }
  32. //------------------------------------------------------------------------------
  33. unsigned int AD_get(unsigned char channel)
  34. {
  35. ADC_CONTR=0x88|channel;    //开启AD转换1000 1000 即POWER SPEED1 SPEED0 ADC_FLAG   ADC_START CHS2 CHS1 CHS0
  36. _nop_(); _nop_(); _nop_(); _nop_();//要经过4个CPU时钟的延时,其值才能够保证被设置进ADC_CONTR 寄存器
  37. while(!(ADC_CONTR&0x10));    //等待转换完成
  38. ADC_CONTR&=0xe7;      //关闭AD转换,ADC_FLAG位由软件清0
  39. return(ADC_RES*4+ADC_RESL);   //返回AD转换完成的10位数据(16进制)
  40. }
  41. //------------------------------------------------------------------------------
  42. float AD_work(unsigned char channel)
  43. {
  44. float AD_val;     //定义处理后的数值AD_val为浮点数
  45. unsigned char i;
  46. for(i=0;i<100;i++)
  47. AD_val+=AD_get(channel); //转换100次求平均值(提高精度)
  48. AD_val/=100;
  49. AD_val=(AD_val*5)/1024; //AD的参考电压是单片机上的5v,所以乘5即为实际电压值
  50. return AD_val;
  51. }
  52. //------------------------------------------------------------------------------
  53. void delay(unsigned int a) //延时约1ms
  54. {
  55. unsigned int i;
  56. while (--a!=0)
  57. for(i=600;i>0;i--);   //1T单片机i=600,若是12T单片机i=125
  58. }
  59. //------------------------------------------------------------------------------
  60. void serial_init()
  61. {
  62. TMOD=0x20;
  63. TH1=0xfd;
  64. TL1=0xfd; //设置9600波特率
  65. SCON=0x50; //串口方式1,允许接收
  66. TR1=1;
  67. }
  68. //------------------------------------------------------------------------------
  69. void AD_init()
  70. {
  71. P1ASF=0xcf; //P1口全部作为模拟功能AD使用
  72. ADC_RES=0;   //清零转换结果寄存器高8位
  73. ADC_RESL=0; //清零转换结果寄存器低2位
  74. ADC_CONTR=0x80;//开启AD电源
  75. delay(2);   //等待1ms,让AD电源稳定
  76. }
  77. /*程序编写:落叶
  78. 2010.11.03*/
复制代码

所有资料51hei提供下载:
BS.pdf (366.43 KB, 下载次数: 38)
ADC源码.rar (37.21 KB, 下载次数: 34)


回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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