欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: STC12C5604AD電壓報警檢測模塊原理圖與單片機源程序 [打印本頁]

作者: 電子愛好者999    時間: 2018-3-2 11:35
標題: STC12C5604AD電壓報警檢測模塊原理圖與單片機源程序
電壓檢測模塊

電路原理圖:
【簡要說明】
適用場合:單片機學習、電子競賽、產品開發、工業控制、畢業設計。。。

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


單片機源程序如下:
  1. /********************************************************************
  2.                             匯誠科技實現功能:檢測電流,數碼管顯示電流值
  3. 使用芯片:STC12C5604AD
  4. 產品模塊編號:兩輸入,一路電壓檢測,三個按鍵,四位數顯,一路繼電器
  5. 晶振:外部晶振 11.0592M
  6. 編譯環境:Keil -uvision4
  7. 【聲明】此程序僅用于學習與參考,引用請注明版權和作者信息!     
  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 轉換結束標志位
  18. #define ADC_START   0x08            //ADC 開始轉換控制位
  19. #define ADC_SPEEDHH 0x60            //270個時鐘周期轉換一次

  20. sfr ADC_DATA=0xc6;           //70個時鐘周期轉換一次

  21. #define DUAN P2                   //P0口控制段
  22. #define WEI  P1                   //P2口控制位
  23. /********************************************************************
  24.                             初始定義
  25. *********************************************************************/
  26. //數碼管顯示段碼
  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.                             延時函數
  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轉換初始化程序
  69. *********************************************************************/
  70. void InitADC()
  71. {
  72.         P1M0|=0xf0;
  73.         //P1M1=0xf0;
  74.         ADC_RES=0;        //AD數據寄存器清空
  75.     ADC_CONTR=ADC_POWER | ADC_SPEEDHH | ADC_START;//打開AD電源,轉換周期XX
  76.     delay(10);                //延時
  77.         //采集7通道的
  78. }

  79. /********************************************************************
  80.                          AD轉換控制程序
  81. *********************************************************************/
  82. uint GetADCResult(uchar px)          //轉換輸出的數據 (PX為通道口)
  83. {
  84.     uint t;
  85.         ADC_CONTR=ADC_POWER | ADC_SPEEDHH | px | ADC_START;//開始轉換
  86.     _nop_();                        //延時一個機器周期
  87.     _nop_();                                                //延時一個機器周期
  88.     _nop_();                                                //延時一個機器周期
  89.     _nop_();                                                //延時一個機器周期
  90.         _nop_();                        //延時一個機器周期
  91.         _nop_();                                                //延時一個機器周期
  92.     _nop_();                                                //延時一個機器周期
  93.         _nop_();
  94.         while (!(ADC_CONTR & ADC_FLAG));//等待轉換結束
  95.         ADC_CONTR &= ~ADC_FLAG;       //關閉AD轉換
  96.          t=ADC_RES;
  97.          return t;
  98. }                  
  99. /********************************************************************
  100.                             按鍵掃描
  101. *********************************************************************/
  102. void key_scan(void)
  103. {
  104.   if(key1==0) //功能按鍵,顯示調整和實測值
  105.   {
  106.       delay(2);
  107.           if(key1==0)
  108.           {
  109.                  while(!key1);
  110.                  switch(flag)
  111.                  {
  112.                          case 1:         //進去設置模式
  113.                         flag = 2;
  114.                         break;
  115.                         case 2:          //每次設置后保存設置的值
  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) //增加設定電流值
  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.                             主函數
  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基準
  188.           ad1 =ad1+ GetADCResult(7);
  189.           }
  190.           ad1 = ad1/254;
  191.           ad = ad/254;
  192.           temp = (ad1*2.5/ad)*300;        //轉換求測量值
  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; //設置高壓
  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中斷函數
  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黑下載附件…………
復制代碼



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



作者: qxdqx    時間: 2018-8-19 09:39
太好啦。謝謝分享!!!!!
作者: 活力無極限1944    時間: 2018-10-23 21:59
很有參考價值,謝謝分享
作者: learningone    時間: 2018-11-8 09:47
網上帶這款單片機的半成品很便宜,不知是否能利用下,下載參考下,可惜積分不夠。
作者: 1906553493    時間: 2019-4-14 02:49
謝謝樓主,這個我找了好久
作者: 艱難018jin    時間: 2019-4-24 15:40
太好啦。謝謝分享!!!!!
作者: hhdsdy    時間: 2020-8-13 01:19
這個介紹得很詳細,下載一個學習看看,謝謝了!
作者: 溫xyz    時間: 2020-8-13 17:23
謝謝分享。下載學習。




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1