您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 第21章 单片机远距离通信模块
21.2.3单片机与PC机通信模块的的程序设计sbitRE_DE=P1^0;unsignedchard_rightframe;//正确数据帧标志unsignedcharP_RS485;//RS485中断接收数据帧的位置unsignedcharidatad_addresscode;//数据帧的地址信息unsignedcharidatad_commandcode[2];//数据帧命令码unsignedcharidatad_databuff[i];//数据帧数据序列unsignedcharidatad_checkdata;//数据帧累加和校验码unsignedcharidatad_end;//数据帧结束符unsignedcharidatad_syscheck;//中断接收程序计算所得到的累加和校验码sys_initial(){TMOD=0x21;//定时器1定义为方式2,定时器0定义为工作方式1PCON=0x00;//数据传输速率选择SCON=0x88;//串行口为方式2ES=1;//允许串行口中断PS=1;//设置串口中断优先级TL1=0xE6;TH1=0xE6;//置初值,对应于2400bit/s的波特率TR1=1;EA=1;//打开单片机中断允许}receive_isp(void)interrupt4using3{if(RI)//处理接收中断{RI=0;//清除中断标志if(P_RS485==0)//串口接收中断处于接收帧起始字节阶段{if(SBUF!==0x02)//是否为有效的帧起始字节{P_RS485=0;}else{P_RS485==1;//串口接收状态标志更新}}elseif(P_RS485==1){d_addresscode=SBUF;//保存接收的单片机地址信息P_RS485=2;d_syscheck=0x00;//准备进行数据和校验}elseif(P_RS485==2){for(i=0;i2;i++){d_commandcode=SBUF;//保存命令码信息d_syscheck+=d_commandcode;//更新累加和校验信息}P_RS485=3;}elseif(P_RS485==3){for(i=0;id_datalength;i++){d_databuff[i]=SBUF;//保存数据序列信息d_syscheck+=d_databuff[i];//更新和校验码}P_RS485=4;}elseif(P_RS485==4){d_checkdata=SBUF;//保存校验码if(d_syscheck!=d_checkdata)//累加和校验和错误{d_rightframe=0;//置数据无效标志P_RS485=0;//复位RS485接收中断程序状态}else{P_RS485=5;}}elseif(P_RS485==5){d_end=SBUF;//保存结束码if(d_end!=0x16)//错误的帧结束标志{d_rightframe=0;//置数据无效标志P_RS485=0;//复位RS485接收中断程序状态}elseif(d_end==0x16){d_rightframe=1;//置数据有效标志P_RS485=0;//置RS485接收中断程序状态为0}if(TI){TI=0;//处理发送中断}}//延时函数voiddelay(){unsignedinti;for(i=0;i125;i++){}}//串口数据发送程序voidsend_data(){d_checkdata=0x00;//累加和校验码清零RE_DE=1;//设置MAX485发送状态SBUF=0x02;//发送帧起始标志delay();//延时SBUF=d_addresscode;//发送单片机地址信息delay();//延时for(i=0;i2;i++){SBUF=d_commandcode;//发送命令码d_checkdata+=d_commandcode;//更新累加和校验信息delay();//延时}for(i=0;idatalength;i++){SBUF=d_databuff[i];//发送数据序列d_checkdata+=d_databuff[i];//更新累加和校验信息delay();//延时}SBUF=d_checkdata;//发送累加和校验码delay();//延时SBUF=0x16;//发送帧结束标志delay();//延时RE_DE=0;//设置MAX485接收状态}21.3.3基于SJA1000的CAN总线通信模块的程序的设计//SJA1000的各寄存器的地址定义#defineCan_CR0xE800//定义控制寄存器地址#defineCan_CMR0xE801//定义命令寄存器地址#defineCan_SR0xE802//定义状态寄存器地址#defineCan_IR0xE803//定义中断寄存器地址#defineCan_ACR0xE804//定义验收码寄存器地址#defineCan_AMR0xE805//定义验收屏蔽寄存器地址#defineCan_BT00xE806//定义总线定时寄存器0地址#defineCan_BT10xE807//定义总线定时寄存器1地址#defineCan_OCR0xE808//定义输出控制寄存器地址#defineSend_Start0xE80A//定义发送缓冲器的起始地址#defineReceive_Start0xE814//定义接收缓冲器的起始地址#defineCan_CLOCK0xE81F//定义时钟分频寄存器的地址#defineData_Storeadr0xE850//单片机暂存报文的起始地址//SJA1000的初始化函数voidSJA_Intial(){XBYTE[Can_CR]=0x01;//关闭所有中断源,置复位状态if(XBYTE[Can_CR]&0xFF==1){XBYTE[Can_CLOCK]=0x08;//设置为Basic_CAN模式,CLOCKOFF不输出XBYTE[Can_ACR]=0x01;//设置验收码为00000001bXBYTE[Can_AMR]=0xFE;//设置验收屏蔽码,仅最低位为相关位XBYTE[Can_BT0]=0x00;//设置系统时钟为振荡器时钟的两倍,同步跳转宽度等于系统时钟XBYTE[Can_BT1]=0x80;//SAM位置高,采用低/中速总线速率XBYTE[Can_OCR]=0xAA;//设置输出寄存器,使输出方式为正常输出模式}XBYTE[Can_CR]=0x1A;//开SJA1000接收中断、超载中断,置系统为正常运行状态}//外部中断0设置voidInt0_Intial(){IP=0x00;//优先级设置为0IT0=0;//设置中断触发方式为低电平触发EA=1;//中断允许EX0=1;//开外部中断0}//中断接收函数voidInt0_receieve()interrupt0{unsignedcharsign,int_receive;unsignedchardata_receive;unsignedcharreceive_over;EA=0;//关中断sign=XBYTE[Can_IR];if(sign&0x01==1)//如果该中断信号为接收中断{XBYTE[Can_CMR]=0x04;//释放接收缓冲器XBYTE[Can_CMR]=0x00;int_receive=1;//置接收中断标志}elseif(sign&0x02==8)//如果该中断信号为超载中断{XBYTE[Can_CMR]=0x08;//清除超载状态XBYTE[Can_CMR]=0x00;}if(int_receive=1)//如果中断接收标志被置位{data_receive=XBYTE[Receive_Start];for(i=0;i10;i++)//单片机读取接收缓冲器的标识符、RTR位、数据长度码何数据场{data_receive=XBYTE[Receive_Start];XBYTE[Data_Storeadr]=data_receive;Receive_Start++;Data_Storeadr++;}receive_over=1;//置报文接收完成标志EA=1;//开中断}}voiddata_send(){unsignedcharflag;unsignedcharsend_over;unsignedchardata_send;flag=XBYTE[Can_SR];if(flag&0x10==16)//判断SR.4位是否为1?{if(flag&0x04==4)//判断SR.2位是否为1?{for(i=0;i10;i++)//将数据帧和数据写入发送缓冲器{data_send=XBYTE[Send_Start];XBYTE[Data_Storeadr]=data_send;Send_Start++;Data_Storeadr++;//将报文写入发送缓冲器}}}XBYTE[Can_CMR]=0x01;//置发送请求if(flag&0x08==8)//判断报文是否完成?{send_over=1;//如果完成,置发送完成标志}}
本文标题:第21章 单片机远距离通信模块
链接地址:https://www.777doc.com/doc-319499 .html