标题: 单片机模拟量转开关量传感器模块原理图与源码等资料 [打印本页]

作者: zhangxinchun    时间: 2018-3-18 00:49
标题: 单片机模拟量转开关量传感器模块原理图与源码等资料
电路原理图如下:

功能描述:
此工业级板的作用是,模块供电后,数码管显示设定数值,板子有两个独立按键,客户可根据需求自定义编程其功能。
可实现的功能:定时输出控制、计数器技术控制、0~5V模拟量输入控制、按键控制数码管显示、开关量输入控制。
【简要说明】
一、板子尺寸:长72mmX42mmX18mm
二、主要器件STC12C2052AD单片机、数码管、继电器
三、工作电压:有6V24V
四、板子功耗:小于150mA
五、特点:
         1、具有继电器输出信号指示功能
         2供电即可工作,具有电源指示灯
         3多种工作模式
         4如果您会单片机,可以根据自己需要,任意编程,我们可提供参考程序和相关资料
         5两个按键任意调节和编程功能
         6继电器吸合时间10ms 释放时间15ms
         7可以和72MM卡槽板配合安装在DIN导轨上
         8、继电器触点干接点输出,可以控制交流或者直流250V以内任何负载。     9、端子采用螺旋压接端子           
         10、工作温度-40度至 +70度
         11、工作湿度 10%  ~ 80%RH
         12、四周有4个固定安装孔
         13、具有电磁抗干扰能力
         14、板子稳定工作可靠



