单片机双机同步通信 1 单片机PIC1编程(主控发送) #include <pic.h> /*该程序实现单片机双机同步通信功能,是主控发送部分。程序上电后显示 *相应的字符,表示系统正常工作。发送完毕后显示发送的数据*/ unsigned char tran[8]; /*定义一个数组存储发送数据*/ unsigned char k,data; /*定义通用寄存器*/ const char table[20]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x7f,0xbf,0x89,0xff}; /*不带小数点的的显示段码表*/ /*spi显示初始化子程序*/ void SPIINIT() { ;详细程序语句请参考本章8.5节 } /*给发送数组赋初值子程序 */ void fuzhi() { for(k=0;k<8;k++){ tran[k]=k; } /*发送0~7八个数据*/ } /*SCI部件初始化子程序*/ void sciint() { SPBRG=200 ; /*将传输的波特率设为约9600位/秒*/ TXSTA=0X90; /*选择主控方式*/ RCSTA=0X80; /*允许同步串行口工作*/ TRISC6=1; TRISC7=1; /*将RC6、RC7设置为输入方式,对外部呈高阻状态*/ } /*SPI传送数据子程序*/ void SPILED(data) { ;详细程序语句请参考本章8.5节 } /*显示子程序,显示8位数*/ void display() { RA5=0; /*准备锁存*/ for(k=0;k<8;k++){ data=tran[k]; data=table[data]; /*查得显示的段码*/ SPILED(data); /*发送显示段码*/ } RA5=1; /*最后给一个锁存信号,代表显示任务完成*/ } /*显示子程序,显示8位数*/ void display1() { RA5=0; /*准备锁存*/ for(k=0;k<8;k++){ data=0xf9; /*显示"1"表示系统正常工作*/ SPILED(data); /*发送显示段码*/ } RA5=1; /*最后给一个锁存信号,代表显示任务完成*/ } /*主程序*/ main() { SPIINIT(); /*spi显示初始化*/ fuzhi(); /*给发送数组赋发送初值*/ sciint(); /*SCI部件初始化*/ di(); /*中断禁止*/ TXEN=1; /*发送允许*/ display1(); /*显示相应的字符,表示系统正常*/ while(1){ for(k=0;k<8;k++){ TXREG=tran[k];/*发出一个字符*/ while(1){ if(TXIF==1) break; } /*等待上一个数据写入完成*/ } display(); /*显示发送的数据*/ } /*循环发送*/ } 2 单片机PIC2编程(从动接收) #include <pic.h> /*该程序实现单片机双机 同步通信功能,是从动接收部分,并把接收的数据显 *示在8个LED上*/ unsigned char rece[8]; /*定义一个数组存储接收数据*/ unsigned char k,data; /*定义通用寄存器*/ unsigned int i; const char table[20]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x7f,0xbf,0x89,0xff}; /*不带小数点的显示段码表*/ /*spi显示初始化子程序*/ void SPIINIT() { ;详细程序语句请参考本章8.5节 } /*SCI部件初始化子程序*/ void sciint() { TXSTA=0X10 ; /*选择同步从动方式*/ RCSTA=0X90; /*串行口工作使能*/ TRISC6=1; TRISC7=1; /*将RC6、RC7设置为输入方式对外部呈高阻状态*/ } /*SPI传送数据子程序*/ void SPILED(data) { ;/*详细程序语句请参考本章8.5节*/ } /*显示子程序,显示4位数*/ void display() { RA5=0; /*准备锁存*/ for(k=0;k<8;k++){ data=rece[k]; data=table[data]; /*查得显示的段码*/ SPILED(data); /*发送显示段码*/ } RA5=1; /*最后给一个锁存信号,代表显示任务完成*/ } /*主程序*/ main() { SPIINIT(); /*spi显示初始化*/ sciint(); /*SCI部件初始化*/ di(); /*中断禁止*/ CREN=1; /*接收允许*/ for(k=0;k<8;k++) rece[k]=0x03; display(); /*显示表示系统正常运行的数据*/ while(1) { while(1){ CREN=1; /*允许连续接收*/ while(1){ if(RCIF==1) break; } /*等待接收数据*/ k=0; rece[k]=RCREG; /*读取接收数据*/ if(OERR==1) { /*如果有溢出错误,则处理*/ CREN=0; CREN=1; } if(rece[k]==0x00) break;/*“0”为同步字符,只有接收到“0”时才进行下面的接收*/ } for(k=1;k<8;k++){ while(1){ if(RCIF==1) break; } /*等待接收数据*/ rece[k]=RCREG;/*读取接收数据*/ if(OERR==1) { /*如果有溢出错误,则处理*/ CREN=0; CREN=1; } rece[k]=rece[k]&0x0F;/*屏蔽掉高位,防止干扰*/ } CREN=0; display(); /*显示接收的数据*/ for(i=65535;--i; )continue; for(i=65535;--i; )continue;/*给予一定时间的延时,再进行下一轮接收*/ }
|