標題: GYJ-0298 0~10V電壓傳感器可編程報警控制模塊 0~10V電壓變送器原理圖+C程序源碼 [打印本頁]

作者: 電子愛好者999    時間: 2020-10-9 23:24
標題: GYJ-0298 0~10V電壓傳感器可編程報警控制模塊 0~10V電壓變送器原理圖+C程序源碼
功能描述:
此電路板的作用是,模塊供電后,數(shù)碼管顯示設(shè)定數(shù)值,板子有兩個獨立按鍵,客戶可根據(jù)需求自定義編程其功能。
可實現(xiàn)的功能:單片機可以自己編程、定時控制、0~10V電壓輸入控制、按鍵控制數(shù)碼管顯示。
【簡要說明】
一、 尺寸:長78mmX寬47mmX高24mm
二、 主要芯片:STC單片機
三、 工作電壓:直流6~36V 需要5V的需要特別說明
四、特點:
    可編程控制,提供原理圖,例程及相關(guān)資料,提供程序源代碼,提供相關(guān)資料!客戶可以通過按鍵設(shè)置對繼電器進行開關(guān)控制,也可以通過編程自由控制!
1、電源指示燈,繼電器吸合指示燈。
2、板子功耗小于1W
3、額定切換電流10A以內(nèi),切換電壓250V以內(nèi)
4、最大切換功率300W
5、繼電器壽命1000000次以上。
6、電器絕緣電阻100M
7、觸電耐壓1000V
8、繼電器最大吸合時間15mS 毫秒
9、繼電器最大釋放時間5mS  毫秒
10、工作溫度-40度至 +70度
11、工作濕度 40%  ~ 80%RH
適用場合:遠程通信控制,可編程控制,輸入輸出控制,儀器儀表監(jiān)控。


