找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 12408|回復(fù): 7
收起左側(cè)

STC12C5604AD電壓報警檢測模塊原理圖與單片機源程序

  [復(fù)制鏈接]
ID:284341 發(fā)表于 2018-3-2 11:35 | 顯示全部樓層 |閱讀模式
電壓檢測模塊

電路原理圖:
0.png
【簡要說明】
  • 尺寸:88mmX45mmX高15mm
    二、主要芯片:STC12C5604AD
    三、工作電壓:直流12V
  • 特點:
    1、檢測模擬量電壓范圍0~10V量程可根據(jù)客戶的需要拓寬
    2、數(shù)碼管顯示范圍0~9.999
    3、四位數(shù)碼管顯示
    4、輸入輸出接線簡單
    5、AD轉(zhuǎn)換頻率125K,10位數(shù)據(jù)轉(zhuǎn)換
    7、可設(shè)定高低壓報警值。高于(低于)某個電壓報警
  • 作用:將輸入的模擬信號(電壓或者電流)量轉(zhuǎn)換成為0~5000的數(shù)字量,由數(shù)碼管顯示出來可設(shè)置高低電壓報警、
適用場合:單片機學(xué)習(xí)、電子競賽、產(chǎn)品開發(fā)、工業(yè)控制、畢業(yè)設(shè)計。。。

【圖片展示】
接線時候供電的+接+12v,供電的負(fù)就接-12v,要檢測的電壓信號就信號的輸入,電壓的正極接+,負(fù)極接-。
設(shè)置說明:KEY1鍵按下進入設(shè)置模式,此時可以按KEY2和KEY3分別加減數(shù)字,這個數(shù)值是我們電壓報警的上限值。在檢測的電壓值高于這個值后繼電器就會吸和。(當(dāng)然也可以是低于這個值繼電器吸和?梢酝ㄟ^編程改變需要的功能。)再次按KEY1鍵回到待機模式,此時數(shù)碼管上顯示的就是我們的信號的電壓值。
PCB尺寸圖
圖片展示
效果展示


