因為看到有人在發(fā)帖沒有給代碼還深深秘密的,我正好手頭有發(fā)上來供大家參考。其實我個人認為這個板子設計的不是很好。沒有對輸入做足夠的處理。
vb寫的上位機源碼:
51hei.png (20.09 KB, 下載次數(shù): 50)
下載附件
2020-11-6 18:39 上傳
51hei.png (7.89 KB, 下載次數(shù): 53)
下載附件
2020-11-6 18:34 上傳
單片機源程序如下:
- #include "STC12C5A60S2.H"
- #include "INTRINS.H"
- #define uchar unsigned char//宏定義無符號字符型
- #define uint unsigned int //宏定義無符號整型
- bit write=0; //寫24C08 的標志;
- uchar dat=0xee; //用于存儲單片機接收發(fā)送緩沖寄存器SBUF里面的內(nèi)容
- uchar sj1; //存儲數(shù)據(jù)值
- uchar sj2; //存儲數(shù)據(jù)值
- uchar sj3; //存儲數(shù)據(jù)值
- /*
- 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 操作的常數(shù)
- //#define ENABLE_ISP 0x80 //系統(tǒng)工作時鐘<30MHz 時,對IAP_CONTR 寄存器設置此值
- //#define ENABLE_ISP 0x81 //系統(tǒng)工作時鐘<24MHz 時,對IAP_CONTR 寄存器設置此值
- #define ENABLE_ISP 0x82 //系統(tǒng)工作時鐘<20MHz 時,對IAP_CONTR 寄存器設置此值
- //#define ENABLE_ISP 0x83 //系統(tǒng)工作時鐘<12MHz 時,對IAP_CONTR 寄存器設置此值
- //#define ENABLE_ISP 0x84 //系統(tǒng)工作時鐘<6MHz 時,對IAP_CONTR 寄存器設置此值
- //#define ENABLE_ISP 0x85 //系統(tǒng)工作時鐘<3MHz 時,對IAP_CONTR 寄存器設置此值
- //#define ENABLE_ISP 0x86 //系統(tǒng)工作時鐘<2MHz 時,對IAP_CONTR 寄存器設置此值
- //#define ENABLE_ISP 0x87 //系統(tǒng)工作時鐘<1MHz 時,對IAP_CONTR 寄存器設置此值
- /********************************************************************
- 初始定義
- *********************************************************************/
- /*定義輸入口*/
- 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^2;
- sbit IN8=P3^3;
- sbit IN9=P3^4;
- sbit IN10=P3^5;
- sbit IN11=P3^6;
- sbit IN12=P3^7;
- sbit IN13=P2^2;
- sbit IN14=P2^1;
- sbit IN15=P2^0;
- /*定義輸出口*/
- sbit OUT1=P2^3;
- sbit OUT2=P2^4;
- sbit OUT3=P2^5;
- sbit OUT4=P2^6;
- sbit OUT5=P2^7;
- sbit OUT6=P4^4;
- sbit OUT7=P4^5;
- sbit OUT8=P0^7;
- sbit OUT9=P0^6;
- sbit OUT10=P0^5;
- sbit OUT11=P0^4;
- sbit OUT12=P0^3;
- sbit OUT13=P0^2;
- sbit OUT14=P0^1;
- sbit OUT15=P0^0;
- bit bz1=0;
- bit bz2=0;
- bit bz3=0;
- bit bz4=0;
- bit bz5=0;
- bit bz6=0;
- bit bz7=0;
- bit bz8=0;
- bit bz9=0;
- bit bz10=0;
- bit bz11=0;
- bit bz12=0;
- bit bz13=0;
- bit bz14=0;
- bit bz15=0;
- /********************************************************************
- 函數(shù)聲明
- *********************************************************************/
- union union_temp16
- {
- uint un_temp16;
- uchar un_temp8[2];
- }
- my_unTemp16;
- uchar Byte_Read(uint add); //讀一字節(jié),調(diào)用前需打開IAP 功能
- void Byte_Program(uint add, uchar ch); //字節(jié)編程,調(diào)用前需打開IAP 功能
- void Sector_Erase(uint add); //擦除扇區(qū)
- void IAP_Disable(); //關閉IAP 功能
- void Delay();
- /********************************************************************
- 延時函數(shù)
- *********************************************************************/
- void delay(uchar t)
- {
- uchar i,j;
- for(i=0;i<t;i++)
- {
- for(j=230;j>0;j--);
- { ;
- }
- }
- }
- /********************************************************************
- 功能:串口初始化,波特率9600,方式1
- *********************************************************************/
- void Init_Com(void)
- {
- //串口初始化
- TMOD = 0x20;
- SCON = 0x50;
- TH1 = 0xFd;
- TL1 = 0xFd;
- TR1 = 1;
- ES=1; //開串口1中斷
- //485接口初始化
- S2CON=0x50; //方式1,八位數(shù)據(jù),可變波特率
- AUXR1=0x00; //1T工作方式
- BRT=0XFD; //設置波特率9600
- AUXR=0x10; //啟動波特率發(fā)生器
- EA=1; //開總中斷
- IE2=0x01; //開串口2中斷
- }
- /********************************************************************
- 串口1和串口2 配置
- *********************************************************************/
- void B485_send(uchar c)
- {
- SBUF=S2BUF=c;
- }
- /********************************************************************
- 全開函數(shù)
- *********************************************************************/
- void quankai()
- {
- uchar k;
- k=10;
- OUT1=0;delay(k);
- OUT2=0;delay(k);
- OUT3=0;delay(k);
- OUT4=0;delay(k);
- OUT5=0;delay(k);
- OUT6=0;delay(k);
- OUT7=0;delay(k);
- OUT8=0;delay(k);
- OUT9=0;delay(k);
- OUT10=0;delay(k);
- OUT11=0;delay(k);
- OUT12=0;delay(k);
- OUT13=0;delay(k);
- OUT14=0;delay(k);
- OUT15=0;delay(k);
- }
- /********************************************************************
- 全關函數(shù)
- *********************************************************************/
- void quanguan()
- {
- uchar k;
- k=10;
- OUT1=1;delay(k);
- OUT2=1;delay(k);
- OUT3=1;delay(k);
- OUT4=1;delay(k);
- OUT5=1;delay(k);
- OUT6=1;delay(k);
- OUT7=1;delay(k);
- OUT8=1;delay(k);
- OUT9=1;delay(k);
- OUT10=1;delay(k);
- OUT11=1;delay(k);
- OUT12=1;delay(k);
- OUT13=1;delay(k);
- OUT14=1;delay(k);
- OUT15=1;delay(k);
- }
- /********************************************************************
- 接收數(shù)據(jù)判斷函數(shù)
- *********************************************************************/
- chuankou()
- {
- switch(dat) //接收數(shù)據(jù)判斷
- {
- uchar k;
- k=10;
- case 'I': quankai();SBUF = dat;dat=0xee;B485_send('1');write=1;break; // 全開
- case 'i': quanguan();SBUF = dat;dat=0xee;B485_send('1');write=1;break; // 全關
- case 'A': OUT1=0;delay(k);SBUF = dat;dat=0xee;B485_send('1');write=1;break; // 第一路開
- case 'B': OUT2=0;delay(k);SBUF = dat;dat=0xee;B485_send('1');write=1;break; // 第二路開
- case 'C': OUT3=0;delay(k);SBUF = dat;dat=0xee;B485_send('1');write=1;break; // 第三路開
- case 'D': OUT4=0;delay(k);SBUF = dat;dat=0xee;B485_send('1');write=1;break; // 第四路開
- case 'E': OUT5=0;delay(k);SBUF = dat;dat=0xee;B485_send('1');write=1;break; // 第五路開
- case 'F': OUT6=0;delay(k);SBUF = dat;dat=0xee;B485_send('1');write=1;break; // 第六路開
- case 'G': OUT7=0;delay(k);SBUF = dat;dat=0xee;B485_send('1');write=1;break; // 第七路開
- case 'H': OUT8=0;delay(k);SBUF = dat;dat=0xee;B485_send('1');write=1;break; // 第八路開
- case 'J': OUT9=0;delay(k);SBUF = dat;dat=0xee;B485_send('1');write=1;break; // 第九路開
- case 'K': OUT10=0;delay(k);SBUF = dat;dat=0xee;B485_send('1');write=1;break; // 第十路開
- case 'L': OUT11=0;delay(k);SBUF = dat;dat=0xee;B485_send('1');write=1;break; // 第十一路開
- case 'M': OUT12=0;delay(k);SBUF = dat;dat=0xee;B485_send('1');write=1;break; // 第十二路開
- case 'N': OUT13=0;delay(k);SBUF = dat;dat=0xee;B485_send('1');write=1;break; // 第十三路開
- case 'O': OUT14=0;delay(k);SBUF = dat;dat=0xee;B485_send('1');write=1;break; // 第十四路開
- case 'P': OUT15=0;delay(k);SBUF = dat;dat=0xee;B485_send('1');write=1;break; // 第十五路開
-
- case 'a': OUT1=1;delay(k);SBUF = dat;dat=0xee;B485_send('1');write=1;break; // 第一路關
- case 'b': OUT2=1;delay(k);SBUF = dat;dat=0xee;B485_send('1');write=1;break; // 第二路關
- case 'c': OUT3=1;delay(k);SBUF = dat;dat=0xee;B485_send('1');write=1;break; // 第三路關
- case 'd': OUT4=1;delay(k);SBUF = dat;dat=0xee;B485_send('1');write=1;break; // 第四路關
- case 'e': OUT5=1;delay(k);SBUF = dat;dat=0xee;B485_send('1');write=1;break; // 第五路關
- case 'f': OUT6=1;delay(k);SBUF = dat;dat=0xee;B485_send('1');write=1;break; // 第六路關
- case 'g': OUT7=1;delay(k);SBUF = dat;dat=0xee;B485_send('1');write=1;break; // 第七路關
- case 'h': OUT8=1;delay(k);SBUF = dat;dat=0xee;B485_send('1');write=1;break; // 第八路關
- case 'j': OUT9=1;delay(k);SBUF = dat;dat=0xee;B485_send('1');write=1;break; // ...
- case 'k': OUT10=1;delay(k);SBUF = dat;dat=0xee;B485_send('1');write=1;break; // ...
- case 'l': OUT11=1;delay(k);SBUF = dat;dat=0xee;B485_send('1');write=1;break; // ...
- case 'm': OUT12=1;delay(k);SBUF = dat;dat=0xee;B485_send('1');write=1;break; // ...
- case 'n': OUT13=1;delay(k);SBUF = dat;dat=0xee;B485_send('1');write=1;break; // ...
- case 'o': OUT14=1;delay(k);SBUF = dat;dat=0xee;B485_send('1');write=1;break; // ...
- case 'p': OUT15=1;delay(k);SBUF = dat;dat=0xee;B485_send('1');write=1;break; // ...
- default:break; // 跳出
- }
- }
- /********************************************************************
- 按鍵函數(shù)
- *********************************************************************/
- KEY()
- {
- uchar k;
- k=200;
- if((IN1==0)&&(bz1==0)){delay(k);if(IN1==0){delay(k);OUT1=!OUT1;bz1=1;}}if((bz1==1)&&(IN1==1)){delay(k);bz1=0;}
- if((IN2==0)&&(bz2==0)){delay(k);if(IN2==0){delay(k);OUT2=!OUT2;bz2=1;}}if((bz2==1)&&(IN2==1)){delay(k);bz2=0;}
- if((IN3==0)&&(bz3==0)){delay(k);if(IN3==0){delay(k);OUT3=!OUT3;bz3=1;}}if((bz3==1)&&(IN3==1)){delay(k);bz3=0;}
- if((IN4==0)&&(bz4==0)){delay(k);if(IN4==0){delay(k);OUT4=!OUT4;bz4=1;}}if((bz4==1)&&(IN4==1)){delay(k);bz4=0;}
- if((IN5==0)&&(bz5==0)){delay(k);if(IN5==0){delay(k);OUT5=!OUT5;bz5=1;}}if((bz5==1)&&(IN5==1)){delay(k);bz5=0;}
- if((IN6==0)&&(bz6==0)){delay(k);if(IN6==0){delay(k);OUT6=!OUT6;bz6=1;}}if((bz6==1)&&(IN6==1)){delay(k);bz6=0;}
- if((IN7==0)&&(bz7==0)){delay(k);if(IN7==0){delay(k);OUT7=!OUT7;bz7=1;}}if((bz7==1)&&(IN7==1)){delay(k);bz7=0;}
- if((IN8==0)&&(bz8==0)){delay(k);if(IN8==0){delay(k);OUT8=!OUT8;bz8=1;}}if((bz8==1)&&(IN8==1)){delay(k);bz8=0;}
- if((IN9==0)&&(bz9==0)){delay(k);if(IN9==0){delay(k);OUT9=!OUT9;bz9=1;}}if((bz9==1)&&(IN9==1)){delay(k);bz9=0;}
- if((IN10==0)&&(bz10==0)){delay(k);if(IN10==0){delay(k);OUT10=!OUT10;bz10=1;}}if((bz10==1)&&(IN10==1)){delay(k);bz10=0;}
- if((IN11==0)&&(bz11==0)){delay(k);if(IN11==0){delay(k);OUT11=!OUT11;bz11=1;}}if((bz11==1)&&(IN11==1)){delay(k);bz11=0;}
- if((IN12==0)&&(bz12==0)){delay(k);if(IN12==0){delay(k);OUT12=!OUT12;bz12=1;}}if((bz12==1)&&(IN12==1)){delay(k);bz12=0;}
- if((IN13==0)&&(bz13==0)){delay(k);if(IN13==0){delay(k);OUT13=!OUT13;bz13=1;}}if((bz13==1)&&(IN13==1)){delay(k);bz13=0;}
- if((IN14==0)&&(bz14==0)){delay(k);if(IN14==0){delay(k);OUT14=!OUT14;bz14=1;}}if((bz14==1)&&(IN14==1)){delay(k);bz14=0;}
- if((IN15==0)&&(bz15==0)){delay(k);if(IN15==0){delay(k);OUT15=!OUT15;bz15=1;}}if((bz15==1)&&(IN15==1)){delay(k);bz15=0;}
- }
- /********************************************************************
- 主函數(shù)
- *********************************************************************/
- void main (void)
- {
- uint eeprom_address;
- P4SW|=0x20; //配置P4.5為IO口
- P4M0|=0x10; //配置P4.4為IO口
- P4M1|=0x10;
- Init_Com();//串口初始化
- // eeprom_address = 0x01; //將測試起始地址送eeprom_address
- // sj1 = Byte_Read(1); //讀EEPROM的值,存到read_eeprom
- // sj2 = Byte_Read(2); //讀EEPROM的值,存到read_eeprom
- // sj3 = Byte_Read(3); //讀EEPROM的值,存到read_eeprom
- // P0=sj1;
- // P2=sj2;
- // P4=sj3;
- while(1)
- {
- chuankou(); // 接收數(shù)據(jù)判斷函數(shù)
-
- if ( RI ) //掃描判斷是否接收到數(shù)據(jù),
- {
- dat = SBUF; //接收數(shù)據(jù)SBUF賦與dat
- RI=0; //RI 清零。
- }
- KEY(); //調(diào)用按鍵函數(shù)
- if(write==1) //判斷計時器是否計時一秒
- {
- write=0; //清零
- sj1=P0;
- sj2=P2;
- sj3=P4;
- Sector_Erase(1); //擦除整個扇區(qū)
- Byte_Program(1, sj1);//將 數(shù)據(jù) 寫入 EEPROM
- //Sector_Erase(2); //擦除整個扇區(qū)
- Byte_Program(2, sj2);//將 數(shù)據(jù) 寫入 EEPROM
- //Sector_Erase(3); //擦除整個扇區(qū)
- Byte_Program(3, sj3);//將 數(shù)據(jù) 寫入 EEPROM
- }
- }
- }
- /********************************************************************
- 串口中斷函數(shù)
- *********************************************************************/
- void commIntProc() interrupt 4
- {
- if(TI)
- TI = 0;
- if(RI)
- {
- RI = 0;
- dat = SBUF;
- } //接收數(shù)據(jù)SBUF賦與dat
- }
- /********************************************************************
- 串口二(485) 發(fā)送接收中斷函數(shù)
- *********************************************************************/
- void uart2_isr() interrupt 8
- {
- if( S2CON & 0x01 )
- {
- S2CON &= ~0x01;
- dat= S2BUF;
- }
- if( S2CON & 0x02 )
- {
- S2CON&=0xfd;
- }
- }
- /********************************************************************
- 結(jié)束主函數(shù)
- *********************************************************************/
- //讀一字節(jié),調(diào)用前需打開IAP 功能,入口:DPTR = 字節(jié)地址,返回:A = 讀出字節(jié)
- uchar Byte_Read(uint add)
- {
- IAP_DATA = 0x00;
- IAP_CONTR = ENABLE_ISP; //打開IAP 功能, 設置Flash 操作等待時間
- IAP_CMD = 0x01; //IAP/ISP/EEPROM 字節(jié)讀命令
- 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 觸發(fā)寄存器,每次都需如此
- IAP_TRIG = 0xA5; //送完A5h 后,ISP/IAP 命令立即被觸發(fā)起動
- _nop_();
- //EA = 1;
- IAP_Disable(); //關閉IAP 功能, 清相關的特殊功能寄存器,使CPU 處于安全狀態(tài),
- //一次連續(xù)的IAP 操作完成之后建議關閉IAP 功能,不需要每次都關
- return (IAP_DATA);
- }
- //字節(jié)編程,調(diào)用前需打開IAP 功能,入口:DPTR = 字節(jié)地址, A= 須編程字節(jié)的數(shù)據(jù)
- void Byte_Program(uint add, uchar ch)
- {
- IAP_CONTR = ENABLE_ISP; //打開 IAP 功能, 設置Flash 操作等待時間
- IAP_CMD = 0x02; //IAP/ISP/EEPROM 字節(jié)編程命令
- my_unTemp16.un_temp16 = add;
- IAP_ADDRH = my_unTemp16.un_temp8[0]; //設置目標單元地址的高8 位地址
- IAP_ADDRL = my_unTemp16.un_temp8[1]; //設置目標單元地址的低8 位地址
- IAP_DATA = ch; //要編程的數(shù)據(jù)先送進IAP_DATA 寄存器
- //EA = 0;
- IAP_TRIG = 0x5A; //先送 5Ah,再送A5h 到ISP/IAP 觸發(fā)寄存器,每次都需如此
- IAP_TRIG = 0xA5; //送完A5h 后,ISP/IAP 命令立即被觸發(fā)起動
- _nop_();
- //EA = 1;
- IAP_Disable(); //關閉IAP 功能, 清相關的特殊功能寄存器,使CPU 處于安全狀態(tài),
- //一次連續(xù)的IAP 操作完成之后建議關閉IAP 功能,不需要每次都關
- }
- //擦除扇區(qū), 入口:DPTR = 扇區(qū)地址
- void Sector_Erase(uint add)
- {
- IAP_CONTR = ENABLE_ISP; //打開IAP 功能, 設置Flash 操作等待時間
- IAP_CMD = 0x03; //IAP/ISP/EEPROM 扇區(qū)擦除命令
- 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 觸發(fā)寄存器,每次都需如此
- IAP_TRIG = 0xA5; //送完A5h 后,ISP/IAP 命令立即被觸發(fā)起動
- _nop_();
- //EA = 1;
- IAP_Disable(); //關閉IAP 功能, 清相關的特殊功能寄存器,使CPU 處于安全狀態(tài),
- //一次連續(xù)的IAP 操作完成之后建議關閉IAP 功能,不需要每次都關
- }
- void IAP_Disable()
- {
- //關閉IAP 功能, 清相關的特殊功能寄存器,使CPU 處于安全狀態(tài),
- //一次連續(xù)的IAP 操作完成之后建議關閉IAP 功能,不需要每次都關
- IAP_CONTR = 0; //關閉IAP 功能
- IAP_CMD = 0; //清命令寄存器,使命令寄存器無命令,此句可不用
- IAP_TRIG = 0; //清命令觸發(fā)寄存器,使命令觸發(fā)寄存器無觸發(fā),此句可不用
- IAP_ADDRH = 0;
- IAP_ADDRL = 0;
- }
-
- /********************************************************************
- 結(jié)束
- *********************************************************************/
復制代碼
所有資料51hei提供下載:
GYJ-0067_繼電器15入15出(有源輸入)發(fā)貨資料.7z
(6.89 MB, 下載次數(shù): 46)
2020-11-6 18:40 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|