找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2649|回复: 0
打印 上一主题 下一主题
收起左侧

GYJ-0298 0~10V电压传感器可编程报警控制模块 0~10V电压变送器原理图+C程序源码

[复制链接]
跳转到指定楼层
楼主
功能描述:
此电路板的作用是,模块供电后,数码管显示设定数值,板子有两个独立按键,客户可根据需求自定义编程其功能。
可实现的功能:单片机可以自己编程、定时控制、0~10V电压输入控制、按键控制数码管显示。
【简要说明】
一、 尺寸:长78mmX宽47mmX高24mm
二、 主要芯片:STC单片机
三、 工作电压:直流6~36V 需要5V的需要特别说明
四、特点:
    可编程控制,提供原理图,例程及相关资料,提供程序源代码,提供相关资料!客户可以通过按键设置对继电器进行开关控制,也可以通过编程自由控制!
1、电源指示灯,继电器吸合指示灯。
2、板子功耗小于1W
3、额定切换电流10A以内,切换电压250V以内
4、最大切换功率300W
5、继电器寿命1000000次以上。
6、电器绝缘电阻100M
7、触电耐压1000V
8、继电器最大吸合时间15mS 毫秒
9、继电器最大释放时间5mS  毫秒
10、工作温度-40度至 +70度
11、工作湿度 40%  ~ 80%RH
适用场合:远程通信控制,可编程控制,输入输出控制,仪器仪表监控。


