久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2676|回復: 0
打印 上一主題 下一主題
收起左側

GYJ-0094_16路輸入6路輸出繼電器可編程模塊單片機源碼與手冊資料

[復制鏈接]
跳轉到指定樓層
樓主
GYJ-0094_16路輸入6路輸出繼電器可編程模塊使用說明
簡要說明:
一、 尺寸:長133mmX寬107mmX高25mm
二、 主要芯片:STC12C5A60S2 是51單片機的8~12倍 (兼容51系列單片機)
三、 工作電壓:直流12伏(另有24V繼電器可選)
四、通過9針串口下載程序 (同時支持TTL下載程序)
五、 特點:
1、具有電源指示。(供電電源有防接反保護)
2、16路輸入(包括:2路模擬量輸入,2路高速光電輸入,12路光電隔離輸入)。
3、6路光電隔離繼電器輸出控制。
4、標準的11.0592M晶振。(便于設置串口波特率)
5、具有上電復位和手動復位。
6、獨立的串口通信及485通信。
7、可以接315M帶解碼的無線接收模塊。
8、輸入輸出均有信號指示燈。
9、繼電器開關量輸出,最大切換電壓220V,最大切換電流7A。最大切換功率200W。
10、電流加有,光電隔離,續流二極管,壓敏電阻,抗干擾能力強。
11、四周有固定安裝孔,也可插入PCB107mm卡槽,安裝在DIN導軌上。
12、通訊穩定,提供原理圖,及板子的參考例程。
13、單片機無加密,可插拔更換,帶有程序下載口,可隨意更改程序
14、、端子采用螺旋壓接端子           
15、工作溫度-40度至 +70度
16、工作濕度 40%  ~ 80%RH
使用說明:
標示圖
供電接線圖

通訊及下載接線圖

模擬量輸入接線圖
光電隔離輸入接線圖
特別聲明:IN3IN14低電平有效,輸入信號電壓支持0~36V
高速光耦輸入接線圖
外接315M無線遙控模塊(默認發貨不提供接收模塊和遙控器需要另外聯系銷售購買)通過編程實現控制。提供相關例程。
【輸出部分標注說明】
原理圖(提供PDF文件)
PCB(提供PDF文件)

原件清單
(提供PDF文件)
測試程序(提供源代碼及各個模塊功能的代碼)