單片機源程序如下:
  1. /********************************************************************
  2.                             匯誠科技實現(xiàn)功能:檢測電流,數(shù)碼管顯示電流值
  3. 使用芯片:STC12C5604AD
  4. 產(chǎn)品模塊編號:兩輸入,一路電壓檢測,三個按鍵,四位數(shù)顯,一路繼電器
  5. 晶振:外部晶振 11.0592M
  6. 編譯環(huán)境:Keil -uvision4
  7. 【聲明】此程序僅用于學(xué)習(xí)與參考,引用請注明版權(quán)和作者信息!     
  8. /********************************************************************
  9. ********************************************************************/
  10. #include "main.h"
  11. #include<math.h>
  12. #define uchar unsigned char//宏定義無符號字符型
  13. #define uint unsigned int  //宏定義無符號整型
  14. #define FOSC 11059200L
  15. #define BAUD  9600

  16. #define ADC_POWER   0x80            //ADC 電源控制位
  17. #define ADC_FLAG    0x10            //ADC 轉(zhuǎn)換結(jié)束標(biāo)志位
  18. #define ADC_START   0x08            //ADC 開始轉(zhuǎn)換控制位
  19. #define ADC_SPEEDHH 0x60            //270個時鐘周期轉(zhuǎn)換一次

  20. sfr ADC_DATA=0xc6;           //70個時鐘周期轉(zhuǎn)換一次

  21. #define DUAN P2                   //P0口控制段
  22. #define WEI  P1                   //P2口控制位
  23. /********************************************************************
  24.                             初始定義
  25. *********************************************************************/
  26. //數(shù)碼管顯示段碼
  27. code uchar seg7code[11]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0XBF};
  28. uint cnt;
  29. uint16 idata setvol_H;
  30. uint volt;
  31. uint dis;
  32. uchar flag = 1;

  33. uchar start_delay;
  34. // 串行中斷程序
  35. void initInt(void)
  36. {
  37.         TMOD = 0x01;
  38.         PCON = 0;
  39.         TH0 =(655336-1000)/256;
  40.     TL0 =(655336-1000)%256;
  41.         TR0 = 1;               
  42.     ET0 = 1;
  43.         EA = 1;               
  44. }
  45. //初始化
  46. //初始化
  47. void initProg(void)
  48. {       
  49.     P2M1=0;
  50.         P2M0=0xff;
  51.         P1M1=0xf0;
  52.         P1M0=0xff;
  53.         P3M1&=0x7f;
  54.         P3M0|=0x80;
  55.         initInt(); //初始化定時器
  56. }
  57. /********************************************************************
  58.                             延時函數(shù)
  59. *********************************************************************/
  60. void delay(uint x)//延時程序 0.1秒
  61. {
  62.         uint m,n,s;
  63.         for(m=x;m>0;m--)
  64.         for(n=20;n>0;n--)
  65.         for(s=248;s>0;s--);
  66. }
  67. /********************************************************************
  68.                          AD轉(zhuǎn)換初始化程序
  69. *********************************************************************/
  70. void InitADC()
  71. {
  72.         P1M0|=0xf0;
  73.         //P1M1=0xf0;
  74.         ADC_RES=0;        //AD數(shù)據(jù)寄存器清空
  75.     ADC_CONTR=ADC_POWER | ADC_SPEEDHH | ADC_START;//打開AD電源,轉(zhuǎn)換周期XX
  76.     delay(10);                //延時
  77.         //采集7通道的
  78. }

  79. /********************************************************************
  80.                          AD轉(zhuǎn)換控制程序
  81. *********************************************************************/
  82. uint GetADCResult(uchar px)          //轉(zhuǎn)換輸出的數(shù)據(jù) (PX為通道口)
  83. {
  84.     uint t;
  85.         ADC_CONTR=ADC_POWER | ADC_SPEEDHH | px | ADC_START;//開始轉(zhuǎn)換
  86.     _nop_();                        //延時一個機器周期
  87.     _nop_();                                                //延時一個機器周期
  88.     _nop_();                                                //延時一個機器周期
  89.     _nop_();                                                //延時一個機器周期
  90.         _nop_();                        //延時一個機器周期
  91.         _nop_();                                                //延時一個機器周期
  92.     _nop_();                                                //延時一個機器周期
  93.         _nop_();
  94.         while (!(ADC_CONTR & ADC_FLAG));//等待轉(zhuǎn)換結(jié)束
  95.         ADC_CONTR &= ~ADC_FLAG;       //關(guān)閉AD轉(zhuǎn)換
  96.          t=ADC_RES;
  97.          return t;
  98. }                  
  99. /********************************************************************
  100.                             按鍵掃描
  101. *********************************************************************/
  102. void key_scan(void)
  103. {
  104.   if(key1==0) //功能按鍵,顯示調(diào)整和實測值
  105.   {
  106.       delay(2);
  107.           if(key1==0)
  108.           {
  109.                  while(!key1);
  110.                  switch(flag)
  111.                  {
  112.                          case 1:         //進去設(shè)置模式
  113.                         flag = 2;
  114.                         break;
  115.                         case 2:          //每次設(shè)置后保存設(shè)置的值
  116.                         flag = 1;
  117.                         IapEraseSector(0);
  118.                         IapProgramByte(0,(setvol_H&0xff));
  119.                         IapProgramByte(1,(setvol_H>>8));
  120.                         break;
  121.                  }
  122.           }
  123.          
  124.   }
  125.   if(flag!=1)
  126.   {  
  127.           if(key3==0) //增加設(shè)定電流值
  128.           {
  129.              delay(5);
  130.                  if(key3 ==0)
  131.              {
  132.                   switch(flag)
  133.                          {
  134.                          case 1:
  135.                          break;
  136.                          case 2:
  137.                          setvol_H = setvol_H - 10;
  138.                          if(setvol_H<=10)
  139.                          {
  140.                                   setvol_H = 10;
  141.                          }
  142.                          break;
  143.                          }
  144.                  }
  145.                
  146.           }
  147.           if(key2 ==0)
  148.           {
  149.                    delay(5);
  150.                  if(key2 ==0)
  151.                    {
  152.                          switch(flag)
  153.                          {
  154.                          case 1:
  155.                          
  156.                          break;
  157.                          case 2:
  158.                          setvol_H = setvol_H + 10;
  159.                          if(setvol_H>=5000)
  160.                          {
  161.                                   setvol_H = 5000;
  162.                          }
  163.                          break;
  164.                          
  165.                          }
  166.                  }
  167.           }
  168.    }
  169. }
  170. /********************************************************************
  171.                             主函數(shù)
  172. *********************************************************************/
  173. void main()
  174. {       
  175.     long ad,ad1,temp;
  176.     uchar cnt1;
  177.         delay(30);
  178.         setvol_H  = (IapReadByte(1)<<8)+IapReadByte(0);//初始化報警值
  179.         initProg();//初始化
  180.     InitADC();  //AD初始化
  181.        
  182.         while(1)
  183.         {           
  184.           ad  =ad1=0;
  185.           while(++cnt1<254)
  186.           {
  187.           ad = ad+ GetADCResult(6);//2.5v基準(zhǔn)
  188.           ad1 =ad1+ GetADCResult(7);
  189.           }
  190.           ad1 = ad1/254;
  191.           ad = ad/254;
  192.           temp = (ad1*2.5/ad)*300;        //轉(zhuǎn)換求測量值
  193.           cnt1 = 0;
  194.           volt = (uint)temp + 50;
  195.            switch(flag)        //顯示測量值
  196.            {
  197.                      case 1:
  198.                   dis = volt;
  199.                   break;
  200.                   case 2:
  201.                   dis = setvol_H; //設(shè)置高壓
  202.                   break;
  203.            }
  204.            key_scan();//按鍵掃描
  205.            if((volt<setvol_H))        //報警
  206.            {
  207.                    OUT = 0;
  208.                 start_delay = 1;
  209.            }
  210.         }
  211. }
  212. /********************************************************************
  213.                            定時器T0中斷函數(shù)
  214. *********************************************************************/
  215. void timer0(void)interrupt 1  
  216. {          
  217.          static uint cnt2,cnt3;
  218.          TH0=(65536-1000)/256;
  219.          TL0=(65536-1000)%256;
  220.          cnt++;
  221.          if(cnt>4)
  222.          {
  223.             cnt=1;       
  224.          }
  225. ……………………

  226. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

0.png 0.png

所有資料51hei提供下載:
電壓檢測模塊.rar (9.5 MB, 下載次數(shù): 197)


評分

參與人數(shù) 1黑幣 +8 收起 理由
wdfabc + 8 很給力!

查看全部評分

回復(fù)

使用道具 舉報

ID:140183 發(fā)表于 2018-8-19 09:39 | 顯示全部樓層
太好啦。謝謝分享!。。。
回復(fù)

使用道具 舉報

ID:370354 發(fā)表于 2018-10-23 21:59 | 顯示全部樓層
很有參考價值,謝謝分享
回復(fù)

使用道具 舉報

ID:422781 發(fā)表于 2018-11-8 09:47 | 顯示全部樓層
網(wǎng)上帶這款單片機的半成品很便宜,不知是否能利用下,下載參考下,可惜積分不夠。
回復(fù)

使用道具 舉報

ID:511625 發(fā)表于 2019-4-14 02:49 | 顯示全部樓層
謝謝樓主,這個我找了好久
回復(fù)

使用道具 舉報

ID:467275 發(fā)表于 2019-4-24 15:40 | 顯示全部樓層
太好啦。謝謝分享。。。!
回復(fù)

使用道具 舉報

ID:88256 發(fā)表于 2020-8-13 01:19 | 顯示全部樓層
這個介紹得很詳細(xì),下載一個學(xué)習(xí)看看,謝謝了!
回復(fù)

使用道具 舉報

ID:8222 發(fā)表于 2020-8-13 17:23 | 顯示全部樓層
謝謝分享。下載學(xué)習(xí)。
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表