/********************************************************************
PC机与控制板采用485-1或者485-2连接都可以进行测试
单片机接收PC机发送的十六进制码表如下:
01、全开:PC发送FF FF*********返回:FF AA;
02、全关:PC发送FF 00*********返回:FF BB;
************************************************************
03、第1路开:PC发送FF 01*********返回:FF A1;
04、第2路开:PC发送FF 02*********返回:FF A2;
05、第3路开:PC发送FF 03*********返回:FF A3;
06、第4路开:PC发送FF 04*********返回:FF A4;
07、第5路开:PC发送FF 05*********返回:FF A5;
08、第6路开:PC发送FF 06*********返回:FF A6;
09、第7路开:PC发送FF 07*********返回:FF A7;
10、第8路开:PC发送FF 08*********返回:FF A8;
11、第1路关:PC发送FF F1*********返回:FF B1;
12、第2路关:PC发送FF F2*********返回:FF B2;
13、第3路关:PC发送FF F3*********返回:FF B3;
14、第4路关:PC发送FF F4*********返回:FF B4;
15、第5路关:PC发送FF F5*********返回:FF B5;
16、第6路关:PC发送FF F6*********返回:FF B6;
17、第7路关:PC发送FF F7*********返回:FF B7;
18、第8路关:PC发送FF F8*********返回:FF B8;
************************************************************
*********************************************************************/
#include<STC12C5A60S2.H> //库文件
#include <intrins.h>
#define uchar unsigned char//宏定义无符号字符型
#define uint unsigned int //宏定义无符号整型
/********************************************************************
初始定义
*********************************************************************/
uchar receBuf[2]={0xee,0xee};
uchar P2dat=0xee;
void B485_send1(uchar c);
void B485_send2(uchar c);
void B485_CLR1();
void B485_CLR1();
/*定义八位数字量输出IO口*/
sbit Y01=P0^0;
sbit Y02=P0^1;
sbit Y03=P0^2;
sbit Y04=P0^3;
sbit Y05=P0^4;
sbit Y06=P0^5;
sbit Y07=P0^6;
sbit Y08=P0^7;
/*定义双485方向控制位*/
sbit RS485_DIR1=P3^2;
sbit RS485_DIR2=P1^1;
/********************************************************************
延时函数
*********************************************************************/
void Delay2ms() //@11.0592MHz
{
unsigned char i, j;
i = 22;
j = 128;
do
{
while (--j);
} while (--i);
}
/********************************************************************
功能:串口初始化,波特率9600,方式1
*********************************************************************/
void Init_Com(void)
{
//串口1初始化
RS485_DIR1=0;//RS485_1设置为接收
SCON = 0x50; //8位数据,可变波特率
AUXR &= 0xBF; //定时器1时钟为Fosc/12,即12T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xFD; //设定定时初值
TH1 = 0xFD; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
//串口2初始化
RS485_DIR2=0;//RS485_2设置为接收
AUXR|=0x10; //启动波特率发生器
S2CON = 0x50; //方式1,八位数据,可变波特率
BRT=0XFD; //设置波特率9600
//串口中断初始化
ES=1; //开串口1中断
IE2=0x01; //开串口2中断
EA=1; //开总中断
}
void Timer0Init(void) //1毫秒@11.0592MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x66; //设置定时初值
TH0 = 0xFC; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //开定时器中断
}
/********************************************************************
配置P4口
*********************************************************************/
void P4_init(void)
{
P4SW|=0x70; //配置P4.4,P4.5,P4.6为IO口
P4M0|=0x10; //配置P4.4,P4.5,P4.6为普通IO口
P4M1|=0x10;
P4|=0x3f; //置P4.0,P4.1,P4.2,P4.3,P4.4,P4.5,P4.6为1
P5|=0x08; //置P5.0,P5.1,P5.2,P5.3为1
}
/********************************************************************
485发送及清零函数
*********************************************************************/
void B485_send1(uchar c)
{
RS485_DIR1=1;
SBUF=c;
Delay2ms();
RS485_DIR1=0;
}
void B485_send2(uchar c)
{
RS485_DIR2=1;
S2BUF=c;
Delay2ms();
RS485_DIR2=0;
}
void B485_CLR1()
{
uchar i;
for( i=0;i<2;i++)
{
receBuf[i] = 0xee;
} i=0;
}
void B485_CLR2()
{
uchar i;
for( i=0;i<2;i++)
{
receBuf[i] = 0xee;
} i=0;
}
/********************************************************************
主函数
*********************************************************************/
void main()
{
Init_Com();//串口初始化
P4_init();
Timer0Init();
while(1)
{
;
}
}
/********************************************************************
串口中断函数
*********************************************************************/
void commIntProc() interrupt 4
{
uchar i;
if(TI)
{
TI = 0;
RS485_DIR1=0;
}
else if(RI)
{
// RI = 0;
for( i=0;i<2;i++)
{
receBuf[i] = SBUF;
while(!RI);RI=0;
Delay2ms();
}
i=0;
} //接收数据SBUF赋与dat
}
/********************************************************************
串口二(485) 发送接收中断函数
*********************************************************************/
void uart2_isr() interrupt 8
{
uchar j;
if( S2CON & 0x01 )
{
for( j=0;j<2;j++)
{
receBuf[j] = S2BUF;
while(!(S2CON &= ~0x01));S2CON &= ~0x01;
Delay2ms();
}
j=0;
}
if( S2CON & 0x02 )
{
S2CON&=0xfd;
RS485_DIR2=0;
}
}
void timer() interrupt 1//定时器0中断
{
TL0 = 0x66; //设置定时初值
TH0 = 0xFC; //设置定时初值
P2dat=P2;
if(receBuf[0]==P2dat)//P2口为薄码开关地址数据
{
switch(receBuf[1]) //接收数据判断
{
case 0xFF: Y01=Y02=Y03=Y04=Y05=Y06=Y07=Y08=0;
B485_send1(P2dat);B485_send1(0xAA);B485_CLR1();
B485_send2(P2dat);B485_send2(0xAA);B485_CLR2();
break; // 全开
case 0x00: Y01=Y02=Y03=Y04=Y05=Y06=Y07=Y08=1;
B485_send1(P2dat);B485_send1(0xBB);B485_CLR1();
B485_send2(P2dat);B485_send2(0xBB);B485_CLR2();
break; // 全关
case 0x01: Y01=0;B485_send1(P2dat);B485_send1(0xA1);B485_CLR1();
B485_send2(P2dat);B485_send2(0xA1);B485_CLR2();break; // 第一路开
case 0x02: Y02=0;B485_send1(P2dat);B485_send1(0xA2);B485_CLR1();
B485_send2(P2dat);B485_send2(0xA2);B485_CLR2();break; // 第二路开
case 0x03: Y03=0;B485_send1(P2dat);B485_send1(0xA3);B485_CLR1();
B485_send2(P2dat);B485_send2(0xA3);B485_CLR2();break; // 第三路开
case 0x04: Y04=0;B485_send1(P2dat);B485_send1(0xA4);B485_CLR1();
B485_send2(P2dat);B485_send2(0xA4);B485_CLR2();break; // 第四路开
case 0x05: Y05=0;B485_send1(P2dat);B485_send1(0xA5);B485_CLR1();
B485_send2(P2dat);B485_send2(0xA5);B485_CLR2();break; // 第五路开
case 0x06: Y06=0;B485_send1(P2dat);B485_send1(0xA6);B485_CLR1();
B485_send2(P2dat);B485_send2(0xA6);B485_CLR2();break; // 第六路开
case 0x07: Y07=0;B485_send1(P2dat);B485_send1(0xA7);B485_CLR1();
B485_send2(P2dat);B485_send2(0xA7);B485_CLR2();break; // 第七路开
case 0x08: Y08=0;B485_send1(P2dat);B485_send1(0xA8);B485_CLR1();
B485_send2(P2dat);B485_send2(0xA8);B485_CLR2();break; // 第八路开
case 0xF1: Y01=1;B485_send1(P2dat);B485_send1(0xB1);B485_CLR1();
B485_send2(P2dat);B485_send2(0xB1);B485_CLR2();break; // 第一路关
case 0xF2: Y02=1;B485_send1(P2dat);B485_send1(0xB2);B485_CLR1();
B485_send2(P2dat);B485_send2(0xB2);B485_CLR2();break; // 第二路关
case 0xF3: Y03=1;B485_send1(P2dat);B485_send1(0xB3);B485_CLR1();
B485_send2(P2dat);B485_send2(0xB3);B485_CLR2();break; // 第三路关
case 0xF4: Y04=1;B485_send1(P2dat);B485_send1(0xB4);B485_CLR1();
B485_send2(P2dat);B485_send2(0xB4);B485_CLR2();break; // 第四路关
case 0xF5: Y05=1;B485_send1(P2dat);B485_send1(0xB5);B485_CLR1();
B485_send2(P2dat);B485_send2(0xB5);B485_CLR2();break; // 第五路关
case 0xF6: Y06=1;B485_send1(P2dat);B485_send1(0xB6);B485_CLR1();
B485_send2(P2dat);B485_send2(0xB6);B485_CLR2();break; // 第六路关
case 0xF7: Y07=1;B485_send1(P2dat);B485_send1(0xB7);B485_CLR1();
B485_send2(P2dat);B485_send2(0xB7);B485_CLR2();break; // 第七路关
case 0xF8: Y08=1;B485_send1(P2dat);B485_send1(0xB8);B485_CLR1();
B485_send2(P2dat);B485_send2(0xB8);B485_CLR2();break; // 第八路关
default:break; // 跳出
}
}
}
|