- #include<reg51.h>
- #define FOSC 11059200UL//晶振值
- //#define baud 9600
- #define BRT (65536 - FOSC / baud / 4)//重載值
- sfr AUXR = 0x8e;
- sfr T2H = 0xd6;
- sfr T2L = 0xd7;
- sfr P1M0=0x92;
- sfr P1M1=0x91;
- sfr P3M0 = 0xb2;
- sfr P3M1 = 0xb1;
- sbit rts=P3^3;
- sfr P_SW1 = 0xa2;
- sbit red=P1^7;
- //sbit green=P1^2;
- //sbit yellow=P3^2;
- //sbit travelswitch=P3^4;
- char buft[20]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,0x11};//數據發送緩沖
- char bufr[20];//接收
- char buf[30];//保存數據
- int flagtxd=0;//發送標志
- int flag0_5s=0;//定時0.5秒的標志
- int cnt=0;//定時計數標志
- int flagred=0;//紅燈閃爍標志
- int rlen=0;//接收數據的長度
- void ea_on();//開總中斷
- void ea_off();//關總中斷
- void configuart(int baud);//串口配置,baud為波特率
- void uartinit();//串口初始化配置
- void uart_interrupt_on();//串口中斷打開
- void uart_interrupt_off();//串口中斷關閉
- //void uart_r(char *bufr,char len);//串口接收
- void uart_t();//串口發送
- void max485(bit x);//max485x為0接收為1發送
- void timerpattern();//定時器模式
- void timerinitialize();//定時器初值
- void timert0on();//定時器T0啟動
- void timert0off();//定時器T0關閉
- void t0interrupton();//開TO中斷
- void t0interruptoff();//關T0中斷
- void redledon();//紅燈亮
- void redledoff();//紅燈滅
- //void greenledon();//綠燈亮
- //void greenledoff();//綠燈滅
- //void yellowledon();//黃燈亮
- //void yellowledoff();//黃燈滅
- void redblink();//紅燈閃
- void iopattern();//IO口配置
- char analysis_len(char *bufr,char rlen);//解析串口一段數據長度
- void analysis();//解析數據
- void main()
- {
- iopattern();
- timerpattern();
- timerinitialize();
- ea_on();
- t0interrupton();
- //timert0on();
-
- red=0;
- //max485(0); //max485為接收
- max485(1);
- uartinit();
- configuart(9600);
- uart_interrupt_on();
- // analysis_len(bufr,rlen);
-
- // analysis();
-
-
-
-
- while(1)
- {
- //analysis();
- //uart_t();
- red=1;
- flagtxd=1;
- SBUF=buft[5];
- while(flagtxd);
- // switch(buf[0])
- // {
- // case 0x01:redledon();break;
- // case 0x02:redblink();break;
- // case 0x03:redledoff();break;
- // }
- //redblink();
-
- }
- }
-
- void ea_on()//開總中斷
- {
- EA=1;
- }
- void ea_off()//關總中斷
- {
- EA=0;
- }
- void configuart(int baud)//串口配置,baud為波特率
- {
-
- T2L =(65536 - FOSC / baud / 4);
- T2H =(65536 - FOSC / baud / 4)>> 8;
- AUXR = 0x15;//定時器2作波特率發生器
- }
- void uartinit()//串口初始化配置
- {
- P_SW1 = 0x40; //RXD_2/P3.6, TXD_2/P3.7
- SCON = 0x50;//設置串口為模式1可變波特率8位數據方式
- // INT_CLKO &= ~0x02; //不輸出時鐘
- }
- void uart_interrupt_on()//串口中斷打開
- {
- ES=1;
- }
-
- void uart_interrupt_off()//串口中斷關閉
- {
- ES=0;
- }
- //void uart_r(char *bufr,char len)//接收
- //{
- // int i;
- // if((SBUF^0x02)!=0)//是否為0x02開頭不是則丟棄數據
- // {
- // for(i=0;i<=len;i++)
- // {
- // bufr[i]=SBUF;
- // while(!RI)
- // {
- // flag0_5s=0;
- // timert0on();
- // t0interrupton();
- // if(flag0_5s==1)
- // {
- // flag0_5s=0;
- // timert0off();
- // t0interruptoff();
- // break;
- // }
- //
- // }
- // }
- // }
- //}
- void uart_t()//發送
- {
- int i;
- for(i=0;i<10;i++)
- {
- flagtxd=0;
- SBUF=buft[i];
- while(!flagtxd);//等待發送結束
- // {
- // timert0on();
- // t0interrupton();
- // if(flag0_5s==1)
- // {
- // flag0_5s=0;
- // timert0off();
- // t0interruptoff();
- // break;
- // }
- //
- // }
- }
- }
- void max485(bit x)
- {
- rts=x;
- }
- void timerpattern()
- {
- TMOD=0x01;
- }//定時器為模式1非自動重載
- void timerinitialize()
- {
- TH0=0xD5;
- TL0=0x08;
- }//定時器初始化
- void timert0on()
- {
- TR0=1;
- }//定時器T0啟動
- void timert0off()
- {
- TR0=0;
- }//定時器T0關閉
- void t0interrupton()
- {
- ET0=1;
- }//開TO中斷
- void t0interruptoff()
- {
- ET0=0;
- }//關T0中斷
- void redledon()
- {
- red=1;
- }
- //紅燈亮
- void redledoff()
- {
- red=0;
- }
- //紅燈滅
- //void greenledon()
- //{
- // green=1;
- //}
- ////綠燈亮
- //
- //void greenledoff()
- //{
- // green=0;
- //}//綠燈滅
- //
- //void yellowledon()
- //{
- // yellow=1;
- //}//黃燈亮
- //
- //void yellowledoff()
- //{
- // yellow=0;
- //}//黃燈滅
- void redblink()
- {
- if(flagred==1)
- {
- flagred=0;
- red=~red;
- }
- }
- void iopattern()
- {
- P1M0=0x00;//準雙向模式
- P1M1=0x00;
- P3M0=0x88;
- P3M1=0x00;
- }//IO口配置
- //char analysis_len(char *bufr,char len)
- //{
- // char cnt,i,j;
- // char k=0;
- // for(i=0;i<=len;i++)
- // {
- // if(bufr[i]==0x02)
- // {
- // cnt=1;
- // buf[k]=bufr[i];
- // for(j=0;j<=len;j++)
- // {
- // cnt++;
- // buf[k++]=bufr[i+j];
- // if(bufr[i+j]==0x03)
- // {
- // return cnt;
- // }
- // }
- // }
- //
- // }
- // return 0;
- //}
- void analysis()
- {
- int i;
- for(i=0;i<=30;i++)
- {
- if(buf[i]==0x02)
- {
- if(buf[i+1]==0x30)
- {
- if(buf[i+3]==0x30)
- {
- if(buf[i+4]==0x30)
- {
- if(buf[i+5]==0x03)
- {
- switch (buf[i+2])
- {
- case 0x31:redledon();break;
- case 0x32:redblink();break;
- case 0x33:redledoff();break;
- }
- }
- }
- }
- }
- }
- }
- // if(buf[0]!=0x02)
- // return;
- // else if(buf[1]!=0x30)
- // return;
- // else if(buf[3]!=0x30)
- // return;
- // else if(buf[4]!=0x30)
- // return;
- // else if(buf[5]!=0x03)
- // return;
- // else
- // //if(((buf[1]==0x30)&&(buf[3]==0x30))&&((buf[4]==0x30)&&(buf[5]==0x03)))
- // {
- // switch(buf[2])
- // {
- // case 0x31:redledon();break;
- // case 0x32:redblink();break;
- // case 0x33:redledoff();break;
- // }
- // }
- }
- void interrupttimer() interrupt 1
- {
- TH0=0xD5;
- TL0=0x08;
- cnt++;
-
- if(cnt>=50)
- {
- cnt=0;
- flag0_5s=1;
- flagred=1;
- //flag2s++;
-
- }
- }//中斷定時0.5秒
- void uart_interrupt() interrupt 4//串口中斷
- {
- if(RI) //接收到字節
- {
- RI=0;//軟件清零接收中斷標志位
- //if(rlen<20)
- //{
- buf[rlen]=SBUF;
- rlen++;
- //}
- // if(rlen<20)
- // {
- // bufr[rlen]=SBUF;
- // rlen++;
- // }
- }
- if(TI)//發送字節
- {
- TI=0;//軟件清零發送中斷標志位
- flagtxd=1;//發送完成標志
-
- }
- }
復制代碼
|