电压检测模块 
电路原理图:
【简要说明】 - 尺寸:长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)
|