|
楼主 |
发表于 2021-8-26 21:50:02
|
显示全部楼层
楼上这种方法只能用这种吗,如5A A5 06 83 0001 01 0001出AA 00 02 01 BB 5A A5 06 83 0001 01 0002出AA 00 03 01 BB,现在功能要求是变量图标,增量调节按钮,测试5A A5 AA 00 02 01 BB 通讯也没问题,难道非要用MODBUS???,但是MODBUS有校码,通讯不成功。或者谁能帮改下单片机程序,急!!!!
#include<reg52.h> //库文件
#include <intrins.H>
#include<EEPROM.h>
#define uchar unsigned char//宏定义无符号字符型
/********************************************************************
24路输出IO口定义
*********************************************************************/
sbit K1=P1^0;
sbit K2=P1^1;
sbit K3=P1^2;
sbit K4=P1^3;
sbit K5=P1^4;
sbit K6=P1^5;
sbit K7=P1^6;
sbit K8=P1^7;
sbit K9=P2^0;
sbit K10=P2^1;
sbit K11=P2^2;
sbit K12=P2^3;
sbit K13=P2^4;
sbit K14=P2^5;
sbit K15=P2^6;
sbit K16=P2^7;
/********************************************************************
变量定义区
*********************************************************************/
uchar dat;
uchar t,r,ii;
uchar add; //掉电保持485的地址
uchar j=0;
bit flag_zx=0;
uchar sendBuf[10]; //发送缓冲区
uchar receBuf[10]; //接收缓冲区
bit busy;
bit bz1=0;
bit bz2=0;
bit bz3=0;
bit bz4=0;
bit bz5=0;
bit bz6=0;
bit bz7=0;
bit bz8=0;
/********************************************************************
延时函数
*********************************************************************
void delay(uchar t)
{
uchar i,j;
for(i=0;i<t;i++)
{
for(j=13;j>0;j--);
{ ;
}
}
}
/********************************************************************
功能:串口初始化,波特率9600,方式1
*********************************************************************/
void Init_Com(void)
{
TMOD = 0x20;
PCON = 0x00;
SCON = 0x50;
TH1 = 0xFd;
TL1 = 0xFd;
TR1 = 1;
ES=1;
EA=1;
}
/****************发送函数*********************/
void senduart2()
{
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 clear_receBuf()
{
uchar i;
for(i=0;i<5;i++)
{
receBuf=0;
}
}
/********************************************************************
主函数
*********************************************************************/
void main()
{
Init_Com();//串口初始化
add = EEPROMReadByte(0);
//add = 0X00; //强制设置地址
P2=0XFF;
P1=0XFF;
while(1)
{
/********************************************************************
接收数据判断函数
*********************************************************************/
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];
EEPROMSectorErase(0);//擦除扇区
EEPROMWriteByte(0,add);//写入新的地址
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: K1=0; break;
case 0x02: K2=0; break;
case 0x03: K3=0; break;
case 0x04: K4=0; break;
case 0x05: K5=0; break;
case 0x06: K6=0; break;
case 0x07: K7=0; break;
case 0x08: K8=0; break;
case 0x09: K9=0; break;
case 0x10: K10=0; break;
case 0x11: K11=0; break;
case 0x12: K12=0; break;
case 0x13: K13=0; break;
case 0x14: K14=0; break;
case 0x15: K15=0; break;
case 0x16: K16=0; break;
default:break;
}
}
else if(receBuf[2]==0x03) //关闭单路继电器
{
switch(receBuf[3])
{
case 0x01: K1=1; break;
case 0x02: K2=1; break;
case 0x03: K3=1; break;
case 0x04: K4=1; break;
case 0x05: K5=1; break;
case 0x06: K6=1; break;
case 0x07: K7=1; break;
case 0x08: K8=1; break;
case 0x09: K9=1; break;
case 0x10: K10=1; break;
case 0x11: K11=1; break;
case 0x12: K12=1; break;
case 0x13: K13=1; break;
case 0x14: K14=1; break;
case 0x15: K15=1; break;
case 0x16: K16=1; break;
default:break;
}
}
else if(receBuf[2]==0x04) //打开全部继电器
{
if(receBuf[3]==0xff)
{
P2=0X00;
P1=0X00;
P0=0X00;
}
}
else if(receBuf[2]==0x05) //关闭全部继电器
{
if(receBuf[3]==0x00)
{
P2=0XFF;
P1=0XFF;
P0=0XFF;
}
}
else if(receBuf[2]==0x06) //查询继电器
{
sendBuf[0]=0xaa;
sendBuf[1]=add;
sendBuf[2]=0x07;
sendBuf[4]=0xbb;
switch(receBuf[3])
{
case 0x01: if(K1==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
case 0x02: if(K2==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
case 0x03: if(K3==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
case 0x04: if(K4==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
case 0x05: if(K5==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
case 0x06: if(K6==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
case 0x07: if(K7==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
case 0x08: if(K8==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
case 0x09: if(K9==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
case 0x10: if(K10==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
case 0x11: if(K11==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
case 0x12: if(K12==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
case 0x13: if(K13==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
case 0x14: if(K14==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
case 0x15: if(K15==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
case 0x16: if(K16==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
default:break;
}
senduart2();
}
}
if((receBuf[0]==0xaa)&&(receBuf[1]==0x00)&&(receBuf[2]==0x00)&&(receBuf[3]==0x00)&&(receBuf[4]==0xbb))
{
add=0x00;
EEPROMSectorErase(0);//擦除扇区
EEPROMWriteByte(0,0);//写入新的地址
sendBuf[0]=0xaa;
sendBuf[1]=add;
sendBuf[2]=0x00;
sendBuf[3]=0x00;
sendBuf[4]=0xbb;
senduart2();
}
clear_receBuf();
}
/*if(write==1)
{
write=0;
KK1 = P0;
KK2 = P1;
KK3 = P2;
KK4 = P3;
EEPROMSectorErase(0);
EEPROMWriteByte(0,KK1);
EEPROMWriteByte(1,KK2);
EEPROMWriteByte(2,KK3);
EEPROMWriteByte(3,KK4);
}*/
}
}
/********************************************************************
结束
*********************************************************************/
|
|