找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2746|回复: 1
收起左侧

基于单片机噪声报警系统源程序与Proteus仿真电路设计

[复制链接]
ID:898981 发表于 2021-3-31 14:40 | 显示全部楼层 |阅读模式
该设计方案由硬件和软件两部分组成。噪声测量仪的硬件电路系统,包括噪声信号的转换、放大、交直流转换与电压、频率转换电路以及单片机系统的硬件电路、LED显示电路等。软件部分主要是用单片机语言编程,实现对信号的采集、转换及显示。对于不同型号的单片机只需要相应的改变一下地址即可。

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

电路原理图如下:
R45~(1KOC2E3MJWC@$N1}NS.png

OR2HF~_$V`GG39~EW[H5}@P.png

单片机源程序如下:
  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, 下载次数: 48)

评分

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

查看全部评分

回复

使用道具 举报

ID:904699 发表于 2021-4-12 21:54 | 显示全部楼层
你好,我想问一下,你的这个设计可以测量声音的分贝值吗?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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