單片機源程序如下:
  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 轉(zhuǎn)換結(jié)束標志位
  7. #define ADC_START   0x08            //ADC 開始轉(zhuǎn)換控制位
  8. #define ADC_SPEEDLL 0x00            //210 個時鐘周期轉(zhuǎn)換一次
  9. #define ADC_SPEEDL  0x20            //420 個時鐘周期轉(zhuǎn)換一次
  10. #define ADC_SPEEDH  0x40            //630 個時鐘周期轉(zhuǎn)換一次
  11. #define ADC_SPEEDHH 0x60            //840 個時鐘周期轉(zhuǎn)換一次

  12. typedef unsigned char  INT8U;
  13. typedef unsigned int   INT16U;
  14. #define ENABLE_ISP 0x82 //系統(tǒng)工作時鐘<20MHz 時,對IAP_CONTR 寄存器設(shè)置此值
  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}; //顯示段碼 數(shù)碼管字跟
  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;//數(shù)碼管位控制
  32. sbit L2=P3^6;//數(shù)碼管位控制
  33. sbit L3=P3^7;//數(shù)碼管位控制
  34. sbit dp=P3^3;//小數(shù)點
  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函數(shù)
  40. *********************************************************************/
  41. union union_temp16
  42. {
  43.     INT16U un_temp16;
  44.     INT8U  un_temp8[2];
  45. }my_unTemp16;

  46. INT8U Byte_Read(INT16U add);              //讀一字節(jié),調(diào)用前需打開IAP 功能
  47. void Byte_Program(INT16U add, INT8U ch);  //字節(jié)編程,調(diào)用前需打開IAP 功能
  48. void Sector_Erase(INT16U add);            //擦除扇區(qū)
  49. void IAP_Disable();                       //關(guān)閉IAP 功能
  50. /********************************************************************
  51.                          AD轉(zhuǎn)換初始化程序
  52. *********************************************************************/
  53. void InitADC()
  54. {
  55.    P1ASF = 0x80;          //設(shè)置P1.7口AD轉(zhuǎn)換,必須加
  56.    P1M0=0X80;
  57.    P1M1=0X80;        //設(shè)置P1.7口為開漏模式,使用AD功能
  58.     ADC_RES = 0;                   //AD數(shù)據(jù)寄存器清空
  59.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL;//打開AD電源,轉(zhuǎn)換周期210
  60.     _nop_();                        //延時一個機器周期
  61.     _nop_();
  62.         _nop_();                        //延時一個機器周期
  63. }
  64. /********************************************************************
  65.                          AD轉(zhuǎn)換控制程序
  66. *********************************************************************/
  67. uchar ADCRead(uchar px)          //轉(zhuǎn)換輸出的數(shù)據(jù) (PX為通道口)
  68. {
  69.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL |px| ADC_START;//開始轉(zhuǎn)換
  70.     _nop_();                        //延時一個機器周期
  71.     _nop_();                                                //延時一個機器周期
  72.     _nop_();                                                //延時一個機器周期
  73.     _nop_();                                                //延時一個機器周期
  74.     while (!(ADC_CONTR & ADC_FLAG));//等待轉(zhuǎn)換結(jié)束
  75.     ADC_CONTR &= ~ADC_FLAG;         //關(guān)閉AD轉(zhuǎn)換
  76.     return ADC_RES;                //返回數(shù)據(jù)
  77. }
  78. /*******************************************************************
  79. *                        讀取按鍵狀態(tài)
  80. ********************************************************************/
  81. void KeyRead()//讀取按鍵IO口函數(shù)
  82. {
  83.      ReadData = aj1^0xff;  // 讀取按鍵狀態(tài)取反后賦值給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;  // 讀取按鍵狀態(tài)取反后賦值給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都設(shè)置為模式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){                 //數(shù)碼管掃描
  181.         /**************數(shù)碼管-開始*****************/
  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.         /**************數(shù)碼管-結(jié)束*****************/      
  186.           default: smg2=0; L3=1;L2=1;L1=1; break;
  187.          }
  188. }
  189. /********************************************************************
  190.                             主函數(shù)
  191. *********************************************************************/
  192. void main()
  193. {
  194.   ConfigTimer0();        //定時器初始化
  195.     InitADC();           //AD初始化
  196.     P1M0 = 0xff;   //設(shè)置強推挽和開漏模式
  197.     P1M1 = 0x80;
  198.         P3M0 = 0x08;   //小數(shù)點使用
  199.         P3M1 = 0x00;
  200.         if(Byte_Read(0X0001)==0xff){s1=0;s2=0;}//首次讀取,如果讀到0xFF說明沒有存過數(shù)據(jù),直接付給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標志位控制小數(shù)點
  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);  //寫入扇區(qū)
  225.                  Byte_Program(0x0002,(s2/10));  //寫入扇區(qū)
  226.                  k=0;
  227.           }
  228.         }

  229. }
  230. //讀一字節(jié),調(diào)用前需打開IAP 功能,入口:DPTR = 字節(jié)地址,返回:A = 讀出字節(jié)
  231. INT8U Byte_Read(INT16U add)
  232. {
  233.     IAP_DATA = 0x00;
  234.     IAP_CONTR = ENABLE_ISP;         //打開IAP 功能, 設(shè)置Flash 操作等待時間
  235.     IAP_CMD = 0x01;                 //IAP/ISP/EEPROM 字節(jié)讀命令

  236.     my_unTemp16.un_temp16 = add;
  237.     IAP_ADDRH = my_unTemp16.un_temp8[0];    //設(shè)置目標單元地址的高8 位地址
  238.     IAP_ADDRL = my_unTemp16.un_temp8[1];    //設(shè)置目標單元地址的低8 位地址

  239.     //EA = 0;
  240.     IAP_TRIG = WD1;   //先送 WD1,再送WD2 到ISP/IAP 觸發(fā)寄存器,每次都需如此
  241.     IAP_TRIG = WD2;   //送完WD2 后,ISP/IAP 命令立即被觸發(fā)起動
  242.     _nop_();
  243.     //EA = 1;
  244.     IAP_Disable();  //關(guān)閉IAP 功能, 清相關(guān)的特殊功能寄存器,使CPU 處于安全狀態(tài),
  245.                     //一次連續(xù)的IAP 操作完成之后建議關(guān)閉IAP 功能,不需要每次都關(guān)
  246.     return (IAP_DATA);
  247. }
  248. /*********************************************************************************************/
  249. //字節(jié)編程,調(diào)用前需打開IAP 功能,入口:DPTR = 字節(jié)地址, A= 須編程字節(jié)的數(shù)據(jù)
  250. void Byte_Program(INT16U add, INT8U ch)
  251. {
  252.     IAP_CONTR = ENABLE_ISP;         //打開 IAP 功能, 設(shè)置Flash 操作等待時間
  253.     IAP_CMD = 0x02;                 //IAP/ISP/EEPROM 字節(jié)編程命令

  254.     my_unTemp16.un_temp16 = add;
  255.     IAP_ADDRH = my_unTemp16.un_temp8[0];    //設(shè)置目標單元地址的高8 位地址
  256.     IAP_ADDRL = my_unTemp16.un_temp8[1];    //設(shè)置目標單元地址的低8 位地址

  257.     IAP_DATA = ch;                  //要編程的數(shù)據(jù)先送進IAP_DATA 寄存器
  258.     //EA = 0;
  259.     IAP_TRIG = WD1;   //先送 WD1,再送WD2 到ISP/IAP 觸發(fā)寄存器,每次都需如此
  260.     IAP_TRIG = WD2;   //送完WD2 后,ISP/IAP 命令立即被觸發(fā)起動
  261.     _nop_();
  262.     //EA = 1;
  263.     IAP_Disable();  //關(guān)閉IAP 功能, 清相關(guān)的特殊功能寄存器,使CPU 處于安全狀態(tài),
  264.                     //一次連續(xù)的IAP 操作完成之后建議關(guān)閉IAP 功能,不需要每次都關(guān)
  265. }
  266. /*********************************************************************************************
  267. //擦除扇區(qū), 入口:DPTR = 扇區(qū)地址 */
  268. void Sector_Erase(INT16U add)
  269. {
  270.     IAP_CONTR = ENABLE_ISP;         //打開IAP 功能, 設(shè)置Flash 操作等待時間
  271.     IAP_CMD = 0x03;                 //IAP/ISP/EEPROM 扇區(qū)擦除命令

  272.     my_unTemp16.un_temp16 = add;
  273.     IAP_ADDRH = my_unTemp16.un_temp8[0];    //設(shè)置目標單元地址的高8 位地址
  274.     IAP_ADDRL = my_unTemp16.un_temp8[1];    //設(shè)置目標單元地址的低8 位地址

  275.     //EA = 0;
  276.     IAP_TRIG = WD1;   //先送 WD1,再送WD2 到ISP/IAP 觸發(fā)寄存器,每次都需如此
  277.     IAP_TRIG = WD2;   //送完WD2 后,ISP/IAP 命令立即被觸發(fā)起動
  278.     _nop_();
  279.     //EA = 1;
  280.     IAP_Disable();  //關(guān)閉IAP 功能, 清相關(guān)的特殊功能寄存器,使CPU 處于安全狀態(tài),
  281.                     //一次連續(xù)的IAP 操作完成之后建議關(guān)閉IAP 功能,不需要每次都關(guān)
  282. }
  283. /*********************************************************************************************/
  284. void IAP_Disable()
  285. {
  286.     //關(guān)閉IAP 功能, 清相關(guān)的特殊功能寄存器,使CPU 處于安全狀態(tài),
  287.     //一次連續(xù)的IAP 操作完成之后建議關(guān)閉IAP 功能,不需要每次都關(guān)
  288.     IAP_CONTR = 0;      //關(guān)閉IAP 功能
  289.     IAP_CMD   = 0;      //清命令寄存器,使命令寄存器無命令,此句可不用
  290.     IAP_TRIG  = 0;      //清命令觸發(fā)寄存器,使命令觸發(fā)寄存器無觸發(fā),此句可不用
  291.     IAP_ADDRH = 0;
  292.     IAP_ADDRL = 0;
  293. }
復(fù)制代碼

image004.jpg (21 KB, 下載次數(shù): 75)

image004.jpg

image006.jpg (21.69 KB, 下載次數(shù): 77)

image006.jpg

image010.jpg (38.38 KB, 下載次數(shù): 84)

image010.jpg

image014.jpg (30.55 KB, 下載次數(shù): 77)

image014.jpg

GYJ-0298_0~10V電壓報警模塊開關(guān)量干節(jié)點輸出測試程序.rar

52.1 KB, 下載次數(shù): 24, 下載積分: 黑幣 -5

GYJ-0298_0~10V電壓報警模塊開關(guān)量干節(jié)點輸出工程原理圖及PCB圖.pdf

402.8 KB, 下載次數(shù): 22, 下載積分: 黑幣 -5

GYJ-0298_0~10V電壓報警模塊開關(guān)量干節(jié)點輸出使用手冊.pdf

1.52 MB, 下載次數(shù): 20, 下載積分: 黑幣 -5






歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1