|
主機(jī)代碼:
#include <STC15.h>
#include <INTRINS.H>
#define uint unsigned int //宏命令,聲明uint替代unsignde int
#define uchar unsigned char //宏命令,聲明uchar替代unsigned char
sbit a=P1^0;
sbit b=P1^1;
sbit c=P1^2;
sbit d=P1^3;
sbit e=P1^4;
sbit f1=P1^5;
sbit ss=P1^6;
sbit xx=P1^7;
sbit rs485=P5^5; //485方向控制腳
sbit s1=P2^0;
sbit s2=P2^0;
sbit s3=P2^0;
sbit s4=P2^0;
sbit s5=P2^0;
sbit s6=P2^0;
sbit s7=P2^0;
sbit s8=P2^0;
sbit s9=P2^0;
sbit s10=P2^0;
uchar shuxian,run,as1,as2,as3,as4,as5,as6,as7,as8,as9,as10,ast,ads;//數(shù)顯及按鍵指令
uchar sdat[4]; //串口接收到的數(shù)組
uchar fdat[4]; //串口要發(fā)送的數(shù)組
uchar fadd,sadd,add; //廣播地址碼,接收地址碼,主機(jī)地址碼。
uchar key,cnt; //握手信號,送數(shù)計(jì)量。
uint clt; //定時(shí)變量最大值65536即65秒。
void ysms(uint xms)
{
uint i,j,k;
for(i=xms;i>0;i--)
for(j=50;j>0;j--)
for(k=1;k>0;k--);
}
/* 串口配置函數(shù),baud-通信波特率 */
void ConfigUART()
{
SCON = 0x50; //8位數(shù)據(jù),可變波特率
AUXR |= 0x01; //串口1選擇定時(shí)器2為波特率發(fā)生器
AUXR |= 0x04; //定時(shí)器2時(shí)鐘為Fosc,即1T
T2L = 0xE0; //設(shè)定定時(shí)初值
T2H = 0xFE; //設(shè)定定時(shí)初值
AUXR |= 0x10; //啟動定時(shí)器2
TH0 = 0xfc; // 設(shè)置定時(shí)器0高8位初值 11.0592Mhz主頻下該參數(shù)溢出一次約0.001秒
TL0 = 0x66; //設(shè)置定時(shí)器0低8位
TR1 = 1; //啟動T1
ET0=1; //關(guān)閉T1中斷使能
EA=1; //總中斷開關(guān)
ES=1; //使能串口1中斷
}
void main()
{
P0M0 = 0x00;
P0M1 = 0x00;
P1M0 = 0x00;
P1M1 = 0x00;
P2M0 = 0x00;
P2M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P4M0 = 0x00;
P4M1 = 0x00;
P5M0 = 0x00;
P5M1 = 0x00;
P6M0 = 0x00;
P6M1 = 0x00;
P7M0 = 0x00;
P7M1 = 0x00;
key=1; //初始允許廣播握手
cnt=0;
ConfigUART(); //配置波特率為9600
TI=0;RI=0;
shuxian = 11;
run = 12;
fadd = 1;
cnt=0;
while (1)
{
fdat[0]=fadd; //發(fā)送數(shù)組0字節(jié)為讀取fadd變量
fdat[1]=255;
fdat[2]=255;
fdat[3]=255;
if(key==1)
{
rs485=1; //設(shè)置485為發(fā)送方向
ET0=0; //
TR0=0;
clt=0;
REN=0;
for(cnt=0;cnt<4;cnt++) //FOR循環(huán)送4個(gè)字節(jié)
{
SBUF=fdat[cnt];
while(!TI);
TI=0; //清零發(fā)送完畢標(biāo)記
}
rs485=0; //設(shè)置485為接收方向
TR0=1;
ET0=1;
clt=0;
fadd++; //廣播地址值+1
if(fadd>=8){fadd=1;} //如果廣播地址超過或等于8.則重新置為1;
key=0; //握手信號清零
}
}
}
/* T0中斷服務(wù)函數(shù),完成LED掃描 */
void InterruptTimer0() interrupt 1
{
TH0 = 0xfc; //重新加載重載值
TL0 = 0x66;
clt++;
if(clt>=500){key=1;clt=0;} //定時(shí)超過0.5秒后,重新發(fā)起握手信號
}
/* UART中斷服務(wù)函數(shù) */
void InterruptUART() interrupt 4
{
if(RI) //此主機(jī)暫不接收任何數(shù)據(jù)這部分不用理會
{
sdat[cnt] = SBUF;
cnt++;
RI=0;
}
}
從機(jī)代碼
#include <stc15.h>
#define uint unsigned int //宏命令,聲明uint替代unsignde int
#define uchar unsigned char //宏命令,聲明uchar替代unsigned char
#define S1_S0 0x40 //P_SW1.6
#define S1_S1 0x80 //P_SW1.7
sbit xxd=P1^0;
sbit ssd=P1^1;
sbit a=P1^2;
sbit b=P1^3;
sbit c=P1^4;
sbit rs485=P1^5;
sbit jxd=P1^6;
sbit fd=P1^7;
sbit wha=P5^4;
sbit ds=P5^5;
uchar shuxian = 0;
uchar as,jt,ss,xx,addr,cnt,fadd,key;
uchar sdat[4]; //串口接收到的數(shù)組
uchar fdat[4]; //串口發(fā)送的數(shù)組
uchar t;
uint clt;
void ysms(uint xms)
{
uint i,j,k;
for(i=xms;i>0;i--)
for(j=50;j>0;j--)
for(k=1;k>0;k--);
}
/* 串口配置函數(shù),baud-通信波特率 */
void ConfigUART()
{
SCON = 0x50; //8位數(shù)據(jù),可變波特率
AUXR |= 0x01; //串口1選擇定時(shí)器2為波特率發(fā)生器
AUXR |= 0x04; //定時(shí)器2時(shí)鐘為Fosc,即1T
T2L = 0xE0; //設(shè)定定時(shí)初值
T2H = 0xFE; //設(shè)定定時(shí)初值
AUXR |= 0x10; //啟動定時(shí)器2
EA=1; //總中斷開關(guān)
ES=1; //使能串口1中斷
}
void main()
{
P0M0 = 0x00;
P0M1 = 0x00;
P1M0 = 0x00;
P1M1 = 0x00;
P2M0 = 0x00;
P2M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P4M0 = 0x00;
P4M1 = 0x00;
P5M0 = 0x00;
P5M1 = 0x00;
P6M0 = 0x00;
P6M1 = 0x00;
P7M0 = 0x00;
P7M1 = 0x00;
a=0;b=0;c=0;ssd=0;xxd=0;jxd=0;fd=0;
cnt=0;
ConfigUART();
TI=0;RI=0;
shuxian=1;
while (1)
{
rs485=0;
shuxian=sdat[0];
switch(shuxian) //數(shù)組0字節(jié)顯示函數(shù)
{
case 1 : a=1;b=0;c=0; break;
case 2 : a=0;b=1;c=0; break;
case 3 : a=1;b=1;c=0; break;
case 4 : a=0;b=0;c=1; break;
case 5 : a=1;b=0;c=1; break;
case 6 : a=0;b=1;c=1; break;
case 7 : a=1;b=1;c=1; break;
}
}
}
/* UART中斷服務(wù)函數(shù) */
void InterruptUART() interrupt 4
{
RI = 0;
sdat[cnt] = SBUF;
cnt++;
if(cnt>=4){cnt=0;}
}
|
|