以上是我买的单片机成品板子的485通讯程序,我烧进去,但是无法与串口屏通讯,请教各位大佬指点一二,本人刚入门,还不太懂这个要怎么配置。
- #include "main.h"
- #include "init.h"
- #define ENABLE_IAP 0x83 //系统工作时钟<12MHz 时,对IAP_CONTR 寄存器设置此值
- #define CMD_IDLE 0
- #define CMD_READ 1
- #define CMD_PROGRAM 2
- #define CMD_ERASE 3
- #define ENABLE_IAP 0x83//SYSCLK<12MH
- #define IAP_ADDRESS 0x0000 //存储地址
- uint8 add; //掉电保持485的地址
- uint8 j=0;
- uint8 dat=0X00;
- bit flag_zx=0;
- uint8 sendPosi=0; //发送缓冲区指针
- uint8 receCount=0; //接收缓冲区指针
- uint8 sendCount=0; //需要发送数据个数
- uint8 receTimeOut=0; //通讯超时值
- uint8 byteCount=5; //发送个数
- uint8 sendBuf[10]; //发送缓冲区
- uint8 receBuf[10]; //接收缓冲区
- /********************************************************************
- 定义数据类型
- *********************************************************************/
- uint8 TBUF,RBUF;
- uint8 TDAT,RDAT;
- uint8 TCNT,RCNT;
- uint8 TBIT,RBIT;
- bit TING,RING;
- bit TEND,REND;
- uint8 t,r,ii; //定义数据类型
- uint8 but[16]; //数据存储数组
- /********************************************************************
- 定义 ISP/IAP/EEPROM 命令
- *********************************************************************/
- void IapIdle();//禁用 ISP/IAP/EEPROM functionmake 单片机 在 一 安全 状态
- uint8 IapReadByte(uint16 addr);//读数据
- void IapProgramByte(uint16 addr, uint8 dat);//写数据
- void IapEraseSector(uint16 addr);//擦除数据
- void delay()//延时程序
- {
- uint8 m,n,s;
- for(m=100;m>0;m--)
- for(n=200;n>0;n--)
- for(s=248;s>0;s--);
- }
- /****************发送函数*********************/
- void senduart2()
- { RS485_DIR=1;
- for(ii=0;ii<5;ii++)
- {
- if(TEND) //允许发送
- {
- TEND=0;
- TBUF=sendBuf[t++&0x0F];
- TING=1;
- }
- while(!TEND);
- }
- t=0;
- RS485_DIR=0;
- }
- /*****************清空发送缓冲区*************************/
- void clear_receBuf()
- {
- uint8 i;
- for(i=0;i<5;i++)
- {
- receBuf[i]=0;
- }
- }
- void main()
- {
- delay();
- clear_receBuf();
- add= IapReadByte(0x01);//读取存储的值
- if(add==0xff)
- add=0x00;
- ConfigUART1();
- TR0=1;
- EA=1;
-
-
- while(1)
- {
- if(REND) //如果有接收
- {
- REND=0; //接收标志清零
- receBuf[r++&0x0F]=RBUF; //把接受的数据存储到BUT数组中
- if(r>=5)
- { r=0;
- flag_zx=1;
- }
- }
- if(flag_zx==1)
- {
- flag_zx=0;
- //0 1 2 3 4
- //起始位 地址位 功能位 数据位 结束位
- if((receBuf[0]==0xaa)&&(receBuf[4]==0xbb)&&(receBuf[1]==add)) //如果开始位和结束位,还有地址都正确,进行下一步判断
- {
- if(receBuf[2]==0x01) //修改板子地址
- {
- add=receBuf[3];
- IapEraseSector(0); //擦除扇区
- IapProgramByte(0x01,add);//写入新的地址
- }
- else if(receBuf[2]==0x02) //打开单路继电器
- {
- switch(receBuf[3])
- {
- case 0x01: COM1=0; break;
- case 0x02: COM2=0; break;
- case 0x03: COM3=0; break;
- case 0x04: COM4=0; break;
- default:break;
- }
- }
- else if(receBuf[2]==0x03) //关闭单路继电器
- {
- switch(receBuf[3])
- {
- case 0x01: COM1=1; break;
- case 0x02: COM2=1; break;
- case 0x03: COM3=1; break;
- case 0x04: COM4=1; break;
- default:break;
- }
- }
- else if(receBuf[2]==0x04) //打开全部继电器
- {
- if(receBuf[3]==0xff)
- {
- COM1=0; COM2=0; COM3=0;COM4=0;
- }
- }
- else if(receBuf[2]==0x05) //关闭全部继电器
- {
- if(receBuf[3]==0x00)
- {
- COM1=1; COM2=1; COM3=1; COM4=1;
- }
- }
- else if(receBuf[2]==0x06) //查询继电器
- {
- sendBuf[0]=0xaa;
- sendBuf[1]=add;
- sendBuf[2]=0x07;
- //sendBuf[3]=0xfe;
- sendBuf[4]=0xbb;
- switch(receBuf[3])
- {
- case 0x01: if(COM1==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x02: if(COM2==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x03: if(COM3==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x04: if(COM4==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- default:break;
- }
- senduart2();
- }
- else if(receBuf[2]==0x08) //查询输入状态
- {
- sendBuf[0]=0xaa;
- sendBuf[1]=add;
- sendBuf[2]=0x09;
- //sendBuf[3]=0xfe;
- sendBuf[4]=0xbb;
-
- switch(receBuf[3])
- {
- case 0x01: if(IN1==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x02: if(IN2==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x03: if(IN3==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x04: if(IN4==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x05: if(IN5==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x06: if(IN6==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x07: if(IN5==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- case 0x08: if(IN6==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
- default:break;
- }
- senduart2();
- }
- }
- if((receBuf[0]==0xaa)&&(receBuf[1]==0x00)&&(receBuf[2]==0x00)&&(receBuf[3]==0x00)&&(receBuf[4]==0xbb))
- {
- add=0x00;
- IapEraseSector(0); //擦除扇区
- IapProgramByte(0x01,0x00);//写入新的地址
- }
- clear_receBuf();
- }
- }
- }
- // /**********************************************************
- //放在主函数,定时0溢出中断函数,
- //*********************/
- 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;
- }
- }
- }
- }
- }
- void IapIdle(){//禁用 ISP/IAP/EEPROM functionmake 单片机 在 一 安全 状态
- IAP_CONTR = 0; //
- IAP_CMD = 0; //
- IAP_TRIG = 0; //
- IAP_ADDRH = 0x80; //
- IAP_ADDRL = 0; //
- }
- uint8 IapReadByte(uint16 addr){//读数据
- uint8 dat;
- IAP_CONTR = ENABLE_IAP;
- IAP_CMD = CMD_READ;
- IAP_ADDRL = addr;
- IAP_ADDRH = addr >> 8;
- IAP_TRIG = 0x5A;
- IAP_TRIG = 0xA5;
- _nop_();
- dat = IAP_DATA;
- IapIdle();
- return dat;
- }
- void IapProgramByte(uint16 addr, uint8 dat){//写数据
- IAP_CONTR = ENABLE_IAP;
- IAP_CMD = CMD_PROGRAM;
- IAP_ADDRL = addr;
- IAP_ADDRH = addr >> 8;
- IAP_DATA = dat;
- IAP_TRIG = 0x5A;
- IAP_TRIG = 0xA5;
- _nop_();
- IapIdle();
- }
- void IapEraseSector(uint16 addr){//擦除数据
- IAP_CONTR = ENABLE_IAP;
- IAP_CMD = CMD_ERASE;
- IAP_ADDRL = addr;
- IAP_ADDRH = addr >> 8;
- IAP_TRIG = 0x5A;
- IAP_TRIG = 0xA5;
- _nop_();
- IapIdle();
- }
复制代码 |