设定值控制0~100具有上下限值设定共阴数码管 - 气体传感器单片机源程序如下:
  1. #include<STC12C2052AD.h>                 //库文件
  2. #include<intrins.h>
  3. #define uchar unsigned char //宏定义字符型变量
  4. #define uint  unsigned int        //宏定义整型变量
  5. /****************************模拟量开始*********************************************/
  6. /*声明 SFR 相关 与 的 IAP*/
  7. sfr IAP_DATA = 0xE2;
  8. sfr IAP_ADDRH = 0xE3;
  9. sfr IAP_ADDRL = 0xE4;
  10. sfr IAP_CMD = 0xE5;
  11. sfr IAP_TRIG = 0xE6;
  12. sfr IAP_CONTR = 0xE7;
  13. #define ADC_POWER   0x80            //ADC 电源控制位
  14. #define ADC_FLAG    0x10            //ADC 转换结束标志位
  15. #define ADC_START   0x08            //ADC 开始转换控制位
  16. #define ADC_SPEEDLL 0x00            //210 个时钟周期转换一次
  17. #define ADC_SPEEDL  0x20            //420 个时钟周期转换一次
  18. #define ADC_SPEEDH  0x40            //630 个时钟周期转换一次
  19. #define ADC_SPEEDHH 0x60            //840 个时钟周期转换一次
  20. /******************************模拟量结束*******************************************/
  21. /********************************************************************
  22.                             定义 ISP/IAP/EEPROM 命令
  23. *********************************************************************/
  24. #define CMD_IDLE 0jm
  25. #define CMD_READ 1
  26. #define CMD_PROGRAM 2
  27. #define CMD_ERASE 3
  28. #define ENABLE_IAP 0x83//SYSCLK<12MH
  29. #define IAP_ADDRESS 0x0000        //存储地址
  30. void IapIdle();//禁用 ISP/IAP/EEPROM functionmake 单片机 在 一 安全 状态
  31. uchar IapReadByte(uint addr);//读数据
  32. void IapProgramByte(uint addr, uchar dat);//写数据
  33. void IapEraseSector(uint addr);//擦除数据
  34. sbit P10=P1^0;//数码管段
  35. sbit P11=P1^1;//数码管段
  36. sbit P12=P1^2;//数码管段
  37. sbit P13=P1^3;//数码管段
  38. sbit P14=P1^4;//数码管段
  39. sbit P15=P1^5;//数码管段
  40. sbit P16=P1^6;//数码管段
  41. sbit P32=P3^2;//数码管位
  42. sbit P33=P3^3;//数码管位
  43. sbit P35=P3^5;//数码管位
  44. sbit AIN1=P1^7;//AD信号输入
  45. sbit key1=P3^0;//按键输入
  46. sbit key2=P3^1;//按键输入
  47. sbit OUT=P3^7; //继电器输出
  48. static uchar presstime=0;//用于延时
  49. uint tcnt1=0;//用于刷新数码管
  50. uint bainum1,shinum1,genum1;//数码管上显示
  51. uint bainum11=0,shinum11=0,genum11=0,shinum12=0,genum12=0;//用于传到数码管上显示
  52. uint kf0=1,if0=0;//按键用的标志位
  53. uint kt0=0;//按键用的标志位
  54. uint keynum=0;//数码管的位
  55. uint datas=0;
  56. bit flag_eeprom1=1;//掉电存储的标志位
  57. uint inum1=0;//触发端子用的计数
  58. uchar inum11=0,inum12=0;//掉电存储
  59. uint ad=0,ad1=0;
  60. code uchar seg7code[13]={0x84,0xf6,0x8a,0xa2,0xf0,0xa1,0x81,0xb6,0x80,0xa0,0x6f,0x3e,0x72}; //显示段码 数码管字跟
  61. extern void p31s();//将p3口的235置为1
  62. uint GetADCResult(uchar px);
  63. uint meanval1,meanval2;//平均值
  64. void InitADC();
  65. void keycan();
  66. void keyflag();//按键结束调用
  67. void displaynum();//将数字传到数码管上显示
  68. void saveeepro();

  69. void timer0(void)interrupt 1  {//定时器0          
  70.         //500等于1秒
  71.         TL0 = 0xCD;                //重新设置定时器0时间为2ms
  72.         TH0 = 0xF8;                //重新设置定时器0的初始值
  73.         tcnt1++;//用于刷新数码管
  74.         presstime++;
  75.         if (if0==0){
  76.                 meanval1++;
  77.                 if(meanval1==50){
  78.                         meanval2=GetADCResult(7)/2.5;
  79.                         //meanval2=meanval2-20;
  80.                         if(meanval2>=100){meanval2=99;}
  81.                         if(meanval2<=1){meanval2=0;}
  82.                         meanval1=0;
  83.                 }
  84.         }
  85.         switch(tcnt1){//数码管部分
  86.           case 1: p31s(); P1=seg7code[bainum1];P32=0;break;
  87.           case 2: p31s(); P1=~seg7code[shinum1];if(keynum==1 || keynum==3 || keynum==0){P33=0;}break;
  88.           case 3: p31s(); P1=~seg7code[genum1]; if(keynum==2 || keynum==4 || keynum==0){P35=0;}break;
  89.           default: tcnt1=0; p31s(); break;
  90.          }
  91. }//定时器0结束
  92. void displaynum(){//将数字传到数码管上显示
  93.         if (if0==0){//当if0==0时num1三个数码管进行显示
  94.                 AIN1=1;
  95.                 ad=meanval2;
  96. //                if((ad<inum11)||(ad>inum12)){OUT=0;}else{OUT=1;}  //inum11是上线值 inum12是下线线值
  97. //                   if(ad>inum11){OUT=0;}        //如果AD值大于上线值继电器吸合
  98. //                  if(ad<inum12){OUT=1;}        //如果AD值小于下线值继电器断开
  99.                   if(ad>inum11){OUT=1;}        //如果AD值大于上线值继电器断开
  100.                   if(ad<inum12){OUT=0;}        //如果AD值小于下线值继电器吸合
  101.                         genum1=ad%10;//个位
  102.                         shinum1=ad/10%10;//十位
  103.                         bainum1=10;//百
  104.         }else{
  105.                 if(keynum<3){
  106.                         bainum1=11;
  107.                         shinum1=shinum11;
  108.                         genum1=genum11;
  109.                         inum11=shinum11*10+genum11;        //将num1三个数码管的值付给inum
  110.                 }else{
  111.                         bainum1=12;
  112.                         shinum1=shinum12;
  113.                         genum1=genum12;
  114.                         inum12=shinum12*10+genum12;        //将num1三个数码管的值付给inum
  115.                
  116.                 }
  117.         }                         
  118. }
  119. void timer0_1init(void){//定时配置
  120.         TMOD=0x11;//将定时器0,1都设置为模式1
  121.         TL0 = 0xCD;//设置定时器0时间为2ms
  122.         TH0 = 0xF8;//设置定时器0的初始值
  123.         TR0=1;//开启定时器0
  124.         TR1=1;//开启定时器1
  125.         EA=1;//开总中断
  126.         ET0=1;//开定时器0的中断
  127. }
  128. void main(){
  129.         P1M0=0X00;//强推挽输出
  130.         P1M1=0X7F;//强推挽输出
  131.         AIN1=1;
  132.         InitADC(); //AD转换初始化
  133.         timer0_1init();        //定时器配置
  134.         inum11= IapReadByte(0x01);//读取存储的值
  135.         inum12= IapReadByte(0x02);
  136. //        inum1=inum11*100+inum12;
  137.    shinum11=inum11/10%10;
  138.    genum11=inum11%10;
  139.    shinum12=inum12/10%10;
  140.    genum12=inum12%10;
  141.         while(1){
  142.                 keycan();
  143.         }         
  144. }
  145. void keycan(){//按键
  146.         if(keynum==0){//当按键值等于0的时候调用显示
  147.                 displaynum();
  148.         }
  149.             if(key1==0){//当按键1按下
  150.                         if(kf0){//当标志位kf0=1的时候进行
  151.                                 if(presstime>50){//当时间值大于一百的时候
  152.                                         kf0=0;//标志位kf0=0
  153.                                         kt0=1;//标志位kt0=0
  154.                                         if0=1;
  155.                                         presstime=0;//时间清零,重新进行
  156.                                         keynum++;//数码管的位
  157.                                 if(keynum==5){//当位到7则置位0
  158.                                            keynum=0;if0=0;
  159.                                          }
  160.                                 }
  161.                           }
  162.                 }else{//当按键松开
  163.                         keyflag();displaynum();
  164.                 }//按键1结束
  165.     if(key2==0){if(kf0){if(presstime>50){kf0=0;kt0=1;presstime=0;flag_eeprom1=1;//掉电存储的标志位改为1,进行存值操作
  166.                                 switch(keynum){
  167.                                         case 0:if(if0==1){if0=0;}else{if0=1;}break;
  168.                                         case 1:shinum11++;if(shinum11>9){shinum11=0;}break;
  169.                                         case 2:genum11++;if(genum11>9){genum11=0;}break;
  170.                                         case 3:shinum12++;if(shinum12>9){shinum12=0;}break;
  171.                                         case 4:genum12++;if(genum12>9){genum12=0;}break;
  172.                                         default:break;
  173.                                 }
  174.                         }}}else{keyflag();displaynum();
  175.                                         if(bainum11==1){shinum11=0;genum11=0;}
  176.                                         if((flag_eeprom1==1))//加掉电存储,必需加到这,不然有一些小问题
  177.                                         {   flag_eeprom1=0;
  178.                                             saveeepro();//掉电存储
  179.                                         }
  180.                         }//松开按键进行显示       
  181. }

  182. void saveeepro(){//掉电存储
  183. inum11=shinum11*10+genum11;        //将num1三个数码管的值付给inum
  184. inum12=shinum12*10+genum12;        //将num1三个数码管的值付给inum
  185. // inum11=inum1/100;//把int型的值拆分到char型
  186. // inum12=inum1%100;
  187.    IapEraseSector(0);  //擦除扇区
  188.    IapProgramByte(0x01,inum11);//写入数据
  189.    IapProgramByte(0x02,inum12);//写入数据
  190. //   IapProgramByte(0x03,inum13);//写入数据
  191. //   IapProgramByte(0x04,inum14);//写入数据
  192. }

  193. void p31s(){//将p3口的235置为1
  194.         P32=1;P33=1;P35=1;
  195. }
  196. void keyflag(){//按键结束调用,按键的建议使用,这样可以减小code,但是触发的不建议
  197.            if(kt0){//当标志位kt0=1的时候进行
  198.                    if(presstime>50){//当时间值大于一百的时候
  199.                         kf0=1;//标志位kf0=1
  200.                         kt0=0;//标志位kt0=0
  201.                            presstime=0;//时间清零,重新进行
  202.                         }
  203.            }
  204. }
  205. // AD转换初始化程序
  206. void InitADC(){
  207. //   P1 = P1M0 = P1M1 = 0xff;        //设置P1口为开漏模式,使用AD功能
  208.     ADC_DATA = 0;                   //AD数据寄存器清空
  209.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL;//打开AD电源,转换周期210
  210.     _nop_();                        //延时
  211. }
  212. //AD转换控制程序
  213. uint GetADCResult(uchar px){          //转换输出的数据 (PX为通道口)
  214.         uint t=0;
  215.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL |px| ADC_START;//开始转换
  216.         _nop_();
  217.     _nop_();
  218.     _nop_();
  219.     while (!(ADC_CONTR & ADC_FLAG));//等待转换结束
  220.     ADC_CONTR &= ~ADC_FLAG;         //关闭AD转换
  221.         t=(ADC_DATA<<2)|ADC_LOW2;
  222.     return ADC_DATA;                //返回数据
  223. }
  224. void IapIdle(){//禁用 ISP/IAP/EEPROM functionmake 单片机 在 一 安全 状态
  225.     IAP_CONTR = 0;           //
  226.         IAP_CMD = 0;           //
  227.         IAP_TRIG = 0;           //
  228.         IAP_ADDRH = 0x80;  //
  229.         IAP_ADDRL = 0;           //
  230. }
  231. uchar IapReadByte(uint addr){//读数据
  232.    uchar dat;
  233.    IAP_CONTR = ENABLE_IAP;
  234.    IAP_CMD = CMD_READ;
  235.    IAP_ADDRL = addr;
  236.    IAP_ADDRH = addr >> 8;
  237.    IAP_TRIG = 0x46;
  238.    IAP_TRIG = 0xb9;
  239.    _nop_();
  240. ……………………

  241. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码


所有资料51hei提供下载:
GYJ-0083_模拟量转开关量传感器模块发货资料.rar (15.1 MB, 下载次数: 32)







欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1