圖片展示
裝殼后效果展示(可以裝在配電柜的DIN導軌上
配無線遙控效果圖
裝殼后效果展示(可以裝在配電柜的DIN導軌上)參考圖

  1. 01.一對一點動輸出程序
  2. /********************************************************************
  3.                             匯誠科技
  4. 使用芯片:STC12C5A60S2
  5. 晶振:11.0592MHZ
  6. 編譯環境:Keil
  7. 作者:zhangxinchunleo
  8. *********************************************************************/
  9. /********************************************************************
  10. 程序說明:
  11. //模擬量輸入(這里用作普通IO口,高電平觸發)
  12. 當IN1口與+5V口接通后, 對應的繼電器吸合,OUT1接通

  13. //第一組普通開光量輸入(可做脈沖輸入,最大1Khz的脈沖)
  14. 當IN2口與GND口接通后, 對應的繼電器吸合,OUT2接通
  15. 當IN3口與GND口接通后, 對應的繼電器吸合,OUT3接通
  16. 當IN4口與GND口接通后, 對應的繼電器吸合,OUT4接通
  17. 當IN5口與GND口接通后, 對應的繼電器吸合,OUT5接通
  18. 當IN6口與GND口接通后, 對應的繼電器吸合,OUT6接通
  19. 當IN7口與GND口接通后, 對應的繼電器吸合,OUT7接通
  20. //第二組普通開光量輸入(可做脈沖輸入,最大1Khz的脈沖)
  21. 當IN8口與GND口接通后, 對應的繼電器吸合,OUT8接通
  22. 當IN9口與GND口接通后, 對應的繼電器吸合,OUT9接通
  23. 當IN10口與GND口接通后,對應的繼電器吸合,OUT10接通
  24. 當IN11口與GND口接通后,對應的繼電器吸合,OUT11接通
  25. 當IN12口與GND口接通后,對應的繼電器吸合,OUT12接通
  26. 當IN13口與GND口接通后,對應的繼電器吸合,OUT1接通
  27. //高速脈沖輸入(最大100KHz)(也可作普通IO口用)
  28. 當IN14口與GND口接通后,對應的繼電器吸合,OUT2接通
  29. 當IN15口與GND口接通后,對應的繼電器吸合,OUT3接通
  30. **********************************************************************
  31. */
  32. #include "STC12C5A60S2.H"
  33. /********************************************************************
  34.                             初始定義
  35. *********************************************************************/
  36. /*定義十四個輸入*/
  37. //模擬量接口,做普通IO口時,高定平有效(這里用做普通IO口)
  38. sbit IN1=P1^0;        
  39. //開光量輸入   低電平有效
  40. sbit IN2=P1^1;                              
  41. sbit IN3=P1^4;
  42. sbit IN4=P1^5;
  43. sbit IN5=P1^6;
  44. sbit IN6=P1^7;
  45. sbit IN7=P3^4;
  46. sbit IN8=P3^5;
  47. sbit IN9=P3^6;
  48. sbit IN10=P3^7;
  49. sbit IN11=P4^6;
  50. sbit IN12=P4^5;                           
  51. sbit IN13=P4^4;
  52. //高速脈沖輸入,    觸發信號高低可選
  53. sbit IN14=P3^2;
  54. sbit IN15=P3^3;

  55. /*定義八位輸出*/
  56. sbit OUT1= P0^4;
  57. sbit OUT2= P0^5;
  58. sbit OUT3= P0^6;
  59. sbit OUT4= P0^7;
  60. sbit OUT5= P2^7;
  61. sbit OUT6= P2^6;
  62. sbit OUT7= P2^5;
  63. sbit OUT8= P2^4;
  64. sbit OUT9= P2^3;
  65. sbit OUT10=P2^2;
  66. sbit OUT11=P2^1;
  67. sbit OUT12=P2^0;
  68. void main()
  69. {
  70.    P1M1|=0X01;    //0000 0001              //因為此IO口直接引出,外加下拉電阻。所以配置IO口的時候需要把它設定為“開漏模式”
  71.    P1M0|=0X01;    //0000 0001
  72.    P4M1|=0x70;    //0111 0000               //P4口設置為“輸入模式”
  73.    P4M0 =0x00;                //0000 0000  
  74.    P4SW|=0x40;                //0100 0000              //P4^6設置成普通IO口
  75.    while(1)
  76.    {
  77.       if(IN1==1)  OUT1=0;    else OUT1=1;
  78.                 if(IN2==0)  OUT2=0;    else OUT2=1;
  79.       if(IN3==0)  OUT3=0;    else OUT3=1;
  80.                 if(IN4==0)  OUT4=0;    else OUT4=1;
  81.                 if(IN5==0)  OUT5=0;    else OUT5=1;
  82.                 if(IN6==0)  OUT6=0;    else OUT6=1;
  83.                 if(IN7==0)  OUT7=0;    else OUT7=1;
  84.                 if(IN8==0)  OUT8=0;    else OUT8=1;
  85.                 if(IN9==0)  OUT9=0;    else OUT9=1;
  86.                 if(IN10==0) OUT10=0;   else OUT10=1;
  87.                 if(IN11==0) OUT11=0;   else OUT11=1;
  88.                 if(IN12==0) OUT12=0;   else OUT12=1;
  89.                 if(IN13==0) OUT1=0;    else OUT1=1;
  90.                 if(IN14==0) OUT2=0;    else OUT2=1;
  91.                 if(IN15==0) OUT3=0;    else OUT3=1;
  92.    }
  93. }
  94. 02.串口通訊程序
  95. /********************************************************************
  96.                             匯誠科技
  97. 使用芯片:STC12C5A60S2
  98. 晶振:11.0592MHZ
  99. 編譯環境:Keil
  100. 作者:zhangxinchunleo
  101. 【聲明】此程序僅用于學習與參考,引用請注明版權和作者信息!   

  102. *********************************************************************/
  103. /********************************************************************
  104. 程序說明:
  105.         上位機通過串口一發送十六進制0xff  繼電器全開
  106.                                             發送十六進制0x00  繼電器全關
  107.                             觸發IN2,板子會向上位機發送 0x01

  108. **********************************************************************
  109. */
  110. #include "STC12C5A60S2.H"
  111. /********************************************************************
  112.                             初始定義
  113. *********************************************************************/
  114. /*定義十四個輸入*/
  115. //模擬量接口,做普通IO口時,高定平有效(這里用做普通IO口)
  116. sbit IN1=P1^0;        
  117. //開光量輸入   低電平有效
  118. sbit IN2=P1^1;                              
  119. sbit IN3=P1^4;
  120. sbit IN4=P1^5;
  121. sbit IN5=P1^6;
  122. sbit IN6=P1^7;
  123. sbit IN7=P3^4;
  124. sbit IN8=P3^5;
  125. sbit IN9=P3^6;
  126. sbit IN10=P3^7;
  127. sbit IN11=P4^6;
  128. sbit IN12=P4^5;                           
  129. sbit IN13=P4^4;
  130. //高速脈沖輸入,    觸發信號高低可選
  131. sbit IN14=P3^2;
  132. sbit IN15=P3^3;
  133. /*定義八位輸出*/
  134. sbit OUT1= P0^4;
  135. sbit OUT2= P0^5;
  136. sbit OUT3= P0^6;
  137. sbit OUT4= P0^7;
  138. sbit OUT5= P2^7;
  139. sbit OUT6= P2^6;
  140. sbit OUT7= P2^5;
  141. sbit OUT8= P2^4;
  142. sbit OUT9= P2^3;
  143. sbit OUT10=P2^2;
  144. sbit OUT11=P2^1;
  145. sbit OUT12=P2^0;
  146. /***********************************************************
  147.                             數據定義
  148. ***********************************************************/
  149. unsigned char dat=0xA1;

  150. /********************************************************************
  151.                             函數定義
  152. *********************************************************************/
  153. //延時函數
  154. void delay ( unsigned char t )
  155. {
  156.               unsigned char i,j;
  157.               for( i=0; i<t; i++)
  158.               for( j=0; j<250; j++);
  159. }
  160. //初始化定義函數
  161. void init()
  162. {
  163.    //IO口配置
  164.    P1M1|=0X01;    //0000 0001              //因為此IO口直接引出,外加下拉電阻。所以配置IO口的時候需要把它設定為“開漏模式”
  165.    P1M0|=0X01;    //0000 0001
  166.    P4M1|=0x70;    //0111 0000               //P4口設置為“輸入模式”
  167.    P4M0 =0x00;                //0000 0000  
  168.    P4SW|=0x40;                //0100 0000              //P4^6設置成普通IO口

  169.    //串口一配置
  170.    TMOD=0x20;       //定時器一產生波特率
  171.    SCON=0x50;       //方式一,八位數據位,一位停止位
  172.    TH1=0XFD;        //波特率9600
  173.    TL1=0xFD;
  174.    TR1=1;
  175.    ES=1;
  176.    EA=1;
  177. }
  178. void main()
  179. {

  180.    init();

  181.    while(1)
  182.    {
  183.       if(dat==0xFF)
  184.                 {
  185.                     dat=0xA1;
  186.                     OUT1=0;
  187.                               OUT2=0;
  188.                               OUT3=0;
  189.                               OUT4=0;
  190.                               OUT5=0;
  191.                               OUT6=0;
  192.                               OUT7=0;
  193.                               OUT8=0;
  194.                               OUT9=0;
  195.                               OUT10=0;
  196.                               OUT11=0;
  197.                               OUT12=0;
  198.                 }
  199.                 if(dat==0x00)
  200.                 {
  201.                     dat=0xA1;
  202.                     OUT1=1;
  203.                               OUT2=1;
  204.                               OUT3=1;
  205.                               OUT4=1;
  206.                               OUT5=1;
  207.                               OUT6=1;
  208.                               OUT7=1;
  209.                               OUT8=1;
  210.                               OUT9=1;
  211.                               OUT10=1;
  212.                               OUT11=1;
  213.                               OUT12=1;
  214.                 }
  215.                 if(IN2==0x00)
  216.                 {
  217.                    delay(10);
  218.                             if(IN2==0X00)
  219.                       SBUF=0X01;
  220.                             while(!IN2);
  221.                 }
  222.    }
  223. }

  224. /*--------------------------------------
  225.          串口一 接收中斷函數
  226. --------------------------------------*/

  227. void uart_isr()  interrupt 4 using 2
  228. {
  229.   if( RI )
  230.    {
  231.      RI=0;
  232.               dat=SBUF;
  233.    }
  234.    if(TI)
  235.       TI=0;
  236.             
  237. }
  238. 03.485通訊程序
  239. /********************************************************************
  240.                             匯誠科技
  241. 使用芯片:STC12C5A60S2
  242. 晶振:11.0592MHZ
  243. 編譯環境:Keil
  244. 作者:zhangxinchunleo
  245. *********************************************************************/
  246. /********************************************************************
  247. 程序說明:
  248.         上位機通過485發送十六進制0xff  繼電器全開
  249.                                             發送十六進制0x00  繼電器全關
  250.                             觸發IN2,板子會向上位機發送 0x01

  251. **********************************************************************
  252. */
  253. #include "STC12C5A60S2.H"
  254. /********************************************************************
  255.                             初始定義
  256. *********************************************************************/
  257. /*定義十四個輸入*/
  258. //模擬量接口,做普通IO口時,高定平有效(這里用做普通IO口)
  259. sbit IN1=P1^0;        
  260. //開光量輸入   低電平有效
  261. sbit IN2=P1^1;                              
  262. sbit IN3=P1^4;
  263. sbit IN4=P1^5;
  264. sbit IN5=P1^6;
  265. sbit IN6=P1^7;
  266. sbit IN7=P3^4;
  267. sbit IN8=P3^5;
  268. sbit IN9=P3^6;
  269. sbit IN10=P3^7;
  270. sbit IN11=P4^6;
  271. sbit IN12=P4^5;                           
  272. sbit IN13=P4^4;
  273. //高速脈沖輸入,    觸發信號高低可選
  274. sbit IN14=P3^2;
  275. sbit IN15=P3^3;
  276. /*定義八位輸出*/
  277. sbit OUT1= P0^4;
  278. sbit OUT2= P0^5;
  279. sbit OUT3= P0^6;
  280. sbit OUT4= P0^7;
  281. sbit OUT5= P2^7;
  282. sbit OUT6= P2^6;
  283. sbit OUT7= P2^5;
  284. sbit OUT8= P2^4;
  285. sbit OUT9= P2^3;
  286. sbit OUT10=P2^2;
  287. sbit OUT11=P2^1;
  288. sbit OUT12=P2^0;
  289. /***********************************************************
  290.                             數據定義
  291. ***********************************************************/
  292. unsigned char dat=0xA1;

  293. /********************************************************************
  294.                             函數定義
  295. *********************************************************************/
  296. //延時函數
  297. void delay ( unsigned char t )
  298. {
  299.               unsigned char i,j;
  300.               for( i=0; i<t; i++)
  301.               for( j=0; j<250; j++);
  302. }
  303. //初始化定義函數
  304. void init()
  305. {
  306.    //IO口配置
  307.    P1M1|=0X01;    //0000 0001              //因為此IO口直接引出,外加下拉電阻。所以配置IO口的時候需要把它設定為“開漏模式”
  308.    P1M0|=0X01;    //0000 0001
  309.    P4M1|=0x70;    //0111 0000               //P4口設置為“輸入模式”
  310.    P4M0 =0x00;                //0000 0000  
  311.    P4SW|=0x40;                //0100 0000              //P4^6設置成普通IO口

  312.     //485配置
  313.     S2CON=0x50;              //方式1,八位數據,可變波特率                                               
  314.               AUXR1=0x00;              //1T工作方式
  315.               BRT = 256 - (11059200/12/32)/9600;  //BRT=0XFD;               //設置波特率9600                                         
  316.                                                       
  317.               AUXR=0x10;              //啟動波特率發生器                                                                                                               
  318.               IE2=0x01;              //開串口2中斷
  319.     EA=1;
  320. }
  321. void main()
  322. {

  323.    init();

  324.    while(1)
  325.    {
  326.       if(dat==0xFF)
  327.                 {
  328.                     dat=0xA1;
  329.                     OUT1=0;
  330.                               OUT2=0;
  331.                               OUT3=0;
  332.                               OUT4=0;
  333.                               OUT5=0;
  334.                               OUT6=0;
  335.                               OUT7=0;
  336.                               OUT8=0;
  337.                               OUT9=0;
  338.                               OUT10=0;
  339.                               OUT11=0;
  340.                               OUT12=0;
  341.                 }
  342.                 if(dat==0x00)
  343.                 {
  344.                     dat=0xA1;
  345.                     OUT1=1;
  346.                               OUT2=1;
  347.                               OUT3=1;
  348.                               OUT4=1;
  349.                               OUT5=1;
  350.                               OUT6=1;
  351.                               OUT7=1;
  352.                               OUT8=1;
  353.                               OUT9=1;
  354.                               OUT10=1;
  355.                               OUT11=1;
  356.                               OUT12=1;
  357.                 }
  358.                 if(IN2==0x00)
  359.                 {
  360.                    delay(10);
  361.                             if(IN2==0X00)
  362.                       S2BUF=0X01;
  363.                             while(!IN2);
  364.                 }
  365.    }
  366. }

  367. /************485發送接收中斷函數******/
  368. void uart2_isr()  interrupt 8
  369. {
  370.    if( S2CON & 0x01 )
  371.    {
  372.                             S2CON &=~0x01;
  373.                             dat = S2BUF;
  374.               }
  375.               if( S2CON & 0x02 )
  376.               {
  377.                 S2CON&=0xfd;
  378.               }
  379. }
  380. 04.掉電存儲程序
  381. /********************************************************************
  382.                             匯誠科技
  383. 使用芯片:STC12C5A60S2
  384. 晶振:11.0592MHZ
  385. 編譯環境:Keil
  386. 作者:zhangxinchunleo
  387. *********************************************************************/
  388. /********************************************************************
  389. 程序說明:
  390.          向內部eeprom中寫數據,然后再讀取出來,
  391.                                如果正確繼電器全部吸合,
  392.                                如果不正確繼電器全部斷開

  393. **********************************************************************
  394. */
  395. #include "STC12C5A60S2.H"
  396. #include <intrins.h>                //用nop函數延時的頭文件

  397. typedef unsigned char              uint8;
  398. typedef unsigned int              uint16;

  399. #define ENABLE_ISP 0x82 //系統工作時鐘<20MHz 時,對IAP_CONTR 寄存器設置此值
  400. /********************************************************************
  401.                             初始定義
  402. *********************************************************************/
  403. /*定義十四個輸入*/
  404. //模擬量接口,做普通IO口時,高定平有效(這里用做普通IO口)
  405. sbit IN1=P1^0;        
  406. //開光量輸入   低電平有效
  407. sbit IN2=P1^1;                              
  408. sbit IN3=P1^4;
  409. sbit IN4=P1^5;
  410. sbit IN5=P1^6;
  411. sbit IN6=P1^7;
  412. sbit IN7=P3^4;
  413. sbit IN8=P3^5;
  414. sbit IN9=P3^6;
  415. sbit IN10=P3^7;
  416. sbit IN11=P4^6;
  417. sbit IN12=P4^5;                           
  418. sbit IN13=P4^4;
  419. //高速脈沖輸入,    觸發信號高低可選
  420. sbit IN14=P3^2;
  421. sbit IN15=P3^3;
  422. /*定義八位輸出*/
  423. sbit OUT1= P0^4;
  424. sbit OUT2= P0^5;
  425. sbit OUT3= P0^6;
  426. sbit OUT4= P0^7;
  427. sbit OUT5= P2^7;
  428. sbit OUT6= P2^6;
  429. sbit OUT7= P2^5;
  430. sbit OUT8= P2^4;
  431. sbit OUT9= P2^3;
  432. sbit OUT10=P2^2;
  433. sbit OUT11=P2^1;
  434. sbit OUT12=P2^0;
  435. /***********************************************************
  436.                             數據定義
  437. ***********************************************************/
  438. unsigned char dat;

  439. /***********************************************************
  440.                             函數定義
  441. ************************************************************/
  442. uint8 Byte_Read(uint16 add);              //讀一字節,調用前需打開IAP 功能
  443. void Byte_Program(uint16 add, uint16 ch);  //字節編程,調用前需打開IAP 功能
  444. void Sector_Erase(uint16 add);            //擦除扇區
  445. void IAP_Disable();                       //關閉IAP 功能
  446. void main()
  447. {
  448.               Sector_Erase(0);              //擦除整個扇區0,用于重新寫新的數據到EEPROM                                                      
  449.   // Byte_Program(0x01,0x65);                  //擦除完成就可以向對應地址寫入數據,  第一個0x01是地址   0x66是要保存的數據
  450.               Byte_Program(0x01,0x66);                  //擦除完成就可以向對應地址寫入數據,  第一個0x01是地址   0x66是要保存的數據
  451.      dat = Byte_Read(0x01);                  //讀取對應地址0x01中eeprom的值

  452.    while(1)
  453.    {
  454.                 if(dat==0x66)                                                        //如果和寫入EEPROM的值一樣,則吸合繼電器
  455.                 {            
  456.                    OUT1=0;
  457.                    OUT2=0;
  458.                             OUT3=0;
  459.                             OUT4=0;
  460.                             OUT5=0;
  461.                             OUT6=0;
  462.                             OUT7=0;
  463.                             OUT8=0;
  464.                             OUT9=0;
  465.                             OUT10=0;
  466.                             OUT11=0;
  467.                             OUT12=0;
  468.                 }
  469.    }
  470. }
  471. union union_temp16
  472. {
  473.     uint16 un_temp16;
  474.     uint8  un_temp8[2];
  475. }my_unTemp16;

  476. //讀一字節,調用前需打開IAP 功能,入口:DPTR = 字節地址,返回:A = 讀出字節
  477. uint8 Byte_Read(uint16 add)
  478. {
  479.     IAP_DATA = 0x00;
  480.     IAP_CONTR = ENABLE_ISP;         //打開IAP 功能, 設置Flash 操作等待時間
  481.     IAP_CMD = 0x01;                 //IAP/ISP/EEPROM 字節讀命令

  482.     my_unTemp16.un_temp16 = add;
  483.     IAP_ADDRH = my_unTemp16.un_temp8[0];    //設置目標單元地址的高8 位地址
  484.     IAP_ADDRL = my_unTemp16.un_temp8[1];    //設置目標單元地址的低8 位地址

  485.     //EA = 0;
  486.     IAP_TRIG = 0x5A;   //先送 5Ah,再送A5h 到ISP/IAP 觸發寄存器,每次都需如此
  487.     IAP_TRIG = 0xA5;   //送完A5h 后,ISP/IAP 命令立即被觸發起動
  488.     _nop_();
  489.     //EA = 1;
  490.     IAP_Disable();  //關閉IAP 功能, 清相關的特殊功能寄存器,使CPU 處于安全狀態,
  491.                     //一次連續的IAP 操作完成之后建議關閉IAP 功能,不需要每次都關
  492.     return (IAP_DATA);
  493. }

  494. //字節編程,調用前需打開IAP 功能,入口:DPTR = 字節地址, A= 須編程字節的數據
  495. void Byte_Program(uint16 add, uint16 ch)
  496. {
  497.     IAP_CONTR = ENABLE_ISP;         //打開 IAP 功能, 設置Flash 操作等待時間
  498.     IAP_CMD = 0x02;                 //IAP/ISP/EEPROM 字節編程命令

  499.     my_unTemp16.un_temp16 = add;
  500.     IAP_ADDRH = my_unTemp16.un_temp8[0];    //設置目標單元地址的高8 位地址
  501.     IAP_ADDRL = my_unTemp16.un_temp8[1];    //設置目標單元地址的低8 位地址

  502.     IAP_DATA = ch;                  //要編程的數據先送進IAP_DATA 寄存器
  503.     //EA = 0;
  504.     IAP_TRIG = 0x5A;   //先送 5Ah,再送A5h 到ISP/IAP 觸發寄存器,每次都需如此
  505.     IAP_TRIG = 0xA5;   //送完A5h 后,ISP/IAP 命令立即被觸發起動
  506.     _nop_();
  507.     //EA = 1;
  508.     IAP_Disable();  //關閉IAP 功能, 清相關的特殊功能寄存器,使CPU 處于安全狀態,
  509.                     //一次連續的IAP 操作完成之后建議關閉IAP 功能,不需要每次都關
  510. }

  511. //擦除扇區, 入口:DPTR = 扇區地址
  512. void Sector_Erase(uint16 add)
  513. {
  514.     IAP_CONTR = ENABLE_ISP;         //打開IAP 功能, 設置Flash 操作等待時間
  515.     IAP_CMD = 0x03;                 //IAP/ISP/EEPROM 扇區擦除命令

  516.     my_unTemp16.un_temp16 = add;
  517.     IAP_ADDRH = my_unTemp16.un_temp8[0];    //設置目標單元地址的高8 位地址
  518.     IAP_ADDRL = my_unTemp16.un_temp8[1];    //設置目標單元地址的低8 位地址

  519.     //EA = 0;
  520.     IAP_TRIG = 0x5A;   //先送 5Ah,再送A5h 到ISP/IAP 觸發寄存器,每次都需如此
  521.     IAP_TRIG = 0xA5;   //送完A5h 后,ISP/IAP 命令立即被觸發起動
  522.     _nop_();
  523.     //EA = 1;
  524.     IAP_Disable();  //關閉IAP 功能, 清相關的特殊功能寄存器,使CPU 處于安全狀態,
  525.                     //一次連續的IAP 操作完成之后建議關閉IAP 功能,不需要每次都關
  526. }

  527. void IAP_Disable()
  528. {
  529.     //關閉IAP 功能, 清相關的特殊功能寄存器,使CPU 處于安全狀態,
  530.     //一次連續的IAP 操作完成之后建議關閉IAP 功能,不需要每次都關
  531.     IAP_CONTR = 0;      //關閉IAP 功能
  532.     IAP_CMD   = 0;      //清命令寄存器,使命令寄存器無命令,此句可不用
  533.     IAP_TRIG  = 0;      //清命令觸發寄存器,使命令觸發寄存器無觸發,此句可不用
  534.     IAP_ADDRH = 0;
  535.     IAP_ADDRL = 0;
  536. }
  537. 05.遙控解碼程序
  538. /********************************************************************
  539.                             匯誠科技
  540. 使用芯片:STC12C5A60S2
  541. 晶振:11.0592MHZ
  542. 編譯環境:Keil
  543. 作者:zhangxinchunleo
  544. *********************************************************************/
  545. /********************************************************************
  546. 程序說明:
  547. 按鍵使用四鍵遙控,
  548.    按下A鍵 ,第一路吸合
  549.    按下B鍵 ,第二路吸合
  550.    按下C鍵 ,第三路吸合
  551.    按下D鍵 ,第四路吸合
  552. **********************************************************************
  553. */
  554. #include "STC12C5A60S2.H"
  555. /********************************************************************
  556.                             初始定義
  557. *********************************************************************/
  558. /*遙控使用
  559. P1^0,P1^1,P1^2,P1^3;   */


  560. /*定義八位輸出*/
  561. sbit OUT1= P0^4;
  562. sbit OUT2= P0^5;
  563. sbit OUT3= P0^6;
  564. sbit OUT4= P0^7;
  565. /*************************************************************************
  566.                              數據定義
  567. **************************************************************************/
  568. unsigned char dat=0;     //讀取P1口的狀態
  569. void main()
  570. {
  571.    while(1)
  572.    {
  573.        dat=P0;
  574.                  if(dat&0x01)   //如果A按下
  575.                      OUT1=0;                //第一路吸合
  576.                  else
  577.                      OUT1=1;
  578.                  if(dat&0x02)                //如果B按下
  579.                      OUT2=0;                //第二路吸合
  580.                  else
  581.                      OUT2=1;
  582.                  if(dat&0x04)                //如果C按下
  583.                       OUT3=0;                //第三路吸合
  584.                  else
  585.                                OUT3=1;
  586.                  if(dat&0x08)                //如果D按下
  587.                                OUT4=0;                //第四路吸合
  588.                  else
  589.                                OUT4=1;
  590.    }
  591. }
  592. 06.IN1模擬量采集程序(0~5V)
  593. /********************************************************************
  594.                             匯誠科技
  595. 使用芯片:STC12C5A60S2
  596. 晶振:11.0592MHZ
  597. 編譯環境:Keil
  598. 作者:zhangxinchunleo
  599. *********************************************************************/
  600. /********************************************************************
  601. 程序說明:
  602.         使用外部顯示模塊TM1650顯示模擬量的值,
  603.                             采集電壓0~5V    對應寄存器的值0到1024   十位分辨率

  604. **********************************************************************
  605. */
  606. /*********************************************************************/
  607. #include "STC12C5A60S2.H"
  608. #include "intrins.h"

  609. //#define FOSC    11059200L
  610. //#define BAUD    9600
  611. #define uchar unsigned char
  612. #define uint  unsigned  int

  613. #define CLK_H  CLK = 1
  614. #define CLK_L  CLK = 0

  615. #define DIO_H  DIO = 1
  616. #define DIO_L  DIO = 0                                 //位的控制端
  617. /********************************************************************
  618.                              初始化設置
  619. *********************************************************************/
  620. //sfr ADC_CONTR   =   0xBC;           //ADC 控制寄存器
  621. //sfr ADC_RES     =   0xBD;           //ADC 轉換結果寄存器
  622. //sfr ADC_LOW2    =   0xBE;           //ADC 低2位結果寄存器
  623. //sfr P1ASF       =   0x9D;           //Pl口模擬功能控制寄存器

  624. /********************************************************************
  625.                               ADC 數據轉換函數
  626. *********************************************************************/

  627. //#define ADC_POWER   0x80            //ADC 電源控制位
  628. //#define ADC_FLAG    0x10            //ADC 轉換結束標志位
  629. //#define ADC_START   0x08            //ADC 開始轉換控制位
  630. //#define ADC_SPEEDLL 0x00            //420 個時鐘周期轉換一次
  631. //#define ADC_SPEEDL  0x20            //280 個時鐘周期轉換一次
  632. //#define ADC_SPEEDH  0x40            //140 個時鐘周期轉換一次
  633. //#define ADC_SPEEDHH 0x60            //70 個時鐘周期轉換一次


  634. uchar CODE[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0~9顯示代碼
  635. uint data1;
  636. sbit CLK = P3^1;
  637. sbit DIO = P3^0;
  638. uint t;
  639. void TM1650_Set(uchar add,uchar dat);                              //顯示函數(地址,數據)
  640. void Init_Tm1650(void);                                                                                      //初始化TM1650函數
  641. void Delay_us(uint);                          //us延時
  642. void TM1650_S(uint);                                                                            //顯示data的值

  643. /********************************************************************
  644.                              延時函數
  645. *********************************************************************/
  646. void Delay1(uint n)
  647. {
  648.    uint x;
  649.     while (n--)
  650.     {
  651.         x = 5000;
  652.         while (x--);
  653.     }
  654. }
  655. /********************************************************************
  656.                               ADC 初始化
  657. *********************************************************************/
  658. void InitADC()
  659. {
  660.     P1ASF = 0xff;                                                //設置P1口為開漏模式,使用AD功能
  661.     ADC_RES = 0;                                                 //AD數據寄存器清空
  662.     ADC_CONTR |=0X80;  //打開AD電源,轉換周期420
  663.     Delay1(2);                                                  //延時
  664. }
  665. /********************************************************************
  666.                               ADC 數據轉換函數
  667. *********************************************************************/
  668. uint GetADCResult(char ch)
  669. {
  670.     ADC_CONTR = 0X88 | ch;//開始轉換
  671.     _nop_();                        //延時一個機器周期
  672.     _nop_();                                                                                    //延時一個機器周期
  673.     _nop_();                                                                                    //延時一個機器周期
  674.     _nop_();                                                                                    //延時一個機器周期
  675.     while (!(ADC_CONTR & 0X10));//等待轉換結束

  676.     ADC_CONTR &=0xEF;         //關閉AD轉換
  677.               t=(ADC_RES<<2)|ADC_RESL;   
  678.     return t;                 //返回數據
  679. }

  680. /********************************************************************
  681.                              主函數
  682. *********************************************************************/
  683. void main()
  684. {
  685.     InitADC();                      //AD轉換初始化
  686.               Init_Tm1650();                 //初始化TM1650
  687.               TM1650_S(0);                  
  688.     while (1)
  689.     {
  690.        TM1650_S(GetADCResult(0));
  691.     }
  692. }


  693. void TM1650_S(uint data1)
  694. {
  695.     uchar xa,xb,xc,xd;                                                      
  696.               xa=data1/1000;                            // 1234/1000   =1;  
  697.               xb=data1%1000/100;               // 1234%1000=234/100=2;     
  698.               xc=data1%100/10;                   //              1234%100=34/10;
  699.               xd=data1%10;                             // 1234%10;
  700.     TM1650_Set(0x68,CODE[xa]);
  701.               TM1650_Set(0x6A,CODE[xb]);
  702.               TM1650_Set(0x6C,CODE[xc]);
  703.               TM1650_Set(0x6E,CODE[xd]);
  704. }
  705. void Delay_us(uint i) //us延時
  706. {
  707.               for(;i>0;i--)
  708.               {
  709.                             _nop_();
  710.               }
  711. }
  712. void I2CStart(void)              //開始信號
  713. {
  714.               CLK_H;
  715.               DIO_H;
  716.               Delay_us(5);
  717.               DIO_L;
  718.             
  719. }

  720. void I2Cask(void) //ACK信號
  721. {
  722.               uchar timeout = 1;
  723.               CLK_H;
  724.               Delay_us(5);
  725.               CLK_L;
  726.               while((DIO)&&(timeout<=100))
  727.               {
  728.                 timeout++;            
  729.               }
  730.               Delay_us(5);
  731.               CLK_L;
  732. }

  733. void I2CStop(void) //停止信號
  734. {
  735.               CLK_H;
  736.               DIO_L;
  737.               Delay_us(5);
  738.               DIO_H;
  739. }

  740. void I2CWrByte(uchar oneByte) //寫一個字節高位在前,低位在后
  741. {
  742.               uchar i;
  743.               CLK_L;
  744.               Delay_us(1);
  745.               for(i=0;i<8;i++)
  746.               {            
  747.                             oneByte = oneByte<<1;
  748.                             DIO = CY;
  749.                             CLK_L;
  750.                             Delay_us(5);
  751.                             CLK_H;
  752.                             Delay_us(5);
  753.                             CLK_L;
  754.               }
  755. }
  756. void TM1650_Set(uchar add,uchar dat) //數碼管顯示
  757. {
  758.               //寫顯存必須從高地址開始寫
  759.               I2CStart();
  760.               I2CWrByte(add); //第一個顯存地址
  761.               I2Cask();
  762.               I2CWrByte(dat);
  763.               I2Cask();
  764.               I2CStop();
  765. }
  766. void Init_Tm1650(void)
  767. {
  768.               TM1650_Set(0x48,0x21);//初始化為5級灰度,開顯示
  769.             
  770. }
  771. /********************************************************************
  772.                               結束
  773.                                                                                                     */
  774. 07.高速脈沖輸入程序
  775. /********************************************************************
  776.                             匯誠科技
  777. 使用芯片:STC12C5A60S2
  778. 晶振:11.0592MHZ
  779. 編譯環境:Keil
  780. 作者:zhangxinchunleo
  781. *********************************************************************/
  782. /********************************************************************
  783. 程序說明:
  784.           高速脈沖使用P3^2(外部中斷0)  P3^3(外部中斷1)來計數。
  785.                               有信號,直接進入中斷,
  786.                               程序中,當脈沖個數達到500K。輸出繼電器 吸合,              外部測試脈沖發生器頻率為166KHz
  787. */
  788. /*********************************************************************/
  789. #include <STC12C5A60S2.H>                      //庫文件
  790. unsigned long dispcount=0; //計數初值
  791. /********************************************************************
  792.                             中斷服務函數
  793. *********************************************************************/
  794. void ExtInt0() interrupt 0 //中斷服務程序
  795. {
  796.               dispcount++; //每按一次中斷按鍵,計數加一
  797. }
  798. /********************************************************************
  799.                             中斷服務函數
  800. *********************************************************************/
  801. void ExtInt1() interrupt 2 //中斷服務程序
  802. {
  803.               dispcount++; //每按一次中斷按鍵,計數加一
  804. }
  805. /********************************************************************
  806.                             主函數
  807. *********************************************************************/
  808. void main()
  809. {
  810.     IT0=1;                   //低電平觸發
  811.     EX0=1;                            //開外部中斷0

  812.               IT1=1;                            //低電平觸發
  813.               EX1=1;                            //開外部中斷1

  814.               EA=1;
  815.               while(1)
  816.               {               
  817.                                if(dispcount>=500000)
  818.                                P2=0X00;
  819.                             else
  820.                                P2=0XFF;
  821.                  

  822.     }
  823. }
  824. 08.定時器使用
  825. /********************************************************************
  826.                             匯誠科技

  827. 使用芯片:STC12C5A60S2
  828. 晶振:11.0592MHZ
  829. 編譯環境:Keil
  830. 作者:zhangxinchunleo
  831. *********************************************************************/
  832. /********************************************************************
  833. 程序說明:
  834.          使用定時器0 和定時器1 使P2口吸合一秒。斷開一秒
  835. **********************************************************************
  836. */

  837. #include <stc12c5a60s2.h>

  838. unsigned int time0,time1;

  839. //定時器0初始化
  840. void t0_init()                 //ms0最大71
  841. {                                                         
  842.      TMOD &=0XF0;
  843.               TMOD |=0X01;  //方式一  一共四種方式   GATE0 C/T0  M0_1  M0_0              C/T0選擇時鐘計數還是外部計數  方式0是十三位定時器 ,方式1是十六位定時器,方式2是八位自動 方式4是兩個八位
  844.               TH0=0XDB;
  845.               TL0=0XEC;
  846.               ET0=1;   //使能T0中斷
  847. //              EA=1;
  848. //              TR0=1;
  849. }
  850. //定時器1初始化
  851. void t1_init()
  852. {
  853.               TMOD &= 0x0f;   //清零T1的控制位
  854.      TMOD |= 0x10;   //配置T1為模式1
  855.      TH1 = 0xDB;     //加載T1重載值
  856.      TL1 = 0XEC;
  857.      ET1 = 1;        //使能T1中斷
  858. //              EA=1;
  859. //              TR1=1;
  860. }
  861. void main()
  862. {
  863.    t0_init();                //定時器0初始化
  864.    t1_init();                //定時器1初始化
  865.    TR0=1;                              //開定時器0
  866.    TR1=1;                              //開定時器1
  867.    EA=1;                              //開總中斷
  868.    while(1)
  869.    {
  870.      ;
  871.    }
  872. }
  873. void t0(void) interrupt 1 using 0 //定時中斷服務函數
  874. {
  875.                 TH0=0xDB;                  //定時器0重新賦值
  876.               TL0=0XEC;
  877.               ++time0;
  878.               if(time0==100)
  879.               {
  880.                  P2=0X00;                                //定時器0讓P2口吸合
  881.               }
  882.               if(time0==200)
  883.               {
  884.                  time0=0;
  885.               }
  886. }
  887. void t1(void) interrupt 3 using 1 //定時中斷服務函數
  888. {
  889.                 TH1=0XDB;                              //定時器1重新賦值
  890.               TL1=0XEC;
  891.               if(++time1==200)    //定時器1讓P2口斷開
  892.               {
  893.                  time1=0;
  894.                  P2=0XFF;
  895.               }
  896. }
  897. 09.外接數碼管TM1650程序
  898. /********************************************************************
  899.                             匯誠科技
  900. 使用芯片:STC12C5A60S2
  901. 晶振:11.0592MHZ
  902. 編譯環境:Keil
  903. 作者:zhangxinchunleo
  904. *********************************************************************/
  905. /********************************************************************
  906. 程序說明:
  907.         使用外部顯示模塊TM1650來顯示一些寄存器的值  (這里顯示data的值)
  908.                   按下第一個按鍵,data清零
  909.                             按下第二個按鍵,data加一
  910.                             按下第三個按鍵,data減一

  911. **********************************************************************
  912. */
  913. #include "stc12c5a60S2.H"
  914. #include<intrins.h>
  915. #define uchar unsigned char
  916. #define uint  unsigned  int

  917. #define CLK_H  CLK = 1
  918. #define CLK_L  CLK = 0

  919. #define DIO_H  DIO = 1
  920. #define DIO_L  DIO = 0

  921. uchar CODE[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0~9顯示代碼
  922. uint data1;
  923. sbit CLK = P3^1;
  924. sbit DIO = P3^0;
  925. uchar key=0;
  926. bit key_flag=0;

  927. void TM1650_Set(uchar add,uchar dat);                              //顯示函數(地址,數據)
  928. uchar Scan_Key(void);                                                                                      //獲取按鍵函數
  929. void Init_Tm1650(void);                                                                                      //初始化TM1650函數
  930. void TM1650_S(uint);                                                                         //顯示data的值
  931. void main()
  932. {
  933.     Init_Tm1650();                 //初始化TM1650
  934.               TM1650_S(0);                  //上電顯示0000
  935.     while(1)
  936.     {
  937.        TM1650_S(data1);                                             //需要顯示的值
  938.        if((Scan_Key()==0x47)&&key_flag==0)                   //如果第一個按鍵按下        0x47和數據手冊相按鍵對應 按下0x47  松開0x07
  939.        {
  940.                    key_flag=1;
  941.                             data1=0;
  942.                  }
  943.                  else if((Scan_Key()==0x4d)&&key_flag==0)              //如果第二個按鍵按下        0x4d和數據手冊相按鍵對應 按下0x4d  松開0x0d
  944.                  {
  945.                     key_flag=1;
  946.                               data1++;
  947.                  }
  948.                  else if((Scan_Key()==0x56)&&key_flag==0)              //如果第三個按鍵按下        0x456和數據手冊相按鍵對應 按下0x47  松開0x16
  949.                  {
  950.                     key_flag=1;
  951.                               data1--;
  952.                  }
  953.                  else  if((Scan_Key()==0x07)||(Scan_Key()==0x0d)||(Scan_Key()==0x16))              //判斷按下按鍵后是否松開,
  954.                  {
  955.                     key_flag=0;
  956.                  }
  957.     }                                         
  958. }

  959. void TM1650_S(uint data1)
  960. {
  961.     uchar xa,xb,xc,xd;                                                      
  962.               xa=data1/1000;                            // 1234/1000   =1;  
  963.               xb=data1%1000/100;               // 1234%1000=234/100=2;     
  964.               xc=data1%100/10;                   //              1234%100=34/10;
  965.               xd=data1%10;                             // 1234%10;
  966.     TM1650_Set(0x68,CODE[xa]);
  967.               TM1650_Set(0x6A,CODE[xb]);
  968.               TM1650_Set(0x6C,CODE[xc]);
  969.               TM1650_Set(0x6E,CODE[xd]);
  970. }
  971. void Delay_us(uint i) //us延時
  972. {
  973.               for(;i>0;i--)
  974.               {
  975.                             _nop_();
  976. //                            _nop_();
  977. //                            _nop_();
  978. //                            _nop_();
  979. //                            _nop_();
  980.               }
  981. }
  982. void I2CStart(void)              //開始信號
  983. {
  984.               CLK_H;
  985.               DIO_H;
  986.               Delay_us(5);
  987.               DIO_L;
  988.             
  989. }

  990. void I2Cask(void) //ACK信號
  991. {
  992.               uchar timeout = 1;
  993.               CLK_H;
  994.               Delay_us(5);
  995.               CLK_L;
  996.               while((DIO)&&(timeout<=100))
  997.               {
  998.                 timeout++;            
  999.               }
  1000.               Delay_us(5);
  1001.               CLK_L;
  1002. }

  1003. void I2CStop(void) //停止信號
  1004. {
  1005.               CLK_H;
  1006.               DIO_L;
  1007.               Delay_us(5);
  1008.               DIO_H;
  1009. }

  1010. void I2CWrByte(uchar oneByte) //寫一個字節高位在前,低位在后
  1011. {
  1012.               uchar i;
  1013.               CLK_L;
  1014.               Delay_us(1);
  1015.               for(i=0;i<8;i++)
  1016.               {            
  1017.                             oneByte = oneByte<<1;
  1018.                             DIO = CY;
  1019.                             CLK_L;
  1020.                             Delay_us(5);
  1021.                             CLK_H;
  1022.                             Delay_us(5);
  1023.                             CLK_L;
  1024.               }
  1025. }

  1026. uchar Scan_Key(void)                // 按鍵掃描
  1027. {
  1028.               uchar i;
  1029.               uchar rekey;
  1030.               I2CStart();
  1031.               I2CWrByte(0x49);//讀按鍵命令
  1032.               I2Cask();
  1033.               //DIO_H;
  1034.               for(i=0;i<8;i++)
  1035.               {
  1036.                  CLK_H;
  1037.                  rekey = rekey<<1;
  1038.                  if(DIO)
  1039.                  {
  1040.                                rekey++;
  1041.                  }
  1042.                  Delay_us(5);
  1043.                  CLK_L;            
  1044.               }
  1045.               I2Cask();
  1046.               I2CStop();
  1047.               return(rekey);
  1048. }


  1049. void TM1650_Set(uchar add,uchar dat) //數碼管顯示
  1050. {
  1051.               //寫顯存必須從高地址開始寫
  1052.               I2CStart();
  1053.               I2CWrByte(add); //第一個顯存地址
  1054.               I2Cask();
  1055.               I2CWrByte(dat);
  1056.               I2Cask();
  1057.               I2CStop();
  1058. }
  1059. void Init_Tm1650(void)
  1060. {
  1061.               TM1650_Set(0x48,0x21);//初始化為5級灰度,開顯示
  1062.             
  1063. }
復制代碼


全部資料51hei下載地址:
GYJ-0094_16路輸入6路輸出繼電器可編程模塊發貨資料.rar (13.08 MB, 下載次數: 26)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩中文一区 | 国产成人精品一区二区 | 人人爽人人草 | 欧美一区二区三区在线观看 | 日韩在线一区二区三区 | 亚洲人成在线播放 | 蜜桃视频在线观看www社区 | 精品动漫一区 | 国产精品久久久亚洲 | 自拍偷拍欧美 | 日韩在线不卡视频 | 美女国产| 999免费网站| 欧美日韩一区精品 | 久久亚洲一区二区三区四区 | 国产精品欧美一区二区三区 | 亚洲精品亚洲人成人网 | 中文字幕一区二区三区四区五区 | 日韩在线一区二区 | 久久噜| 伊人网站 | 日韩高清中文字幕 | 亚洲国产一区二区视频 | 欧美一级一区 | 日日操夜夜操视频 | 日韩成人av在线 | 欧美日韩国产一区二区三区不卡 | 亚洲精品视频久久 | 在线观看你懂的网站 | 国产精品久久久久久久久久久免费看 | 伊人伊人| 国产成人精品久久二区二区 | 国产精品久久久久久久7777 | 日韩一区二区三区在线 | 国产在线精品一区二区三区 | 欧美日韩成人在线 | 国产精品国产三级国产aⅴ浪潮 | 综合激情网 | 午夜av一区二区 | 蜜臀网| 国产精品一级在线观看 |