- #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;//发送完成标志
-
- }
- }
复制代码
|