15路继电器可编程模块485及232使用手册 简要说明: 一、 尺寸:长181mmX宽152mmX高25mm 二、 主要芯片:STC12C5A60S2(支持51单片机) 三、 工作电压:直流12伏(另有24V继电器)
四、串口下载程序 五、输出供电采用延时接通电路
功能:当输出接有被控制设备,避免单片机初次上电(或下载程序)时,输出设备误动作。此功能在实际应用中起到很大作用
六、 特点:
1、具有电源指示。
2、15路输入光电隔离引入信号。
3、15路输出光电隔离输出控制继电器。
4、标准的11.0592M晶振。(便于设置串口波特率)
5、具有上电复位和手动复位。
6、标准双独立通信功能,一个RS485另外一个RS232。
7、带有掉电存储功能,该单片机内部集成。
8、输入15路具有LED指示。
9、输出15路具有LED指示。
10、15路12V继电器控制,控制设备。
11、可控制交流220V/10A一下设备。
12、具有双通信功能(可以上位机控制)。
13、单片机无加密,可插拔更换,带有程序下载口,可随意更改程序。 使用说明:【标注说明】 【接线图】 【应用举例】 【可以作为输入设备的产品】
【可作为输出控制的设备】 【原理图】 由于原理图比较大,购买后提供PDF格式的。 【PCB图】 【上位机控制界面】
通过串口1或2与上位机通讯可查询输入输出状态单片机源程序:
/********************************************************************
汇诚科技
实现功能:串口控制继电器程序
使用芯片:AT89S52
晶振:11.0592MHZ
波特率:9600
编译环境:Keil
作者:zhangxinchunleo
【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!
*********************************************************************/
/********************************************************************
单片机与PC机采用9针串口,MAX232通讯,波特率默认为9600.
单片机接收PC机发送的十六进制码表如下:
01、全开:PC发送'I';
02、全关:PC发送'i';
03、第一路开:PC发送'A';
04、第二路开:PC发送'B';
05、第三路开:PC发送'C';
06、第四路开:PC发送'D';
07、第五路开:PC发送'E';
08、第六路开:PC发送'F';
09、第七路开:PC发送'G';
10、第八路开:PC发送'H';
11、第九路开:PC发送'J';
12、第十路开:PC发送'K';
13、第十一路开:PC发送'L';
14、第十二路开:PC发送'M';
15、第十三路开:PC发送'N';
16、第十四路开:PC发送'O';
17、第十五路开:PC发送'P';
18、第一路关:PC发送'a';
19、第二路关:PC发送'b';
20、第三路关:PC发送'c';
21、第四路关:PC发送'd';
22、第五路关:PC发送'e';
23、第六路关:PC发送'f';
24、第七路关:PC发送'g';
25、第八路关:PC发送'h';
26、第九路关:PC发送'j';
27、第十路关:PC发送'k';
28、第十一路关:PC发送'l';
29、第十二路关:PC发送'm';
30、第十三路关:PC发送'n';
31、第十四路关:PC发送'o';
32、第十五路关:PC发送'p';
查询输入状态:
查询第1路输入输入‘1’ 如果有输入返回‘1’没有输入返回‘6’
查询第2路输入输入‘2’ 如果有输入返回‘2’没有输入返回‘7’
查询第3路输入输入‘3’ 如果有输入返回‘3’没有输入返回‘8’
查询第4路输入输入‘4’ 如果有输入返回‘4’没有输入返回‘9’
查询第5路输入输入‘5’ 如果有输入返回‘5’没有输入返回‘0’
查询第6路输入输入‘Q’ 如果有输入返回‘Q’没有输入返回‘q’
查询第7路输入输入‘R’ 如果有输入返回‘R’没有输入返回‘r’
查询第8路输入输入‘S’ 如果有输入返回‘S’没有输入返回‘s’
查询第9路输入输入‘T’ 如果有输入返回‘T’没有输入返回‘t’
查询第10路输入输入‘U’ 如果有输入返回‘U’没有输入返回‘u’
查询第11路输入输入‘V’ 如果有输入返回‘V’没有输入返回‘v’
查询第12路输入输入‘W’ 如果有输入返回‘W’没有输入返回‘w’
查询第13路输入输入‘X’ 如果有输入返回‘X’没有输入返回‘x’
查询第14路输入输入‘Y’ 如果有输入返回‘Y’没有输入返回‘y’
查询第15路输入输入‘Z’ 如果有输入返回‘Z’没有输入返回‘z’
*********************************************************************/
源码可以从51黑附件下载:
2.【仿modbus程序 232和485通信 输入查询方式测试程序】
协议说明:
通讯说明:
波特率
| 9600,8,N,1
| 通讯方式
| 485
| 数据格式
| 起始位+地址位+功能位+数据位+结束位
|
功能码说明:
功能码
| 功能码作用
| 00
| 将地址清零 默认为“00”
| 01
| 设置板子地址
| 02
| 打开某路输出
| 03
| 关闭某路输出
| 04
| 查询某路输出状态
| 05
| 返回输出状态:‘’00“ 标示没有输出“FF”标示有输出
| 06
| 查询某路输入状态
| 07
| 返回输入状态:‘’00“ 标示没有输入“FF”标示有输入
| 指令详细说明及例子:
1.功能码00(将地址清零)
上位机发送
| AA
| 00
| 00
| 00
| BB
|
| 起始位
| 地址00
| 地址清零
| 清零
| 结束位
| 控制器返回
| AA
| 00
| 00
| 00
| BB
|
| 起始位
| 地址00
| 00
| 00
| 结束位
|
例:将地址清零(任何状态下都可以使用)
上位机发送: AA 00 00 00 BB
控制器返回: AA 00 00 00 BB //表示地址清零完成 地址为“00”
指令详细说明及例子:
2.功能码01(改变地址)
上位机发送
| AA
| 00~FF
| 01
| 00~FF
| BB
|
| 起始位
| 地址码
| 功能码
| 设为的地址
| 结束位
| 控制器返回
| AA
| 00~FF
| 01
| 00~FF
| BB
|
| 起始位
| 设置的地址
| 功能码
| 设置的地址
| 结束位
|
例:当前地址为 “00”时,将地址改为“03”
上位机发送: AA 00 01 03 BB
控制器返回: AA 03 01 03 BB //表示地址设置成功
当前地址为 “03”时,将地址改为“05”
上位机发送: AA 0301 05 BB 控制器返回: AA 05 01 05 BB //表示地址设置成功
3.功能码02(打开输出)
上位机发送
| AA
| 01
| 02
| 01
| BB
|
| 起始位
| 地址01时
| 打开输出
| 第一个输出
| 结束位
| 此命令无返回值
|
例:打开地址01中的第5路输出
上位机发送: AA 01 02 05 BB
打开地址03中的第2路输出
上位机发送: AA 0302 02 BB
4.功能码03(关闭输出)
上位机发送
| AA
| 01
| 03
| 01
| BB
|
| 起始位
| 地址01时
| 关闭输出
| 第一个输出
| 结束位
|
例: 关闭地址02中的第3路输出
上位机发送: AA 02 03 03 BB
关闭地址05中的第2路继电器
上位机发送: AA 0503 02 BB
5.功能码04(查询输出状态)
上位机发送
| AA | 01 | 04 | 01 | BB |
| 起始位
| 地址01时
| 查询码
| 第一个输出
| 结束位
| 控制器返回 | AA | 01 | 05 | FF或00
| BB |
| 起始位
| 地址01
| 返回码
| 状态码
| 结束位
|
例: 当前地址为 “00”时,将查询第3路输出状态
上位机发送: AA 00 04 03 BB
输出为打开状态时:控制器返回:AA 00 05 FF BB //表示输出状态为打开
输出为关闭状态时:控制器返回:AA 00 05 00 BB //表示输出状态为关闭
当前地址为 “01”时,将查询第4路输出状态
上位机发送: AA 01 04 04 BB
输出为打开状态时:控制器返回:AA 01 05 FF BB //表示输出状态为打开
输出为关闭状态时:控制器返回:AA 01 05 00 BB //表示输出状态为打开
5.功能码06(查询输入状态)
上位机发送
| AA | 01 | 06 | 01 | BB |
| 起始位
| 地址01时
| 查询码
| 第一个输入
| 结束位
| 控制器返回 | AA | 01 | 07 | FF或00
| BB |
| 起始位
| 地址01
| 返回码
| 状态码
| 结束位
|
例: 当前地址为 “00”时,将查询第3路输入状态
上位机发送: AA 00 06 03 BB
输入为输入状态时: 控制器返回: AA 00 06 FF BB //表示输入状态为接通
输入为非输入状态时:控制器返回:AA 00 07 00 BB //表示输入状态为断开
当前地址为 “01”时,将查询第4路输入状态
上位机发送: AA 01 06 04 BB
输入为输入状态时: 控制器返回: AA 01 06 FF BB //表示输入状态为接通
输入为非输入状态时:控制器返回:AA 01 07 00 BB //表示输入状态为断开
- /********************************************************************
- 河南钰平电子科技有限公司
- 实现功能:应用程序
- 使用芯片:STC12C6A60S2
- 晶振:11.0592MHZ
- 波特率:9600
- 编译环境:Keil 4
- 作者:张新春
- 【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!
- *********************************************************************/
- #include "hedder\\STC12C5A60S2.h"
- #include"hedder\\DODI.h"
- #include <intrins.H>
- #define uchar unsigned char
- #define uint unsigned int
- /*
- sfr IAP_DATA = 0xC2;
- sfr IAP_ADDRH = 0xC3;
- sfr IAP_ADDRL = 0xC4;
- sfr IAP_CMD = 0xC5;
- sfr IAP_TRIG = 0xC6;
- sfr IAP_CONTR = 0xC7;
- sfr P4 = 0xC0;
- */
- //定义Flash 操作等待时间及允许IAP/ISP/EEPROM 操作的常数
- //#define ENABLE_ISP 0x80 //系统工作时钟<30MHz 时,对IAP_CONTR 寄存器设置此值
- //#define ENABLE_ISP 0x81 //系统工作时钟<24MHz 时,对IAP_CONTR 寄存器设置此值
- #define ENABLE_ISP 0x82 //系统工作时钟<20MHz 时,对IAP_CONTR 寄存器设置此值
- //#define ENABLE_ISP 0x83 //系统工作时钟<12MHz 时,对IAP_CONTR 寄存器设置此值
- //#define ENABLE_ISP 0x84 //系统工作时钟<6MHz 时,对IAP_CONTR 寄存器设置此值
- //#define ENABLE_ISP 0x85 //系统工作时钟<3MHz 时,对IAP_CONTR 寄存器设置此值
- //#define ENABLE_ISP 0x86 //系统工作时钟<2MHz 时,对IAP_CONTR 寄存器设置此值
- //#define ENABLE_ISP 0x87 //系统工作时钟<1MHz 时,对IAP_CONTR 寄存器设置此值
- uchar dat;
- uchar add;
- uchar t,r,ii;
- bit flag_zx=0;
- uchar sendBuf[10];//发送缓冲区
- uchar receBuf[10];//接收缓冲区
- /********************************************************************
- 函数声明
- *********************************************************************/
- union union_temp16
- {
- uint un_temp16;
- uchar un_temp8[2];
- }
- my_unTemp16;
- uchar Byte_Read(uint add); //读一字节,调用前需打开IAP 功能
- void Byte_Program(uint add, uchar ch); //字节编程,调用前需打开IAP 功能
- void Sector_Erase(uint add); //擦除扇区
- void IAP_Disable();
- /********************************************************************
- 串口初始化
- *********************************************************************/
- void init ()
- {
- //串口2波特率
- TMOD = 0x20; //定时器1产生波特率
- SCON = 0x50; //方式1,8位数据,波特率可变
- TH1=0xfd;
- TL1 = 0xfd; //波特率 9600
- //串口1波特率
- S2CON = 0x50; //方式1,八位数据,可变波特率
- BRT=0XFD; //设置波特率9600
- TR1=1; //启动定时器产生串口2波特率
- AUXR=0x10; //启动串口1波特率发生器
- IP=0x00; //优先级默认
- EA=1; //开总中断
- ES=1; //开串口1中断
- IE2=0x01; //开串口2中断
- }
- /****************发送函数*********************/
- void senduart2()
- {
- //RS485_DIR=1;
- SBUF=sendBuf[0];while(!TI);TI=0;
- SBUF=sendBuf[1];while(!TI);TI=0;
- SBUF=sendBuf[2];while(!TI);TI=0;
- SBUF=sendBuf[3];while(!TI);TI=0;
- SBUF=sendBuf[4];while(!TI);TI=0;
- }
- /****************发送函数*********************/
- void senduart1()
- {
- //RS485_DIR=1;
- S2BUF=sendBuf[0];while(!(S2CON & 0x02));S2CON &= ~0x02;
- S2BUF=sendBuf[1];while(!(S2CON & 0x02));S2CON &= ~0x02;
- S2BUF=sendBuf[2];while(!(S2CON & 0x02));S2CON &= ~0x02;
- S2BUF=sendBuf[3];while(!(S2CON & 0x02));S2CON &= ~0x02;
- S2BUF=sendBuf[4];while(!(S2CON & 0x02));S2CON &= ~0x02;
- //RS485_DIR=0;
- }
- /*****************清空发送缓冲区*************************/
- void clear_receBuf()
- {
- uchar i;
- for(i=0;i<5;i++)
- {
- receBuf[i]=0;
- }
- }
- /********************************************************************
- 主函数
- *********************************************************************/
- void main()
- {
- uchar k=10;
- //配置P4.4为IO口
- P4SW|=0x70;
- P4M0&=0x80;
- P4M1&=0x80;
- add = Byte_Read(0);;
- init(); //串口初始化
- //q RS485_DIR=0;
- while(1)
- {
- }
- }
- /********************************************************************
- 串口一 发送接收中断函数
- *********************************************************************/
- void uart_isr() interrupt 4
- {
- if(RI) //如果有接收
- {
- RI=0; //接收标志清零
- receBuf[r++&0x0F]=SBUF; //把接受的数据存储到BUT数组中
- if(receBuf[0]!=0xaa){r=0;}
- if(r>=5)
- { r=0;
- flag_zx=1;
- }
- }
- if(flag_zx==1)
- {
- flag_zx=0;
-
- //0 1 2 3 4
- //起始位 地址位 功能位 数据位 结束位
- if((receBuf[0]==0xaa)&&(receBuf[4]==0xbb)&&(receBuf[1]==add)) //如果开始位和结束位,还有地址都正确,进行下一步判断
- {
- if(receBuf[2]==0x01) //修改板子地址
- {
- add=receBuf[3];
- Sector_Erase(0); //擦除整个扇区
- Byte_Program(0,add);//将 数据 写入 EEPROM
- sendBuf[0]=0xaa;
- sendBuf[1]=add;
- sendBuf[2]=0x01;
- sendBuf[3]=add;
- sendBuf[4]=0xbb;
- senduart2();
- }
- else if(receBuf[2]==0x02) //打开单路输出
- {
- switch(receBuf[3])
- {
- case 0x01:OUT1=0;break;
- case 0x02:OUT2=0;break;
- case 0x03:OUT3=0;break;
- case 0x04:OUT4=0;break;
- case 0x05:OUT5=0;break;
- case 0x06:OUT6=0;break;
- case 0x07:OUT7=0;break;
- case 0x08:OUT8=0;break;
- case 0x09:OUT9=0;break;
- case 0x010:OUT10=0;break;
- case 0x011:OUT11=0;break;
- case 0x012:OUT12=0;break;
- case 0x013:OUT13=0;break;
- case 0x014:OUT14=0;break;
- case 0x015:OUT15=0;break;
- default:break;
- }
- }
- else if(receBuf[2]==0x03) //关闭单路输出
- {
- switch(receBuf[3])
- {
- case 0x01:OUT1=1;break;
- case 0x02:OUT2=1;break;
- case 0x03:OUT3=1;break;
- case 0x04:OUT4=1;break;
- case 0x05:OUT5=1;break;
- case 0x06:OUT6=1;break;
- case 0x07:OUT7=1;break;
- case 0x08:OUT8=1;break;
- case 0x09:OUT9=1;break;
- case 0x010:OUT10=1;break;
- case 0x011:OUT11=1;break;
- case 0x012:OUT12=1;break;
- case 0x013:OUT13=1;break;
- case 0x014:OUT14=1;break;
- case 0x015:OUT15=1;break;
- default:break;
- }
- }
- else if(receBuf[2]==0x04)//查询输出状态
- {
- switch(receBuf[3])
- {
- case 0x01: if(OUT1==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x02: if(OUT2==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x03: if(OUT3==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x04: if(OUT4==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x05: if(OUT5==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x06: if(OUT6==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x07: if(OUT7==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x08: if(OUT8==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x09: if(OUT9==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x010: if(OUT10==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x011: if(OUT11==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x012: if(OUT12==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x013: if(OUT13==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x014: if(OUT14==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x015: if(OUT15==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- default:break;
- }
- sendBuf[0]=0xaa;
- sendBuf[1]=add;
- sendBuf[2]=0x05;
- sendBuf[4]=0xbb;
- senduart2();
-
- }
- else if(receBuf[2]==0x06)//查询输入状态
- {
- switch(receBuf[3])
- {
- case 0x01: if(IN1==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x02: if(IN2==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x03: if(IN3==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x04: if(IN4==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x05: if(IN5==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x06: if(IN6==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x07: if(IN7==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x08: if(IN8==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x09: if(IN9==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x010: if(IN10==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x011: if(IN11==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x012: if(IN12==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x013: if(IN13==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x014: if(IN14==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x015: if(IN15==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- default:break;
- }
- sendBuf[0]=0xaa;
- sendBuf[1]=add;
- sendBuf[2]=0x07;
- sendBuf[4]=0xbb;
- senduart2();
-
- }
-
- }
- if((receBuf[0]==0xaa)&&(receBuf[1]==0x00)&&(receBuf[2]==0x00)&&(receBuf[3]==0x00)&&(receBuf[4]==0xbb))
- {
- add=0x00;
- Sector_Erase(0); //擦除整个扇区
- Byte_Program(0, add);//将 数据 写入 EEPROM
- sendBuf[0]=0xaa;
- sendBuf[1]=add;
- sendBuf[2]=0x00;
- sendBuf[3]=0x00;
- sendBuf[4]=0xbb;
- senduart2();
- }
- clear_receBuf();
- } }
- /********************************************************************
- 串口二 发送接收中断函数
- *********************************************************************/
- void uart2_isr() interrupt 8
- {
- if( S2CON & 0x01 )
- {
- S2CON &= ~0x01;
- receBuf[r++&0x0F]=S2BUF; //把接受的数据存储到BUT数组中
- if(receBuf[0]!=0xaa){r=0;}
- if(r>=5)
- { r=0;
- flag_zx=1;
- }
- }
- if(flag_zx==1)
- {
- flag_zx=0;
-
- //0 1 2 3 4
- //起始位 地址位 功能位 数据位 结束位
- if((receBuf[0]==0xaa)&&(receBuf[4]==0xbb)&&(receBuf[1]==add)) //如果开始位和结束位,还有地址都正确,进行下一步判断
- {
- if(receBuf[2]==0x01) //修改板子地址
- {
- add=receBuf[3];
- Sector_Erase(0); //擦除整个扇区
- Byte_Program(0,add);//将 数据 写入 EEPROM
- sendBuf[0]=0xaa;
- sendBuf[1]=add;
- sendBuf[2]=0x01;
- sendBuf[3]=add;
- sendBuf[4]=0xbb;
- senduart1();
- }
- else if(receBuf[2]==0x02) //打开单路输出
- {
- switch(receBuf[3])
- {
- case 0x01:OUT1=0;break;
- case 0x02:OUT2=0;break;
- case 0x03:OUT3=0;break;
- case 0x04:OUT4=0;break;
- case 0x05:OUT5=0;break;
- case 0x06:OUT6=0;break;
- case 0x07:OUT7=0;break;
- case 0x08:OUT8=0;break;
- case 0x09:OUT9=0;break;
- case 0x010:OUT10=0;break;
- case 0x011:OUT11=0;break;
- case 0x012:OUT12=0;break;
- case 0x013:OUT13=0;break;
- case 0x014:OUT14=0;break;
- case 0x015:OUT15=0;break;
- default:break;
- }
- }
- else if(receBuf[2]==0x03) //关闭单路输出
- {
- switch(receBuf[3])
- {
- case 0x01:OUT1=1;break;
- case 0x02:OUT2=1;break;
- case 0x03:OUT3=1;break;
- case 0x04:OUT4=1;break;
- case 0x05:OUT5=1;break;
- case 0x06:OUT6=1;break;
- case 0x07:OUT7=1;break;
- case 0x08:OUT8=1;break;
- case 0x09:OUT9=1;break;
- case 0x010:OUT10=1;break;
- case 0x011:OUT11=1;break;
- case 0x012:OUT12=1;break;
- case 0x013:OUT13=1;break;
- case 0x014:OUT14=1;break;
- case 0x015:OUT15=1;break;
- default:break;
- }
- }
- else if(receBuf[2]==0x04)//查询输出状态
- {
- switch(receBuf[3])
- {
- case 0x01: if(OUT1==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x02: if(OUT2==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x03: if(OUT3==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x04: if(OUT4==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x05: if(OUT5==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x06: if(OUT6==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x07: if(OUT7==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x08: if(OUT8==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x09: if(OUT9==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x010: if(OUT10==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x011: if(OUT11==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x012: if(OUT12==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x013: if(OUT13==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x014: if(OUT14==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x015: if(OUT15==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- default:break;
- }
- sendBuf[0]=0xaa;
- sendBuf[1]=add;
- sendBuf[2]=0x05;
- sendBuf[4]=0xbb;
- senduart1();
-
- }
- else if(receBuf[2]==0x06)//查询输入状态
- {
- switch(receBuf[3])
- {
- case 0x01: if(IN1==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x02: if(IN2==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x03: if(IN3==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x04: if(IN4==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x05: if(IN5==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x06: if(IN6==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x07: if(IN7==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x08: if(IN8==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x09: if(IN9==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x010: if(IN10==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x011: if(IN11==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x012: if(IN12==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x013: if(IN13==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x014: if(IN14==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x015: if(IN15==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- default:break;
- }
- sendBuf[0]=0xaa;
- sendBuf[1]=add;
- sendBuf[2]=0x07;
- sendBuf[4]=0xbb;
- senduart1();
-
- }
-
- }
- if((receBuf[0]==0xaa)&&(receBuf[1]==0x00)&&(receBuf[2]==0x00)&&(receBuf[3]==0x00)&&(receBuf[4]==0xbb))
- {
- add=0x00;
- Sector_Erase(0); //擦除整个扇区
- Byte_Program(0, add);//将 数据 写入 EEPROM
- sendBuf[0]=0xaa;
- sendBuf[1]=add;
- sendBuf[2]=0x00;
- sendBuf[3]=0x00;
- sendBuf[4]=0xbb;
- senduart1();
- }
- clear_receBuf();
- }
- }
- /********************************************************************
- 结束主函数
- *********************************************************************/
- //读一字节,调用前需打开IAP 功能,入口:DPTR = 字节地址,返回:A = 读出字节
- uchar Byte_Read(uint 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(uint add, uchar 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(uint 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;
- }
-
- /********************************************************************
- 结束
- *********************************************************************/
复制代码
【图片预览】
【下载说明】 第一步:准备工控板、电源、串口通讯线、电脑 第二步:串口线连接工控板和电脑。 第三步:打开下载软件。(STC_ISP_V479) 第四步:下载设置。(查看串口号) 第五步:选择单片机型号,并选择对应的串口号。 注意:下载前一定要先安装串口线驱动程序。 第六步:调入要下载的文件(扩展名为:HEX的文件) 第七步:点击‘Download/下载’等待软件提示给工控板供电。 第八步:给工控板供电并等待下载完成。 第九步:下载进行中。。。。。。等待下载完成! 第十步:下载完成。即可进行测试。
全部资料51hei下载地址(包含源码 原理图等详细资料):
|