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下載地址(包含源碼 原理圖等詳細資料):
|