单片机源程序如下:
  1. #include<STC15W408AS.h>                 //库文件
  2. #include<intrins.h>
  3. #define uchar unsigned char//宏定义无符号字符型
  4. #define uint unsigned int  //宏定义无符号整型
  5. #define ADC_POWER   0x80            //ADC 电源控制位
  6. #define ADC_FLAG    0x10            //ADC 转换结束标志位
  7. #define ADC_START   0x08            //ADC 开始转换控制位
  8. #define ADC_SPEEDLL 0x00            //210 个时钟周期转换一次
  9. #define ADC_SPEEDL  0x20            //420 个时钟周期转换一次
  10. #define ADC_SPEEDH  0x40            //630 个时钟周期转换一次
  11. #define ADC_SPEEDHH 0x60            //840 个时钟周期转换一次

  12. typedef unsigned char  INT8U;
  13. typedef unsigned int   INT16U;
  14. #define ENABLE_ISP 0x82 //系统工作时钟<20MHz 时,对IAP_CONTR 寄存器设置此值
  15. #define WD1        0x5a        //使用STC11xx系列单片机时,先写入0x5a,然写入0xa5
  16. #define WD2        0xa5
  17. char IAPAddr=0;
  18. /********************************************************************
  19.                             初始定义
  20. *********************************************************************/
  21. code uchar seg7code[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //显示段码 数码管字跟
  22. /********************************************************************
  23.                             I/O定义
  24. *********************************************************************/
  25. bit z=0,ba=0,k=0,zs=0;
  26. uchar y=0,smg2=0,s1=0,s2=0;
  27. uint s=0,bai=0,shi=0,ge=0,js=0,dat=0,dat1=0;
  28. sbit aj1=P5^4;
  29. sbit aj2=P5^5;
  30. sbit out=P3^4;
  31. sbit L1=P3^5;//数码管位控制
  32. sbit L2=P3^6;//数码管位控制
  33. sbit L3=P3^7;//数码管位控制
  34. sbit dp=P3^3;//小数点
  35. bit kt=0,kt_1=0;
  36. uchar trg=0,trg_1=0,cont=0,cont_1=0;
  37. uchar ReadData=0,ReadData_1=0;
  38. /********************************************************************
  39.                             E2P函数
  40. *********************************************************************/
  41. union union_temp16
  42. {
  43.     INT16U un_temp16;
  44.     INT8U  un_temp8[2];
  45. }my_unTemp16;

  46. INT8U Byte_Read(INT16U add);              //读一字节,调用前需打开IAP 功能
  47. void Byte_Program(INT16U add, INT8U ch);  //字节编程,调用前需打开IAP 功能
  48. void Sector_Erase(INT16U add);            //擦除扇区
  49. void IAP_Disable();                       //关闭IAP 功能
  50. /********************************************************************
  51.                          AD转换初始化程序
  52. *********************************************************************/
  53. void InitADC()
  54. {
  55.    P1ASF = 0x80;          //设置P1.7口AD转换,必须加
  56.    P1M0=0X80;
  57.    P1M1=0X80;        //设置P1.7口为开漏模式,使用AD功能
  58.     ADC_RES = 0;                   //AD数据寄存器清空
  59.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL;//打开AD电源,转换周期210
  60.     _nop_();                        //延时一个机器周期
  61.     _nop_();
  62.         _nop_();                        //延时一个机器周期
  63. }
  64. /********************************************************************
  65.                          AD转换控制程序
  66. *********************************************************************/
  67. uchar ADCRead(uchar px)          //转换输出的数据 (PX为通道口)
  68. {
  69.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL |px| ADC_START;//开始转换
  70.     _nop_();                        //延时一个机器周期
  71.     _nop_();                                                //延时一个机器周期
  72.     _nop_();                                                //延时一个机器周期
  73.     _nop_();                                                //延时一个机器周期
  74.     while (!(ADC_CONTR & ADC_FLAG));//等待转换结束
  75.     ADC_CONTR &= ~ADC_FLAG;         //关闭AD转换
  76.     return ADC_RES;                //返回数据
  77. }
  78. /*******************************************************************
  79. *                        读取按键状态
  80. ********************************************************************/
  81. void KeyRead()//读取按键IO口函数
  82. {
  83.      ReadData = aj1^0xff;  // 读取按键状态取反后赋值给ReadData
  84.      trg = ReadData & (ReadData ^ cont);  //trg短按,每按下按键trg=1;抬手后为trg=0,长按为trg=0
  85.      cont = ReadData;   //cont长按,长按cont=1,抬手后cont=0

  86.          ReadData_1 = aj2^0xff;  // 读取按键状态取反后赋值给ReadData
  87.      trg_1 = ReadData_1 & (ReadData_1 ^ cont_1);  //trg短按,每按下按键trg=1;抬手后为trg=0,长按为trg=0
  88.     cont_1 = ReadData_1;   //cont长按,长按cont=1,抬手后cont=0
  89. }
  90. /*******************************************************************
  91. *                        按键
  92. ********************************************************************/
  93. void key_1()
  94. {         
  95.   if(trg & 0x01) //短按
  96.   {      
  97.      kt_1=0;
  98.          kt=1; //这是短按标志位,kt=1说明短按了
  99.   }
  100.   if((aj1!=0)&&(kt==1))//判断
  101.         {
  102.          z=1; // 选位标志位
  103.          y++; //选位
  104.          out=1;
  105.          if(y==4)
  106.           {
  107.            z=0;
  108.            k=1;
  109.            y=0;
  110. //           s=s1+s2+s3;
  111.           }
  112.          kt=0;
  113.     }           // 短按

  114. }

  115. void key_2()
  116. {         
  117.   if(trg_1 & 0x01) //短按
  118.   {      
  119.      kt=0;
  120.          kt_1=1; //这是短按标志位,kt=1说明短按了
  121.   }
  122.   if((aj2!=0)&&(kt_1==1))//判断
  123.         {
  124.          if(y==1)
  125.           {
  126.            s1++;
  127.            if(s1>9)
  128.             {
  129.                  s1=0;
  130.                 }
  131.           }
  132.          if(y==2)
  133.           {
  134.            s2+=10;
  135.            if(s2>90)
  136.             {
  137.                  s2=0;
  138.                 }
  139.           }
  140.          s=s1+s2;
  141.          kt_1=0;
  142.     }           // 短按
  143. }

  144. /*******************************************************************
  145. *                        定时器配置
  146. ********************************************************************/
  147. void ConfigTimer0(){
  148.         TMOD=0x01;//将定时器0,1都设置为模式1
  149.     TH0=0XFC;//1ms
  150.     TL0=0X66;
  151.         TR0=1;//开启定时器0
  152.         ET0=1;//开定时器0的中断
  153.         EA=1;//开总中断
  154. }

  155. /*******************************************************************
  156. *                         显示
  157. ********************************************************************/
  158. void led(uint date)
  159. {
  160. bai=date/100;
  161. shi=date%100/10;
  162. ge=date%10;
  163. }
  164. /*******************************************************************
  165. *                         t0定时器
  166. ********************************************************************/
  167. void timer0() interrupt 1
  168. {
  169.     TH0=0XFC;//1ms
  170.     TL0=0X66;
  171.         js++;
  172.         if(js==200){ba=1;js=0;}
  173.          
  174.            if(z==0){
  175.           smg2++;
  176.           }
  177.            else{
  178.              smg2=y;//让逐个显示位
  179.            }

  180.              switch(smg2){                 //数码管扫描
  181.         /**************数码管-开始*****************/
  182.           case 1:  P1=seg7code[ge];L3=1;L2=1;L1=0;dp=0;break;//从P2进P0出
  183.           case 2:  P1=seg7code[shi];L3=1;L2=0;L1=1;if(zs==0){dp=0;}else{dp=1;}break;
  184.           case 3:  P1=seg7code[bai]; L3=0;L2=1;L1=1;dp=0;break;      
  185.         /**************数码管-结束*****************/      
  186.           default: smg2=0; L3=1;L2=1;L1=1; break;
  187.          }
  188. }
  189. /********************************************************************
  190.                             主函数
  191. *********************************************************************/
  192. void main()
  193. {
  194.   ConfigTimer0();        //定时器初始化
  195.     InitADC();           //AD初始化
  196.     P1M0 = 0xff;   //设置强推挽和开漏模式
  197.     P1M1 = 0x80;
  198.         P3M0 = 0x08;   //小数点使用
  199.         P3M1 = 0x00;
  200.         if(Byte_Read(0X0001)==0xff){s1=0;s2=0;}//首次读取,如果读到0xFF说明没有存过数据,直接付给00值
  201.         else
  202.         {
  203.          s1=Byte_Read(0X0001);
  204.          s2=Byte_Read(0X0002);
  205.         }
  206.         s2=s2*10;
  207.         s=s2+s1;
  208.    while(1)
  209.     {
  210. //          if(ba==1){dat=((ADCRead(7)*1000)/249);ba=0;}
  211.           if(ba==1){dat=((ADCRead(7)*51)/255);dat1=dat*2;ba=0;} //51是单片机的工作电压,单片机的工作电压是多少这个就是多少
  212. //          if(ba==1){dat=ADCRead(7);dat1=dat*100/249;ba=0;}
  213.           if((y==0)&&(z==0)){zs=1;led(dat1);} //zs标志位控制小数点
  214.           if(y==1){zs=0;led(s1);}
  215.           if(y==2){zs=0;led(s2);}
  216.           if(y==3){zs=1;z=0;led(s);}
  217.           if(dat1>s){out=0;}else{out=1;}
  218.           KeyRead(); //按键扫描
  219.           key_1();
  220.           key_2();
  221.           if(k==1)
  222.           {
  223.              Sector_Erase(0);
  224.                  Byte_Program(0x0001,s1);  //写入扇区
  225.                  Byte_Program(0x0002,(s2/10));  //写入扇区
  226.                  k=0;
  227.           }
  228.         }

  229. }
  230. //读一字节,调用前需打开IAP 功能,入口:DPTR = 字节地址,返回:A = 读出字节
  231. INT8U Byte_Read(INT16U add)
  232. {
  233.     IAP_DATA = 0x00;
  234.     IAP_CONTR = ENABLE_ISP;         //打开IAP 功能, 设置Flash 操作等待时间
  235.     IAP_CMD = 0x01;                 //IAP/ISP/EEPROM 字节读命令

  236.     my_unTemp16.un_temp16 = add;
  237.     IAP_ADDRH = my_unTemp16.un_temp8[0];    //设置目标单元地址的高8 位地址
  238.     IAP_ADDRL = my_unTemp16.un_temp8[1];    //设置目标单元地址的低8 位地址

  239.     //EA = 0;
  240.     IAP_TRIG = WD1;   //先送 WD1,再送WD2 到ISP/IAP 触发寄存器,每次都需如此
  241.     IAP_TRIG = WD2;   //送完WD2 后,ISP/IAP 命令立即被触发起动
  242.     _nop_();
  243.     //EA = 1;
  244.     IAP_Disable();  //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
  245.                     //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
  246.     return (IAP_DATA);
  247. }
  248. /*********************************************************************************************/
  249. //字节编程,调用前需打开IAP 功能,入口:DPTR = 字节地址, A= 须编程字节的数据
  250. void Byte_Program(INT16U add, INT8U ch)
  251. {
  252.     IAP_CONTR = ENABLE_ISP;         //打开 IAP 功能, 设置Flash 操作等待时间
  253.     IAP_CMD = 0x02;                 //IAP/ISP/EEPROM 字节编程命令

  254.     my_unTemp16.un_temp16 = add;
  255.     IAP_ADDRH = my_unTemp16.un_temp8[0];    //设置目标单元地址的高8 位地址
  256.     IAP_ADDRL = my_unTemp16.un_temp8[1];    //设置目标单元地址的低8 位地址

  257.     IAP_DATA = ch;                  //要编程的数据先送进IAP_DATA 寄存器
  258.     //EA = 0;
  259.     IAP_TRIG = WD1;   //先送 WD1,再送WD2 到ISP/IAP 触发寄存器,每次都需如此
  260.     IAP_TRIG = WD2;   //送完WD2 后,ISP/IAP 命令立即被触发起动
  261.     _nop_();
  262.     //EA = 1;
  263.     IAP_Disable();  //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
  264.                     //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
  265. }
  266. /*********************************************************************************************
  267. //擦除扇区, 入口:DPTR = 扇区地址 */
  268. void Sector_Erase(INT16U add)
  269. {
  270.     IAP_CONTR = ENABLE_ISP;         //打开IAP 功能, 设置Flash 操作等待时间
  271.     IAP_CMD = 0x03;                 //IAP/ISP/EEPROM 扇区擦除命令

  272.     my_unTemp16.un_temp16 = add;
  273.     IAP_ADDRH = my_unTemp16.un_temp8[0];    //设置目标单元地址的高8 位地址
  274.     IAP_ADDRL = my_unTemp16.un_temp8[1];    //设置目标单元地址的低8 位地址

  275.     //EA = 0;
  276.     IAP_TRIG = WD1;   //先送 WD1,再送WD2 到ISP/IAP 触发寄存器,每次都需如此
  277.     IAP_TRIG = WD2;   //送完WD2 后,ISP/IAP 命令立即被触发起动
  278.     _nop_();
  279.     //EA = 1;
  280.     IAP_Disable();  //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
  281.                     //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
  282. }
  283. /*********************************************************************************************/
  284. void IAP_Disable()
  285. {
  286.     //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
  287.     //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
  288.     IAP_CONTR = 0;      //关闭IAP 功能
  289.     IAP_CMD   = 0;      //清命令寄存器,使命令寄存器无命令,此句可不用
  290.     IAP_TRIG  = 0;      //清命令触发寄存器,使命令触发寄存器无触发,此句可不用
  291.     IAP_ADDRH = 0;
  292.     IAP_ADDRL = 0;
  293. }
复制代码

image004.jpg (21 KB, 下载次数: 54)

image004.jpg

image006.jpg (21.69 KB, 下载次数: 56)

image006.jpg

image010.jpg (38.38 KB, 下载次数: 57)

image010.jpg

image014.jpg (30.55 KB, 下载次数: 56)

image014.jpg

GYJ-0298_0~10V电压报警模块开关量干节点输出测试程序.rar

52.1 KB, 下载次数: 19, 下载积分: 黑币 -5

GYJ-0298_0~10V电压报警模块开关量干节点输出工程原理图及PCB图.pdf

402.8 KB, 下载次数: 20, 下载积分: 黑币 -5

GYJ-0298_0~10V电压报警模块开关量干节点输出使用手册.pdf

1.52 MB, 下载次数: 18, 下载积分: 黑币 -5

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏6 分享淘帖 顶1 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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