找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2696|回复: 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 单片机教程网

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