/********************************************************************
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; // 跳出
}
}
}
|