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

【圖片展示】 接線時候供電的+接+12v,供電的負就接-12v,要檢測的電壓信號就信號的輸入,電壓的正極接+,負極接-。 設置說明:KEY1鍵按下進入設置模式,此時可以按KEY2和KEY3分別加減數字,這個數值是我們電壓報警的上限值。在檢測的電壓值高于這個值后繼電器就會吸和。(當然也可以是低于這個值繼電器吸和。可以通過編程改變需要的功能。)再次按KEY1鍵回到待機模式,此時數碼管上顯示的就是我們的信號的電壓值。 【PCB尺寸圖】 【圖片展示】 【效果展示】  
單片機源程序如下:
- /********************************************************************
- 匯誠科技實現功能:檢測電流,數碼管顯示電流值
- 使用芯片:STC12C5604AD
- 產品模塊編號:兩輸入,一路電壓檢測,三個按鍵,四位數顯,一路繼電器
- 晶振:外部晶振 11.0592M
- 編譯環境:Keil -uvision4
- 【聲明】此程序僅用于學習與參考,引用請注明版權和作者信息!
- /********************************************************************
- ********************************************************************/
- #include "main.h"
- #include<math.h>
- #define uchar unsigned char//宏定義無符號字符型
- #define uint unsigned int //宏定義無符號整型
- #define FOSC 11059200L
- #define BAUD 9600
- #define ADC_POWER 0x80 //ADC 電源控制位
- #define ADC_FLAG 0x10 //ADC 轉換結束標志位
- #define ADC_START 0x08 //ADC 開始轉換控制位
- #define ADC_SPEEDHH 0x60 //270個時鐘周期轉換一次
- sfr ADC_DATA=0xc6; //70個時鐘周期轉換一次
- #define DUAN P2 //P0口控制段
- #define WEI P1 //P2口控制位
- /********************************************************************
- 初始定義
- *********************************************************************/
- //數碼管顯示段碼
- code uchar seg7code[11]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0XBF};
- uint cnt;
- uint16 idata setvol_H;
- uint volt;
- uint dis;
- uchar flag = 1;
- uchar start_delay;
- // 串行中斷程序
- void initInt(void)
- {
- TMOD = 0x01;
- PCON = 0;
- TH0 =(655336-1000)/256;
- TL0 =(655336-1000)%256;
- TR0 = 1;
- ET0 = 1;
- EA = 1;
- }
- //初始化
- //初始化
- void initProg(void)
- {
- P2M1=0;
- P2M0=0xff;
- P1M1=0xf0;
- P1M0=0xff;
- P3M1&=0x7f;
- P3M0|=0x80;
- initInt(); //初始化定時器
- }
- /********************************************************************
- 延時函數
- *********************************************************************/
- void delay(uint x)//延時程序 0.1秒
- {
- uint m,n,s;
- for(m=x;m>0;m--)
- for(n=20;n>0;n--)
- for(s=248;s>0;s--);
- }
- /********************************************************************
- AD轉換初始化程序
- *********************************************************************/
- void InitADC()
- {
- P1M0|=0xf0;
- //P1M1=0xf0;
- ADC_RES=0; //AD數據寄存器清空
- ADC_CONTR=ADC_POWER | ADC_SPEEDHH | ADC_START;//打開AD電源,轉換周期XX
- delay(10); //延時
- //采集7通道的
- }
- /********************************************************************
- AD轉換控制程序
- *********************************************************************/
- uint GetADCResult(uchar px) //轉換輸出的數據 (PX為通道口)
- {
- uint t;
- ADC_CONTR=ADC_POWER | ADC_SPEEDHH | px | ADC_START;//開始轉換
- _nop_(); //延時一個機器周期
- _nop_(); //延時一個機器周期
- _nop_(); //延時一個機器周期
- _nop_(); //延時一個機器周期
- _nop_(); //延時一個機器周期
- _nop_(); //延時一個機器周期
- _nop_(); //延時一個機器周期
- _nop_();
- while (!(ADC_CONTR & ADC_FLAG));//等待轉換結束
- ADC_CONTR &= ~ADC_FLAG; //關閉AD轉換
- t=ADC_RES;
- return t;
- }
- /********************************************************************
- 按鍵掃描
- *********************************************************************/
- void key_scan(void)
- {
- if(key1==0) //功能按鍵,顯示調整和實測值
- {
- delay(2);
- if(key1==0)
- {
- while(!key1);
- switch(flag)
- {
- case 1: //進去設置模式
- flag = 2;
- break;
- case 2: //每次設置后保存設置的值
- flag = 1;
- IapEraseSector(0);
- IapProgramByte(0,(setvol_H&0xff));
- IapProgramByte(1,(setvol_H>>8));
- break;
- }
- }
-
- }
- if(flag!=1)
- {
- if(key3==0) //增加設定電流值
- {
- delay(5);
- if(key3 ==0)
- {
- switch(flag)
- {
- case 1:
- break;
- case 2:
- setvol_H = setvol_H - 10;
- if(setvol_H<=10)
- {
- setvol_H = 10;
- }
- break;
- }
- }
-
- }
- if(key2 ==0)
- {
- delay(5);
- if(key2 ==0)
- {
- switch(flag)
- {
- case 1:
-
- break;
- case 2:
- setvol_H = setvol_H + 10;
- if(setvol_H>=5000)
- {
- setvol_H = 5000;
- }
- break;
-
- }
- }
- }
- }
- }
- /********************************************************************
- 主函數
- *********************************************************************/
- void main()
- {
- long ad,ad1,temp;
- uchar cnt1;
- delay(30);
- setvol_H = (IapReadByte(1)<<8)+IapReadByte(0);//初始化報警值
- initProg();//初始化
- InitADC(); //AD初始化
-
- while(1)
- {
- ad =ad1=0;
- while(++cnt1<254)
- {
- ad = ad+ GetADCResult(6);//2.5v基準
- ad1 =ad1+ GetADCResult(7);
- }
- ad1 = ad1/254;
- ad = ad/254;
- temp = (ad1*2.5/ad)*300; //轉換求測量值
- cnt1 = 0;
- volt = (uint)temp + 50;
- switch(flag) //顯示測量值
- {
- case 1:
- dis = volt;
- break;
- case 2:
- dis = setvol_H; //設置高壓
- break;
- }
- key_scan();//按鍵掃描
- if((volt<setvol_H)) //報警
- {
- OUT = 0;
- start_delay = 1;
- }
- }
- }
- /********************************************************************
- 定時器T0中斷函數
- *********************************************************************/
- void timer0(void)interrupt 1
- {
- static uint cnt2,cnt3;
- TH0=(65536-1000)/256;
- TL0=(65536-1000)%256;
- cnt++;
- if(cnt>4)
- {
- cnt=1;
- }
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
電壓檢測模塊.rar
(9.5 MB, 下載次數: 197)
2018-3-2 11:32 上傳
點擊文件名下載附件
|