标题: 基于单片机噪声报警系统源程序与Proteus仿真电路设计 [打印本页]

作者: smartpiggy    时间: 2021-3-31 14:40
标题: 基于单片机噪声报警系统源程序与Proteus仿真电路设计
该设计方案由硬件和软件两部分组成。噪声测量仪的硬件电路系统,包括噪声信号的转换、放大、交直流转换与电压、频率转换电路以及单片机系统的硬件电路、LED显示电路等。软件部分主要是用单片机语言编程,实现对信号的采集、转换及显示。对于不同型号的单片机只需要相应的改变一下地址即可。

仿真原理图如下,只是一个简单的模拟而已(proteus仿真工程文件可到本帖附件中下载)


电路原理图如下:




单片机源程序如下:
  1. <font face="宋体">#include <reg52.h>
  2. #include "LCD1602.h"
  3. unsigned char welcome[]={"welcome!"};
  4. unsigned char Show0[6]={"Noise:"};
  5. unsigned char Show1[5]={"dB"};
  6. /*unsigned int code Countnum[60]={ 11,  13,  15,  17,  19,  22,  24,  27,  31,  34,      //T0计数值
  7.                             39,  44,  49,  55,  62,  69,  78,  87,  98,  110,
  8.                             123, 138, 155, 174, 195, 219, 246, 276, 309, 347,
  9.                             390, 438, 491, 550, 618, 693, 778, 873, 979, 1099,
  10.                             1233,1383,1552,1742,1954,2193,2460,2760,3097,3475,
  11.                             3899,4375,4909,5508,6180,6934,7780,8729,9794,10989,};*/
  12. unsigned long code Countnum[100]={10,11,12,13,15,17,19,22,25,28,
  13.                                 31,35,39,43,48,54,60,67,75,84,
  14.                                 94,105,117,131,146,163,182,204,228,255,
  15.                                 286,320,359,402,451,506,567,636,713,799,
  16.                                 896,1005,1127,1264,1418,1590,1783,2000,2244,2517,
  17.                                 2824,3168,3556,3989,4475,5020,5632,6319,7089,7953,
  18.                                 8923,10011,11232,12602,14139,15863,17798,19969,22405,25138,
  19.                                 28204,31644,35504,39835,44694,50146,56263,63127,70828,79469,
  20.                                 89164,100042,112247,125941,141305,158544,177886,199588,223937,251257,
  21.                                 281910,316303,354891,398187,446765,501270,562424,631039,708025,794404,};



  22. unsigned char code dB[100][3]={"031","032","033","034","035","036","037","038","039","040",        //T0计数值对应 dB
  23.                               "041","042","043","044","045","046","047","048","049","050",
  24.                               "051","052","053","054","055","056","057","058","059","060",
  25.                               "061","062","063","064","065","066","067","068","069","070",
  26.                               "071","072","073","074","075","076","077","078","079","080",
  27.                               "081","082","083","084","085","086","087","088","089","090",
  28.                               "091","092","093","094","095","096","097","098","099","100",
  29.                               "101","102","103","104","105","106","107","108","109","110",
  30.                               "111","112","113","114","115","116","117","118","119","120",
  31.                               "121","122","123","124","125","126","127","128","129","130",
  32.                               };      

  33. sbit beep=P2^2;
  34. sbit key_1=P2^1;
  35. sbit key_2=P2^0;

  36. //////////////////////////////////////////////////////全局变量/////////////////////////////////////////////////////
  37. unsigned long count,c;
  38. uchar t,z;

  39. uchar shu,ys;

  40. //////////////////////////////////////////////////////函数声明////////////////////////////////////////////////////
  41.    


  42.     /************************************
  43.     延时子程序
  44.     延时时间(xms*1)ms
  45. *************************************/
  46. void delayms(uint xms)           //延时xms
  47. {
  48.     uint x,y;
  49.     for(x=xms;x>0;x--)
  50.         for(y=90;y>0;y--);
  51. }

  52. void key()
  53. {
  54.     if (key_1==0)
  55.     {
  56.         delayms(10);
  57.         if (key_1==0)
  58.         {
  59.             while(key_1==0);
  60.             if (shu<99) shu++;
  61.         }
  62.     }
  63.     if (key_2==0)
  64.     {
  65.         delayms(10);
  66.         if (key_2==0)
  67.         {
  68.             while(key_2==0);
  69.             if (shu>0) shu--;
  70.         }
  71.     }

  72. }

  73. void alarm()
  74. {
  75.     ys++;
  76.     if (ys>20)
  77.     {
  78.         ys=0;
  79.         beep=!beep;
  80.     }
  81. }

  82. //////////////////////////////////////////主函数///////////////////////////////////////////////////////////
  83. void main(void)
  84. {
  85.     uint m,n;
  86.     uint i;
  87.     delayms(1000);
  88.     TMOD=0X15;           //T0外部计数 工作方式1    T1定时方式1
  89.     EA=0;                 //开总中断
  90.     ET1=0;                 //关闭T1
  91.     TH0=0;
  92.     TL0=0;
  93.     TH1=(65536-50000)/256;       //裝初值
  94.     TL1=(65536-50000)%256;       //裝初值
  95.     init_1602();

  96.     WRITE_LCD1602_COM(0x80+3);    //    显示地址
  97.       for(i=0; i<6; i++)
  98.     {
  99.         WRITE_LCD1602_DAT(Show0[i]);
  100.         delayms(5);
  101.     }

  102.     WRITE_LCD1602_COM(0x80+12);           //    显示地址
  103.     for(i=0;i<2;i++)
  104.     {
  105.         WRITE_LCD1602_DAT(Show1[i]);
  106.         delayms(5);        
  107.     }
  108.     WRITE_LCD1602_COM(0xc0+3);           //    显示地址
  109.     WRITE_LCD1602_byte("Limit:");

  110.     WRITE_LCD1602_COM(0xc0+12);           //    显示地址
  111.     for(i=0;i<2;i++)
  112.     {
  113.         WRITE_LCD1602_DAT(Show1[i]);
  114.         delayms(5);        
  115.     }         
  116.     EA=1;
  117.     ET1=1;            //开T1
  118.     TR1=1;            //T1开始定时
  119.     TR0=1;            //T0开始计数
  120.     while(1)
  121.     {
  122.             key();
  123.             WRITE_LCD1602_COM(0xc0+9);
  124.               WRITE_LCD1602_DAT(0x30+(shu+31)/100%10);
  125.               WRITE_LCD1602_DAT(0x30+(shu+31)/10%10);
  126.               WRITE_LCD1602_DAT(0x30+(shu+31)%10);
  127.             i=0;
  128.             if(count==0)
  129.             continue;
  130.             while(count>Countnum[i])
  131.             {
  132.                 i++;
  133.             }
  134.             m=i;
  135.             i=0;
  136.             WRITE_LCD1602_COM(0x80+9);
  137.             for(n=0; n<3; n++)
  138.             {     
  139.                 WRITE_LCD1602_DAT(dB[m][n]);
  140.                 delayms(5);
  141.             }
  142.             WRITE_LCD1602_COM(0xc0+9);
  143.               WRITE_LCD1602_DAT(0x30+(shu+31)/100%10);
  144.               WRITE_LCD1602_DAT(0x30+(shu+31)/10%10);
  145.               WRITE_LCD1602_DAT(0x30+(shu+31)%10);
  146.             if(m>=shu)
  147.             {
  148.                 alarm();
  149.             }else
  150.             {
  151.                 beep=1;
  152.             }
  153.     }   
  154. }

  155. void Timer0() interrupt 1
  156. {
  157.     z++;
  158. }

  159. void Timer1() interrupt 3
  160. {
  161.     TR1=0;      //关闭T1定时
  162.     TH1=(65536-50000)/256;
  163.     TL1=(65536-50000)%256;
  164.     t++;
  165.         if(t==20)       //定时1s时间到
  166.         {
  167.             t=0;
  168.             TR0=0;        //T0停止计数
  169.             c=z*65535+(TH0*256+TL0);        // 将计数值读取
  170.             TH0=0;                        //清空计数值
  171.             TL0=0;                       //清空计数值
  172.             TR0=1;                           //T0开始计数
  173.             count=c;
  174.             c=0;
  175.             z=0;
  176.         }
  177.     TR1=1;        //T1开始定时                                    

  178. }



  179. </font>
复制代码
全部资料51hei下载地址:
10仿真.rar (98.4 KB, 下载次数: 50)
噪声计原理图.pdf (87.99 KB, 下载次数: 38)
1程序.rar (30.97 KB, 下载次数: 31)


作者: 炸裂    时间: 2021-4-12 21:54
你好,我想问一下,你的这个设计可以测量声音的分贝值吗?




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1