單片機PIC1編程(發(fā)送部分) #include <pic.h> /*該程序實現(xiàn)單片機雙機異步通信功能,該程序是發(fā)送部分*/ unsigned char tran[8]; /*定義一個數(shù)組存儲發(fā)送數(shù)據(jù)*/ 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}; /*不帶小數(shù)點的顯示段碼表*/ /*spi顯示初始化子程序*/ void SPIINIT() { PIR1=0; SSPCON=0x30; SSPSTAT=0xC0; /*設置SPI的控制方式,允許SSP方式 TRISC=0xD7; /*SDO引腳為輸出,SCK引腳為輸出*/ TRISA5=0; /*RA5引腳設置為輸出,以輸出顯示鎖存信號*/ } /*給數(shù)組賦初值子程序 */ void fuzhi() { for(k=0;k<8;k++)
{ tran[k]=k+3; } } /*SCI部件初始化子程序*/ void sciint() { SPBRG=0X19; /*將傳輸?shù)牟ㄌ芈试O為約9 600位/秒*/ TXSTA=0X04; /*選擇異步高速方式傳輸8位數(shù)據(jù)*/ RCSTA=0X80; /*允許同步串行口工作*/ TRISC6=1;
TRISC7=1; /*將RC6、RC7設置為輸入方式,對外部呈高阻狀態(tài)*/ } /*SPI傳輸數(shù)據(jù)子程序*/ void SPILED(data) { SSPBUF=data; /*啟動發(fā)送*/ do { ; }while(SSPIF==0); SSPIF=0; } /*顯示子程序,顯示8位數(shù)*/ void display() { RA5=0; /*準備鎖存*/ for(k=0;k<8;k++)
{ data=tran[k]; data=table[data]; /*查得顯示的段碼*/ SPILED(data); /*發(fā)送顯示段碼*/ } RA5=1; /*最后給一個鎖存信號,代表顯示任務完成*/ } /*主程序*/ main() { SPIINIT(); fuzhi(); /*給數(shù)組賦初值*/ sciint(); /*SCI部件初始化*/
di(); /*中斷禁止*/ TXEN=1; /*發(fā)送允許*/ CREN=1; /*接收數(shù)據(jù)允許*/ for(k=0;k<8;k++)
{ TXREG=tran[k]; /*發(fā)出一個字符*/ while(1)
{ if(TXIF==1)
break; } /*等待寫入完成*/ while(1)
{ if(RCIF==1)
break;/*若收到響應字節(jié),則終止等待*/ } RCREG=RCREG; /*讀響應字節(jié),清RCIF*/ } display(); /*顯示發(fā)送的數(shù)據(jù)*/
while(1)
{ ; } }
2 單片機PIC2編程(接收部分) #include <pic.h> /*該程序實現(xiàn)單片機雙機異步通信功能,該程序是接收部分,并把接收的數(shù)據(jù)顯示在8個LED上*/ unsigned char rece[8];/*定義一個數(shù)組存儲接收數(shù)據(jù)*/ 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}; /*不帶小數(shù)點的顯示段碼表*/ /*spi顯示初始化子程序*/ void SPIINIT() { ;詳細語句見發(fā)送程序 } /*SCI部件初始化子程序*/ void sciint() { SPBRG=0X19; /*波特率設置與PIC1相同,為約9 600位/秒*/ TXSTA=0X04; /*異步高速傳輸*/ RCSTA=0X80; /*串行口工作使能*/ TRISC6=1; TRISC7=1; /*將RC6、RC7設置為輸入方式,對外部呈高阻狀態(tài)*/ } /*SPI傳送數(shù)據(jù)子程序*/ void SPILED(data) { ;詳細語句與見發(fā)送程序 } /*顯示子程序,顯示4位數(shù)*/ void display() { RA5=0; /*準備鎖存*/ for(k=0;k<8;k++)
{ data=rece[k]; data=table[data]; /*查得顯示的段碼*/ SPILED(data); /*發(fā)送顯示段碼*/ } RA5=1; /*最后給一個鎖存信號,代表顯示任務完成*/ } /*主程序*/ main() { SPIINIT(); /*spi顯示初始化*/ sciint(); /*SCI部件初始化*/ di(); /*中斷禁止*/ CREN=1; /*接收允許*/ TXEN=1; /*發(fā)送允許*/ for(k=0;k<8;k++)
{ while(1)
{ if(RCIF==1)
break; } /*等待接收數(shù)據(jù)*/ rece[k]=RCREG; /*讀取接收數(shù)據(jù),同時清掉RCIF*/ TXREG=rece[k]; /*發(fā)送接收到的數(shù)據(jù)*/ while(1)
{ if(TXIF==1)
break; } /*等待寫入完成*/ } display(); /*顯示接收的數(shù)據(jù)*/ while(1)
{ ; } }
|