找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 11628|回复: 7
收起左侧

STC12C5604AD电压报警检测模块原理图与单片机源程序

  [复制链接]
ID:284341 发表于 2018-3-2 11:35 | 显示全部楼层 |阅读模式
电压检测模块

电路原理图:
0.png
【简要说明】
  • 尺寸:88mmX45mmX高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尺寸图
图片展示
效果展示


单片机源程序如下:
  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黑下载附件…………
复制代码

0.png 0.png

所有资料51hei提供下载:
电压检测模块.rar (9.5 MB, 下载次数: 193)

评分

参与人数 1黑币 +8 收起 理由
wdfabc + 8 很给力!

查看全部评分

回复

使用道具 举报

ID:140183 发表于 2018-8-19 09:39 | 显示全部楼层
太好啦。谢谢分享!!!!!
回复

使用道具 举报

ID:370354 发表于 2018-10-23 21:59 | 显示全部楼层
很有参考价值,谢谢分享
回复

使用道具 举报

ID:422781 发表于 2018-11-8 09:47 | 显示全部楼层
网上带这款单片机的半成品很便宜,不知是否能利用下,下载参考下,可惜积分不够。
回复

使用道具 举报

ID:511625 发表于 2019-4-14 02:49 | 显示全部楼层
谢谢楼主,这个我找了好久
回复

使用道具 举报

ID:467275 发表于 2019-4-24 15:40 | 显示全部楼层
太好啦。谢谢分享!!!!!
回复

使用道具 举报

ID:88256 发表于 2020-8-13 01:19 | 显示全部楼层
这个介绍得很详细,下载一个学习看看,谢谢了!
回复

使用道具 举报

ID:8222 发表于 2020-8-13 17:23 | 显示全部楼层
谢谢分享。下载学习。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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