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 使用说明: 【标示图】 【供电接线图】
【通讯及下载接线图】
【模拟量输入接线图】 【光电隔离输入接线图】 特别声明:IN3至IN14低电平有效,输入信号电压支持0~36V。 【高速光耦输入接线图】 【外接315M无线遥控模块】(默认发货不提供接收模块和遥控器需要另外联系销售购买)通过编程实现控制。提供相关例程。 【输出部分标注说明】 【原理图】(提供PDF文件) 【PCB图】(提供PDF文件)
【原件清单】 (提供PDF文件) 【测试程序】(提供源代码及各个模块功能的代码)
【图片展示】 【装壳后效果展示】(可以装在配电柜的DIN导轨上) 【配无线遥控效果图】    【装壳后效果展示】(可以装在配电柜的DIN导轨上)参考图
- 01.一对一点动输出程序
- /********************************************************************
- 汇诚科技
- 使用芯片:STC12C5A60S2
- 晶振:11.0592MHZ
- 编译环境:Keil
- 作者:zhangxinchunleo
- *********************************************************************/
- /********************************************************************
- 程序说明:
- //模拟量输入(这里用作普通IO口,高电平触发)
- 当IN1口与+5V口接通后, 对应的继电器吸合,OUT1接通
-
- //第一组普通开光量输入(可做脉冲输入,最大1Khz的脉冲)
- 当IN2口与GND口接通后, 对应的继电器吸合,OUT2接通
- 当IN3口与GND口接通后, 对应的继电器吸合,OUT3接通
- 当IN4口与GND口接通后, 对应的继电器吸合,OUT4接通
- 当IN5口与GND口接通后, 对应的继电器吸合,OUT5接通
- 当IN6口与GND口接通后, 对应的继电器吸合,OUT6接通
- 当IN7口与GND口接通后, 对应的继电器吸合,OUT7接通
- //第二组普通开光量输入(可做脉冲输入,最大1Khz的脉冲)
- 当IN8口与GND口接通后, 对应的继电器吸合,OUT8接通
- 当IN9口与GND口接通后, 对应的继电器吸合,OUT9接通
- 当IN10口与GND口接通后,对应的继电器吸合,OUT10接通
- 当IN11口与GND口接通后,对应的继电器吸合,OUT11接通
- 当IN12口与GND口接通后,对应的继电器吸合,OUT12接通
- 当IN13口与GND口接通后,对应的继电器吸合,OUT1接通
- //高速脉冲输入(最大100KHz)(也可作普通IO口用)
- 当IN14口与GND口接通后,对应的继电器吸合,OUT2接通
- 当IN15口与GND口接通后,对应的继电器吸合,OUT3接通
- **********************************************************************
- */
- #include "STC12C5A60S2.H"
- /********************************************************************
- 初始定义
- *********************************************************************/
- /*定义十四个输入*/
- //模拟量接口,做普通IO口时,高定平有效(这里用做普通IO口)
- sbit IN1=P1^0;
- //开光量输入 低电平有效
- sbit IN2=P1^1;
- sbit IN3=P1^4;
- sbit IN4=P1^5;
- sbit IN5=P1^6;
- sbit IN6=P1^7;
- sbit IN7=P3^4;
- sbit IN8=P3^5;
- sbit IN9=P3^6;
- sbit IN10=P3^7;
- sbit IN11=P4^6;
- sbit IN12=P4^5;
- sbit IN13=P4^4;
- //高速脉冲输入, 触发信号高低可选
- sbit IN14=P3^2;
- sbit IN15=P3^3;
-
- /*定义八位输出*/
- sbit OUT1= P0^4;
- sbit OUT2= P0^5;
- sbit OUT3= P0^6;
- sbit OUT4= P0^7;
- sbit OUT5= P2^7;
- sbit OUT6= P2^6;
- sbit OUT7= P2^5;
- sbit OUT8= P2^4;
- sbit OUT9= P2^3;
- sbit OUT10=P2^2;
- sbit OUT11=P2^1;
- sbit OUT12=P2^0;
- void main()
- {
- P1M1|=0X01; //0000 0001 //因为此IO口直接引出,外加下拉电阻。所以配置IO口的时候需要把它设定为“开漏模式”
- P1M0|=0X01; //0000 0001
- P4M1|=0x70; //0111 0000 //P4口设置为“输入模式”
- P4M0 =0x00; //0000 0000
- P4SW|=0x40; //0100 0000 //P4^6设置成普通IO口
- while(1)
- {
- if(IN1==1) OUT1=0; else OUT1=1;
- if(IN2==0) OUT2=0; else OUT2=1;
- if(IN3==0) OUT3=0; else OUT3=1;
- if(IN4==0) OUT4=0; else OUT4=1;
- if(IN5==0) OUT5=0; else OUT5=1;
- if(IN6==0) OUT6=0; else OUT6=1;
- if(IN7==0) OUT7=0; else OUT7=1;
- if(IN8==0) OUT8=0; else OUT8=1;
- if(IN9==0) OUT9=0; else OUT9=1;
- if(IN10==0) OUT10=0; else OUT10=1;
- if(IN11==0) OUT11=0; else OUT11=1;
- if(IN12==0) OUT12=0; else OUT12=1;
- if(IN13==0) OUT1=0; else OUT1=1;
- if(IN14==0) OUT2=0; else OUT2=1;
- if(IN15==0) OUT3=0; else OUT3=1;
- }
- }
- 02.串口通讯程序
- /********************************************************************
- 汇诚科技
- 使用芯片:STC12C5A60S2
- 晶振:11.0592MHZ
- 编译环境:Keil
- 作者:zhangxinchunleo
- 【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!
-
- *********************************************************************/
- /********************************************************************
- 程序说明:
- 上位机通过串口一发送十六进制0xff 继电器全开
- 发送十六进制0x00 继电器全关
- 触发IN2,板子会向上位机发送 0x01
-
- **********************************************************************
- */
- #include "STC12C5A60S2.H"
- /********************************************************************
- 初始定义
- *********************************************************************/
- /*定义十四个输入*/
- //模拟量接口,做普通IO口时,高定平有效(这里用做普通IO口)
- sbit IN1=P1^0;
- //开光量输入 低电平有效
- sbit IN2=P1^1;
- sbit IN3=P1^4;
- sbit IN4=P1^5;
- sbit IN5=P1^6;
- sbit IN6=P1^7;
- sbit IN7=P3^4;
- sbit IN8=P3^5;
- sbit IN9=P3^6;
- sbit IN10=P3^7;
- sbit IN11=P4^6;
- sbit IN12=P4^5;
- sbit IN13=P4^4;
- //高速脉冲输入, 触发信号高低可选
- sbit IN14=P3^2;
- sbit IN15=P3^3;
- /*定义八位输出*/
- sbit OUT1= P0^4;
- sbit OUT2= P0^5;
- sbit OUT3= P0^6;
- sbit OUT4= P0^7;
- sbit OUT5= P2^7;
- sbit OUT6= P2^6;
- sbit OUT7= P2^5;
- sbit OUT8= P2^4;
- sbit OUT9= P2^3;
- sbit OUT10=P2^2;
- sbit OUT11=P2^1;
- sbit OUT12=P2^0;
- /***********************************************************
- 数据定义
- ***********************************************************/
- unsigned char dat=0xA1;
-
- /********************************************************************
- 函数定义
- *********************************************************************/
- //延时函数
- void delay ( unsigned char t )
- {
- unsigned char i,j;
- for( i=0; i<t; i++)
- for( j=0; j<250; j++);
- }
- //初始化定义函数
- void init()
- {
- //IO口配置
- P1M1|=0X01; //0000 0001 //因为此IO口直接引出,外加下拉电阻。所以配置IO口的时候需要把它设定为“开漏模式”
- P1M0|=0X01; //0000 0001
- P4M1|=0x70; //0111 0000 //P4口设置为“输入模式”
- P4M0 =0x00; //0000 0000
- P4SW|=0x40; //0100 0000 //P4^6设置成普通IO口
-
- //串口一配置
- TMOD=0x20; //定时器一产生波特率
- SCON=0x50; //方式一,八位数据位,一位停止位
- TH1=0XFD; //波特率9600
- TL1=0xFD;
- TR1=1;
- ES=1;
- EA=1;
- }
- void main()
- {
-
- init();
-
- while(1)
- {
- if(dat==0xFF)
- {
- dat=0xA1;
- OUT1=0;
- OUT2=0;
- OUT3=0;
- OUT4=0;
- OUT5=0;
- OUT6=0;
- OUT7=0;
- OUT8=0;
- OUT9=0;
- OUT10=0;
- OUT11=0;
- OUT12=0;
- }
- if(dat==0x00)
- {
- dat=0xA1;
- OUT1=1;
- OUT2=1;
- OUT3=1;
- OUT4=1;
- OUT5=1;
- OUT6=1;
- OUT7=1;
- OUT8=1;
- OUT9=1;
- OUT10=1;
- OUT11=1;
- OUT12=1;
- }
- if(IN2==0x00)
- {
- delay(10);
- if(IN2==0X00)
- SBUF=0X01;
- while(!IN2);
- }
- }
- }
-
- /*--------------------------------------
- 串口一 接收中断函数
- --------------------------------------*/
-
- void uart_isr() interrupt 4 using 2
- {
- if( RI )
- {
- RI=0;
- dat=SBUF;
- }
- if(TI)
- TI=0;
-
- }
- 03.485通讯程序
- /********************************************************************
- 汇诚科技
- 使用芯片:STC12C5A60S2
- 晶振:11.0592MHZ
- 编译环境:Keil
- 作者:zhangxinchunleo
- *********************************************************************/
- /********************************************************************
- 程序说明:
- 上位机通过485发送十六进制0xff 继电器全开
- 发送十六进制0x00 继电器全关
- 触发IN2,板子会向上位机发送 0x01
-
- **********************************************************************
- */
- #include "STC12C5A60S2.H"
- /********************************************************************
- 初始定义
- *********************************************************************/
- /*定义十四个输入*/
- //模拟量接口,做普通IO口时,高定平有效(这里用做普通IO口)
- sbit IN1=P1^0;
- //开光量输入 低电平有效
- sbit IN2=P1^1;
- sbit IN3=P1^4;
- sbit IN4=P1^5;
- sbit IN5=P1^6;
- sbit IN6=P1^7;
- sbit IN7=P3^4;
- sbit IN8=P3^5;
- sbit IN9=P3^6;
- sbit IN10=P3^7;
- sbit IN11=P4^6;
- sbit IN12=P4^5;
- sbit IN13=P4^4;
- //高速脉冲输入, 触发信号高低可选
- sbit IN14=P3^2;
- sbit IN15=P3^3;
- /*定义八位输出*/
- sbit OUT1= P0^4;
- sbit OUT2= P0^5;
- sbit OUT3= P0^6;
- sbit OUT4= P0^7;
- sbit OUT5= P2^7;
- sbit OUT6= P2^6;
- sbit OUT7= P2^5;
- sbit OUT8= P2^4;
- sbit OUT9= P2^3;
- sbit OUT10=P2^2;
- sbit OUT11=P2^1;
- sbit OUT12=P2^0;
- /***********************************************************
- 数据定义
- ***********************************************************/
- unsigned char dat=0xA1;
-
- /********************************************************************
- 函数定义
- *********************************************************************/
- //延时函数
- void delay ( unsigned char t )
- {
- unsigned char i,j;
- for( i=0; i<t; i++)
- for( j=0; j<250; j++);
- }
- //初始化定义函数
- void init()
- {
- //IO口配置
- P1M1|=0X01; //0000 0001 //因为此IO口直接引出,外加下拉电阻。所以配置IO口的时候需要把它设定为“开漏模式”
- P1M0|=0X01; //0000 0001
- P4M1|=0x70; //0111 0000 //P4口设置为“输入模式”
- P4M0 =0x00; //0000 0000
- P4SW|=0x40; //0100 0000 //P4^6设置成普通IO口
-
- //485配置
- S2CON=0x50; //方式1,八位数据,可变波特率
- AUXR1=0x00; //1T工作方式
- BRT = 256 - (11059200/12/32)/9600; //BRT=0XFD; //设置波特率9600
-
- AUXR=0x10; //启动波特率发生器
- IE2=0x01; //开串口2中断
- EA=1;
- }
- void main()
- {
-
- init();
-
- while(1)
- {
- if(dat==0xFF)
- {
- dat=0xA1;
- OUT1=0;
- OUT2=0;
- OUT3=0;
- OUT4=0;
- OUT5=0;
- OUT6=0;
- OUT7=0;
- OUT8=0;
- OUT9=0;
- OUT10=0;
- OUT11=0;
- OUT12=0;
- }
- if(dat==0x00)
- {
- dat=0xA1;
- OUT1=1;
- OUT2=1;
- OUT3=1;
- OUT4=1;
- OUT5=1;
- OUT6=1;
- OUT7=1;
- OUT8=1;
- OUT9=1;
- OUT10=1;
- OUT11=1;
- OUT12=1;
- }
- if(IN2==0x00)
- {
- delay(10);
- if(IN2==0X00)
- S2BUF=0X01;
- while(!IN2);
- }
- }
- }
-
- /************485发送接收中断函数******/
- void uart2_isr() interrupt 8
- {
- if( S2CON & 0x01 )
- {
- S2CON &=~0x01;
- dat = S2BUF;
- }
- if( S2CON & 0x02 )
- {
- S2CON&=0xfd;
- }
- }
- 04.掉电存储程序
- /********************************************************************
- 汇诚科技
- 使用芯片:STC12C5A60S2
- 晶振:11.0592MHZ
- 编译环境:Keil
- 作者:zhangxinchunleo
- *********************************************************************/
- /********************************************************************
- 程序说明:
- 向内部eeprom中写数据,然后再读取出来,
- 如果正确继电器全部吸合,
- 如果不正确继电器全部断开
-
- **********************************************************************
- */
- #include "STC12C5A60S2.H"
- #include <intrins.h> //用nop函数延时的头文件
-
- typedef unsigned char uint8;
- typedef unsigned int uint16;
-
- #define ENABLE_ISP 0x82 //系统工作时钟<20MHz 时,对IAP_CONTR 寄存器设置此值
- /********************************************************************
- 初始定义
- *********************************************************************/
- /*定义十四个输入*/
- //模拟量接口,做普通IO口时,高定平有效(这里用做普通IO口)
- sbit IN1=P1^0;
- //开光量输入 低电平有效
- sbit IN2=P1^1;
- sbit IN3=P1^4;
- sbit IN4=P1^5;
- sbit IN5=P1^6;
- sbit IN6=P1^7;
- sbit IN7=P3^4;
- sbit IN8=P3^5;
- sbit IN9=P3^6;
- sbit IN10=P3^7;
- sbit IN11=P4^6;
- sbit IN12=P4^5;
- sbit IN13=P4^4;
- //高速脉冲输入, 触发信号高低可选
- sbit IN14=P3^2;
- sbit IN15=P3^3;
- /*定义八位输出*/
- sbit OUT1= P0^4;
- sbit OUT2= P0^5;
- sbit OUT3= P0^6;
- sbit OUT4= P0^7;
- sbit OUT5= P2^7;
- sbit OUT6= P2^6;
- sbit OUT7= P2^5;
- sbit OUT8= P2^4;
- sbit OUT9= P2^3;
- sbit OUT10=P2^2;
- sbit OUT11=P2^1;
- sbit OUT12=P2^0;
- /***********************************************************
- 数据定义
- ***********************************************************/
- unsigned char dat;
-
- /***********************************************************
- 函数定义
- ************************************************************/
- uint8 Byte_Read(uint16 add); //读一字节,调用前需打开IAP 功能
- void Byte_Program(uint16 add, uint16 ch); //字节编程,调用前需打开IAP 功能
- void Sector_Erase(uint16 add); //擦除扇区
- void IAP_Disable(); //关闭IAP 功能
- void main()
- {
- Sector_Erase(0); //擦除整个扇区0,用于重新写新的数据到EEPROM
- // Byte_Program(0x01,0x65); //擦除完成就可以向对应地址写入数据, 第一个0x01是地址 0x66是要保存的数据
- Byte_Program(0x01,0x66); //擦除完成就可以向对应地址写入数据, 第一个0x01是地址 0x66是要保存的数据
- dat = Byte_Read(0x01); //读取对应地址0x01中eeprom的值
-
- while(1)
- {
- if(dat==0x66) //如果和写入EEPROM的值一样,则吸合继电器
- {
- OUT1=0;
- OUT2=0;
- OUT3=0;
- OUT4=0;
- OUT5=0;
- OUT6=0;
- OUT7=0;
- OUT8=0;
- OUT9=0;
- OUT10=0;
- OUT11=0;
- OUT12=0;
- }
- }
- }
- union union_temp16
- {
- uint16 un_temp16;
- uint8 un_temp8[2];
- }my_unTemp16;
-
- //读一字节,调用前需打开IAP 功能,入口:DPTR = 字节地址,返回:A = 读出字节
- uint8 Byte_Read(uint16 add)
- {
- IAP_DATA = 0x00;
- IAP_CONTR = ENABLE_ISP; //打开IAP 功能, 设置Flash 操作等待时间
- IAP_CMD = 0x01; //IAP/ISP/EEPROM 字节读命令
-
- my_unTemp16.un_temp16 = add;
- IAP_ADDRH = my_unTemp16.un_temp8[0]; //设置目标单元地址的高8 位地址
- IAP_ADDRL = my_unTemp16.un_temp8[1]; //设置目标单元地址的低8 位地址
-
- //EA = 0;
- IAP_TRIG = 0x5A; //先送 5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此
- IAP_TRIG = 0xA5; //送完A5h 后,ISP/IAP 命令立即被触发起动
- _nop_();
- //EA = 1;
- IAP_Disable(); //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
- //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
- return (IAP_DATA);
- }
-
- //字节编程,调用前需打开IAP 功能,入口:DPTR = 字节地址, A= 须编程字节的数据
- void Byte_Program(uint16 add, uint16 ch)
- {
- IAP_CONTR = ENABLE_ISP; //打开 IAP 功能, 设置Flash 操作等待时间
- IAP_CMD = 0x02; //IAP/ISP/EEPROM 字节编程命令
-
- my_unTemp16.un_temp16 = add;
- IAP_ADDRH = my_unTemp16.un_temp8[0]; //设置目标单元地址的高8 位地址
- IAP_ADDRL = my_unTemp16.un_temp8[1]; //设置目标单元地址的低8 位地址
-
- IAP_DATA = ch; //要编程的数据先送进IAP_DATA 寄存器
- //EA = 0;
- IAP_TRIG = 0x5A; //先送 5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此
- IAP_TRIG = 0xA5; //送完A5h 后,ISP/IAP 命令立即被触发起动
- _nop_();
- //EA = 1;
- IAP_Disable(); //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
- //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
- }
-
- //擦除扇区, 入口:DPTR = 扇区地址
- void Sector_Erase(uint16 add)
- {
- IAP_CONTR = ENABLE_ISP; //打开IAP 功能, 设置Flash 操作等待时间
- IAP_CMD = 0x03; //IAP/ISP/EEPROM 扇区擦除命令
-
- my_unTemp16.un_temp16 = add;
- IAP_ADDRH = my_unTemp16.un_temp8[0]; //设置目标单元地址的高8 位地址
- IAP_ADDRL = my_unTemp16.un_temp8[1]; //设置目标单元地址的低8 位地址
-
- //EA = 0;
- IAP_TRIG = 0x5A; //先送 5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此
- IAP_TRIG = 0xA5; //送完A5h 后,ISP/IAP 命令立即被触发起动
- _nop_();
- //EA = 1;
- IAP_Disable(); //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
- //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
- }
-
- void IAP_Disable()
- {
- //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
- //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
- IAP_CONTR = 0; //关闭IAP 功能
- IAP_CMD = 0; //清命令寄存器,使命令寄存器无命令,此句可不用
- IAP_TRIG = 0; //清命令触发寄存器,使命令触发寄存器无触发,此句可不用
- IAP_ADDRH = 0;
- IAP_ADDRL = 0;
- }
- 05.遥控解码程序
- /********************************************************************
- 汇诚科技
- 使用芯片:STC12C5A60S2
- 晶振:11.0592MHZ
- 编译环境:Keil
- 作者:zhangxinchunleo
- *********************************************************************/
- /********************************************************************
- 程序说明:
- 按键使用四键遥控,
- 按下A键 ,第一路吸合
- 按下B键 ,第二路吸合
- 按下C键 ,第三路吸合
- 按下D键 ,第四路吸合
- **********************************************************************
- */
- #include "STC12C5A60S2.H"
- /********************************************************************
- 初始定义
- *********************************************************************/
- /*遥控使用
- P1^0,P1^1,P1^2,P1^3; */
-
-
- /*定义八位输出*/
- sbit OUT1= P0^4;
- sbit OUT2= P0^5;
- sbit OUT3= P0^6;
- sbit OUT4= P0^7;
- /*************************************************************************
- 数据定义
- **************************************************************************/
- unsigned char dat=0; //读取P1口的状态
- void main()
- {
- while(1)
- {
- dat=P0;
- if(dat&0x01) //如果A按下
- OUT1=0; //第一路吸合
- else
- OUT1=1;
- if(dat&0x02) //如果B按下
- OUT2=0; //第二路吸合
- else
- OUT2=1;
- if(dat&0x04) //如果C按下
- OUT3=0; //第三路吸合
- else
- OUT3=1;
- if(dat&0x08) //如果D按下
- OUT4=0; //第四路吸合
- else
- OUT4=1;
- }
- }
- 06.IN1模拟量采集程序(0~5V)
- /********************************************************************
- 汇诚科技
- 使用芯片:STC12C5A60S2
- 晶振:11.0592MHZ
- 编译环境:Keil
- 作者:zhangxinchunleo
- *********************************************************************/
- /********************************************************************
- 程序说明:
- 使用外部显示模块TM1650显示模拟量的值,
- 采集电压0~5V 对应寄存器的值0到1024 十位分辨率
-
- **********************************************************************
- */
- /*********************************************************************/
- #include "STC12C5A60S2.H"
- #include "intrins.h"
-
- //#define FOSC 11059200L
- //#define BAUD 9600
- #define uchar unsigned char
- #define uint unsigned int
-
- #define CLK_H CLK = 1
- #define CLK_L CLK = 0
-
- #define DIO_H DIO = 1
- #define DIO_L DIO = 0 //位的控制端
- /********************************************************************
- 初始化设置
- *********************************************************************/
- //sfr ADC_CONTR = 0xBC; //ADC 控制寄存器
- //sfr ADC_RES = 0xBD; //ADC 转换结果寄存器
- //sfr ADC_LOW2 = 0xBE; //ADC 低2位结果寄存器
- //sfr P1ASF = 0x9D; //Pl口模拟功能控制寄存器
-
- /********************************************************************
- ADC 数据转换函数
- *********************************************************************/
-
- //#define ADC_POWER 0x80 //ADC 电源控制位
- //#define ADC_FLAG 0x10 //ADC 转换结束标志位
- //#define ADC_START 0x08 //ADC 开始转换控制位
- //#define ADC_SPEEDLL 0x00 //420 个时钟周期转换一次
- //#define ADC_SPEEDL 0x20 //280 个时钟周期转换一次
- //#define ADC_SPEEDH 0x40 //140 个时钟周期转换一次
- //#define ADC_SPEEDHH 0x60 //70 个时钟周期转换一次
-
-
- uchar CODE[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0~9显示代码
- uint data1;
- sbit CLK = P3^1;
- sbit DIO = P3^0;
- uint t;
- void TM1650_Set(uchar add,uchar dat); //显示函数(地址,数据)
- void Init_Tm1650(void); //初始化TM1650函数
- void Delay_us(uint); //us延时
- void TM1650_S(uint); //显示data的值
-
- /********************************************************************
- 延时函数
- *********************************************************************/
- void Delay1(uint n)
- {
- uint x;
- while (n--)
- {
- x = 5000;
- while (x--);
- }
- }
- /********************************************************************
- ADC 初始化
- *********************************************************************/
- void InitADC()
- {
- P1ASF = 0xff; //设置P1口为开漏模式,使用AD功能
- ADC_RES = 0; //AD数据寄存器清空
- ADC_CONTR |=0X80; //打开AD电源,转换周期420
- Delay1(2); //延时
- }
- /********************************************************************
- ADC 数据转换函数
- *********************************************************************/
- uint GetADCResult(char ch)
- {
- ADC_CONTR = 0X88 | ch;//开始转换
- _nop_(); //延时一个机器周期
- _nop_(); //延时一个机器周期
- _nop_(); //延时一个机器周期
- _nop_(); //延时一个机器周期
- while (!(ADC_CONTR & 0X10));//等待转换结束
-
- ADC_CONTR &=0xEF; //关闭AD转换
- t=(ADC_RES<<2)|ADC_RESL;
- return t; //返回数据
- }
-
- /********************************************************************
- 主函数
- *********************************************************************/
- void main()
- {
- InitADC(); //AD转换初始化
- Init_Tm1650(); //初始化TM1650
- TM1650_S(0);
- while (1)
- {
- TM1650_S(GetADCResult(0));
- }
- }
-
-
- void TM1650_S(uint data1)
- {
- uchar xa,xb,xc,xd;
- xa=data1/1000; // 1234/1000 =1;
- xb=data1%1000/100; // 1234%1000=234/100=2;
- xc=data1%100/10; // 1234%100=34/10;
- xd=data1%10; // 1234%10;
- TM1650_Set(0x68,CODE[xa]);
- TM1650_Set(0x6A,CODE[xb]);
- TM1650_Set(0x6C,CODE[xc]);
- TM1650_Set(0x6E,CODE[xd]);
- }
- void Delay_us(uint i) //us延时
- {
- for(;i>0;i--)
- {
- _nop_();
- }
- }
- void I2CStart(void) //开始信号
- {
- CLK_H;
- DIO_H;
- Delay_us(5);
- DIO_L;
-
- }
-
- void I2Cask(void) //ACK信号
- {
- uchar timeout = 1;
- CLK_H;
- Delay_us(5);
- CLK_L;
- while((DIO)&&(timeout<=100))
- {
- timeout++;
- }
- Delay_us(5);
- CLK_L;
- }
-
- void I2CStop(void) //停止信号
- {
- CLK_H;
- DIO_L;
- Delay_us(5);
- DIO_H;
- }
-
- void I2CWrByte(uchar oneByte) //写一个字节高位在前,低位在后
- {
- uchar i;
- CLK_L;
- Delay_us(1);
- for(i=0;i<8;i++)
- {
- oneByte = oneByte<<1;
- DIO = CY;
- CLK_L;
- Delay_us(5);
- CLK_H;
- Delay_us(5);
- CLK_L;
- }
- }
- void TM1650_Set(uchar add,uchar dat) //数码管显示
- {
- //写显存必须从高地址开始写
- I2CStart();
- I2CWrByte(add); //第一个显存地址
- I2Cask();
- I2CWrByte(dat);
- I2Cask();
- I2CStop();
- }
- void Init_Tm1650(void)
- {
- TM1650_Set(0x48,0x21);//初始化为5级灰度,开显示
-
- }
- /********************************************************************
- 结束
- */
- 07.高速脉冲输入程序
- /********************************************************************
- 汇诚科技
- 使用芯片:STC12C5A60S2
- 晶振:11.0592MHZ
- 编译环境:Keil
- 作者:zhangxinchunleo
- *********************************************************************/
- /********************************************************************
- 程序说明:
- 高速脉冲使用P3^2(外部中断0) P3^3(外部中断1)来计数。
- 有信号,直接进入中断,
- 程序中,当脉冲个数达到500K。输出继电器 吸合, 外部测试脉冲发生器频率为166KHz
- */
- /*********************************************************************/
- #include <STC12C5A60S2.H> //库文件
- unsigned long dispcount=0; //计数初值
- /********************************************************************
- 中断服务函数
- *********************************************************************/
- void ExtInt0() interrupt 0 //中断服务程序
- {
- dispcount++; //每按一次中断按键,计数加一
- }
- /********************************************************************
- 中断服务函数
- *********************************************************************/
- void ExtInt1() interrupt 2 //中断服务程序
- {
- dispcount++; //每按一次中断按键,计数加一
- }
- /********************************************************************
- 主函数
- *********************************************************************/
- void main()
- {
- IT0=1; //低电平触发
- EX0=1; //开外部中断0
-
- IT1=1; //低电平触发
- EX1=1; //开外部中断1
-
- EA=1;
- while(1)
- {
- if(dispcount>=500000)
- P2=0X00;
- else
- P2=0XFF;
-
-
- }
- }
- 08.定时器使用
- /********************************************************************
- 汇诚科技
-
- 使用芯片:STC12C5A60S2
- 晶振:11.0592MHZ
- 编译环境:Keil
- 作者:zhangxinchunleo
- *********************************************************************/
- /********************************************************************
- 程序说明:
- 使用定时器0 和定时器1 使P2口吸合一秒。断开一秒
- **********************************************************************
- */
-
- #include <stc12c5a60s2.h>
-
- unsigned int time0,time1;
-
- //定时器0初始化
- void t0_init() //ms0最大71
- {
- TMOD &=0XF0;
- TMOD |=0X01; //方式一 一共四种方式 GATE0 C/T0 M0_1 M0_0 C/T0选择时钟计数还是外部计数 方式0是十三位定时器 ,方式1是十六位定时器,方式2是八位自动 方式4是两个八位
- TH0=0XDB;
- TL0=0XEC;
- ET0=1; //使能T0中断
- // EA=1;
- // TR0=1;
- }
- //定时器1初始化
- void t1_init()
- {
- TMOD &= 0x0f; //清零T1的控制位
- TMOD |= 0x10; //配置T1为模式1
- TH1 = 0xDB; //加载T1重载值
- TL1 = 0XEC;
- ET1 = 1; //使能T1中断
- // EA=1;
- // TR1=1;
- }
- void main()
- {
- t0_init(); //定时器0初始化
- t1_init(); //定时器1初始化
- TR0=1; //开定时器0
- TR1=1; //开定时器1
- EA=1; //开总中断
- while(1)
- {
- ;
- }
- }
- void t0(void) interrupt 1 using 0 //定时中断服务函数
- {
- TH0=0xDB; //定时器0重新赋值
- TL0=0XEC;
- ++time0;
- if(time0==100)
- {
- P2=0X00; //定时器0让P2口吸合
- }
- if(time0==200)
- {
- time0=0;
- }
- }
- void t1(void) interrupt 3 using 1 //定时中断服务函数
- {
- TH1=0XDB; //定时器1重新赋值
- TL1=0XEC;
- if(++time1==200) //定时器1让P2口断开
- {
- time1=0;
- P2=0XFF;
- }
- }
- 09.外接数码管TM1650程序
- /********************************************************************
- 汇诚科技
- 使用芯片:STC12C5A60S2
- 晶振:11.0592MHZ
- 编译环境:Keil
- 作者:zhangxinchunleo
- *********************************************************************/
- /********************************************************************
- 程序说明:
- 使用外部显示模块TM1650来显示一些寄存器的值 (这里显示data的值)
- 按下第一个按键,data清零
- 按下第二个按键,data加一
- 按下第三个按键,data减一
-
- **********************************************************************
- */
- #include "stc12c5a60S2.H"
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
-
- #define CLK_H CLK = 1
- #define CLK_L CLK = 0
-
- #define DIO_H DIO = 1
- #define DIO_L DIO = 0
-
- uchar CODE[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0~9显示代码
- uint data1;
- sbit CLK = P3^1;
- sbit DIO = P3^0;
- uchar key=0;
- bit key_flag=0;
-
- void TM1650_Set(uchar add,uchar dat); //显示函数(地址,数据)
- uchar Scan_Key(void); //获取按键函数
- void Init_Tm1650(void); //初始化TM1650函数
- void TM1650_S(uint); //显示data的值
- void main()
- {
- Init_Tm1650(); //初始化TM1650
- TM1650_S(0); //上电显示0000
- while(1)
- {
- TM1650_S(data1); //需要显示的值
- if((Scan_Key()==0x47)&&key_flag==0) //如果第一个按键按下 0x47和数据手册相按键对应 按下0x47 松开0x07
- {
- key_flag=1;
- data1=0;
- }
- else if((Scan_Key()==0x4d)&&key_flag==0) //如果第二个按键按下 0x4d和数据手册相按键对应 按下0x4d 松开0x0d
- {
- key_flag=1;
- data1++;
- }
- else if((Scan_Key()==0x56)&&key_flag==0) //如果第三个按键按下 0x456和数据手册相按键对应 按下0x47 松开0x16
- {
- key_flag=1;
- data1--;
- }
- else if((Scan_Key()==0x07)||(Scan_Key()==0x0d)||(Scan_Key()==0x16)) //判断按下按键后是否松开,
- {
- key_flag=0;
- }
- }
- }
-
- void TM1650_S(uint data1)
- {
- uchar xa,xb,xc,xd;
- xa=data1/1000; // 1234/1000 =1;
- xb=data1%1000/100; // 1234%1000=234/100=2;
- xc=data1%100/10; // 1234%100=34/10;
- xd=data1%10; // 1234%10;
- TM1650_Set(0x68,CODE[xa]);
- TM1650_Set(0x6A,CODE[xb]);
- TM1650_Set(0x6C,CODE[xc]);
- TM1650_Set(0x6E,CODE[xd]);
- }
- void Delay_us(uint i) //us延时
- {
- for(;i>0;i--)
- {
- _nop_();
- // _nop_();
- // _nop_();
- // _nop_();
- // _nop_();
- }
- }
- void I2CStart(void) //开始信号
- {
- CLK_H;
- DIO_H;
- Delay_us(5);
- DIO_L;
-
- }
-
- void I2Cask(void) //ACK信号
- {
- uchar timeout = 1;
- CLK_H;
- Delay_us(5);
- CLK_L;
- while((DIO)&&(timeout<=100))
- {
- timeout++;
- }
- Delay_us(5);
- CLK_L;
- }
-
- void I2CStop(void) //停止信号
- {
- CLK_H;
- DIO_L;
- Delay_us(5);
- DIO_H;
- }
-
- void I2CWrByte(uchar oneByte) //写一个字节高位在前,低位在后
- {
- uchar i;
- CLK_L;
- Delay_us(1);
- for(i=0;i<8;i++)
- {
- oneByte = oneByte<<1;
- DIO = CY;
- CLK_L;
- Delay_us(5);
- CLK_H;
- Delay_us(5);
- CLK_L;
- }
- }
-
- uchar Scan_Key(void) // 按键扫描
- {
- uchar i;
- uchar rekey;
- I2CStart();
- I2CWrByte(0x49);//读按键命令
- I2Cask();
- //DIO_H;
- for(i=0;i<8;i++)
- {
- CLK_H;
- rekey = rekey<<1;
- if(DIO)
- {
- rekey++;
- }
- Delay_us(5);
- CLK_L;
- }
- I2Cask();
- I2CStop();
- return(rekey);
- }
-
-
- void TM1650_Set(uchar add,uchar dat) //数码管显示
- {
- //写显存必须从高地址开始写
- I2CStart();
- I2CWrByte(add); //第一个显存地址
- I2Cask();
- I2CWrByte(dat);
- I2Cask();
- I2CStop();
- }
- void Init_Tm1650(void)
- {
- TM1650_Set(0x48,0x21);//初始化为5级灰度,开显示
-
- }
复制代码
全部资料51hei下载地址:
|