实现功能:串口发送控制继电器开关
使用芯片:STC15F104E
晶振:12MHZ
编译环境:Keil
/********************************************************************实现功能:串口发送控制继电器开关使用芯片:STC15F104E晶振:12MHZ编译环境:Keil *********************************************************************//********************************************************************单片机与PC机采用9针串口,MAX232通讯,波特率默认为9600.单片机接收PC机发送的数据码表如下:01、开:PC发送'A'; 02、关:PC发送'B'; 03、输出状态查询:PC发送C;单片机返回输出状态‘A’表示开 ‘B’表示关;04、继电器状态取反:PC发送D 继电器状态取反*********************************************************************/#include "reg52.h" #include <intrins.H>#define uchar unsigned char //宏定义字符型变量#define uint unsigned int //宏定义整型变量/******************************************************************** 波特率设定*********************************************************************///#define BAUD 0XF400 //1200bps@ 11.0592MHZ//#define BAUD 0XFA00 //2400bps@ 11.0592MHZ//#define BAUD 0XFD00 //4800bps@ 11.0592MHZ#define BAUD 0XFE80 //9600bps@ 11.0592MHZ//#define BAUD 0XFF40 //19200bps@ 11.0592MHZ//#define BAUD 0XFFA0 //38400bps@ 11.0592MHZuchar dat; //用于存储单片机接收发送缓冲寄存器SBUF里面的内容sbit P33=P3^3; //定义继电器控制输出脚/******************************************************************** 定义特殊寄存器*********************************************************************/sfr AUXR = 0x8E; //辅助寄存器sbit RXB=P3^0;sbit TXB=P3^1;/******************************************************************** 定义数据类型*********************************************************************/uchar TBUF,RBUF;uchar TDAT,RDAT;uchar TCNT,RCNT;uchar TBIT,RBIT;uint TING,RING;uint TEND,REND;void UART_INIT(); //声明函数uchar t,r; //定义数据类型uchar but[16]; //数据存储数组/******************************************************************** 延时函数*********************************************************************/void delay(uchar t){ uchar i,j; for(i=0;i<t;i++) { for(j=13;j>0;j--); { ; } }}/******************************************************************** 主函数*********************************************************************/void main(){TMOD=0X00; //定时器T0设定AUXR=0X80; //辅助寄存器TL0=BAUD; //十六位寄存器TH0=BAUD>>8; //十六位寄存器TR0=1; //开定时器ET0=1;PT0=1;EA=1; //开总中断UART_INIT(); //串口初始化while(1) //无线循环{if(REND) { REND=0; r++; //but[r++&0x0f]=RBUF; dat=RBUF; } if(TEND) { if(t!=r) { TEND=0;// TBUF=dat;switch(dat) //接收数据判断{uchar k;k=10;case 'A': P33=1;delay(k);TBUF = dat;dat=0xee;break; // 开case 'B': P33=0;delay(k);TBUF = dat;dat=0xee;break; // 关case 'C': if(P33==1){TBUF = 'A';}if(P33==0){TBUF = 'B';}delay(k);dat=0xee;break; // 读输出口状态case 'D': P33=!P33;delay(k);TBUF = dat;dat=0xee;break; // 输出口取反default:break; // 跳出} t++; //TBUF=but[t++&0x0f]; TING=1; } }/******************************************************************** 接收数据判断函数*********************************************************************/}}/******************************************************************** 定时器T0*********************************************************************/void tm0()interrupt 1 using 1{ if(RING) { if(--RCNT==0) { RCNT=3; if(--RBIT==0) { RBUF=RDAT; RING=0; REND=1; } else { RDAT>>=1; if(RXB)RDAT|=0X80; } } } else if(!RXB) { RING=1; RCNT=4; RBIT=9; } if(--TCNT==0) { TCNT=3; if(TING) { if(TBIT==0) { TXB=0; TDAT=TBUF; TBIT=9; } else { TDAT>>=1; if(--TBIT==0) { TXB=1; TING=0; TEND=1; } else { TXB=CY; } } } }}/******************************************************************** 功能:串口初始化,波特率9600,方式1*********************************************************************/void UART_INIT(){TING=0;RING=0;TEND=1;REND=0;TCNT=0;RCNT=0;}/******************************************************************** 结束*********************************************************************/