PIC单片机通讯例程.docx
- 文档编号:4522477
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:12
- 大小:16.77KB
PIC单片机通讯例程.docx
《PIC单片机通讯例程.docx》由会员分享,可在线阅读,更多相关《PIC单片机通讯例程.docx(12页珍藏版)》请在冰豆网上搜索。
PIC单片机通讯例程
1.单片机PIC1编程(发送部分)
LISTP=16F877
#INCLUDEP16F876.INCCBLOCK0X24;保留三个字节作为显示用
COUNT;作计数器或暂存器用
ENDC
ORG0X0000;程序复位入口
NOP
START
GOTOMAIN
ORG0X20
MAIN
MOVLW0X30;以下将RAM内容初始化
MOVWFFSR;从30H单元开始
MOVLW0X30;将值30H赋给单元30H
MOVWFCOUNT
INTRAM
MOVFCOUNT,0;将30H~7FH赋给单元30H~7FH
MOVWFINDF
INCFCOUNT,1
INCFFSR,1
BTFSSCOUNT,7
GOTOINTRAM
BSFSTATUS,RP0;将SCI部件初始化
MOVLW0X19;将传输的波特率设为约9600bps
MOVWFSPBRG
MOVLW0X04;选择异步高速方式传输8位数据
MOVWFTXSTA
BCFSTATUS,RP0
MOVLW0X80;允许同步串行口工作
MOVWFRCSTA
BSFSTATUS,RP0
BSFTRISC,7;将RC6、RC7设置为输入方式,断绝与外接电路的连接
BSFTRISC,6
BCFSTATUS,RP0
MOVLW0X30;30H作为同步字符发送
MOVWFFSR
MOVFINDF,0
MOVWFTXREG;将待发送的数据写入发送缓冲器
TXREG
BSFSTATUS,RP0
BSFTXSTA,TXEN;发送允许
BCFSTATUS,RP0
BSFRCSTA,CREN;接收数据允许
LOOPTX
BTFSSPIR1,RCIF;等待PIC2的响应字节
GOTOLOOPTX
MOVFRCREG,0;读响应字节,清RCIF
LOOPTX1
BTFSSPIR1,TXIF;发送下一字节
GOTOLOOPTX1
INCFFSR
MOVFINDF,0
MOVWFTXREG
BTFSSFSR,7;30H~7FH单元的内容是否发送完?
GOTOLOOPTX;没有,继续下一字节的发送
BSFSTATUS,RP0;如果是,则停止发送
BCFTXSTA,TXEN
BCFSTATUS,RP0;数据发送完毕
CALLLED;调用显示子程序,将发送的数据显示出来
END;程序完
2.单片机PIC2编程(接收部分)
LISTP=16F876
#INCLUDEP16F876.INCCBLOCK0X24
COUNT
ENDC
ORG0X0000
NOP
START
GOTOMAIN
MAIN
BSFSTATUS,RP0;初始化程序同发送子程序
MOVLW0X19;波特率设置与PIC1相同
MOVWFSPBRG
MOVLW0X04;异步高速传输
MOVWFTXSTA
BCFSTATUS,RP0
MOVLW0X80;串行口工作使能
MOVWFRCSTA
BSFSTATUS,RP0
BSFTRISC,7;与外接电路隔离
BSFTRISC,6
BCFSTATUS,RP0
MOVLW0X30;从30H单元开始存放发送来的数据
MOVWFFSR
BSFRCSTA,CREN;接收允许
BSFSTATUS,RP0
BSFTXSTA,TXEN;发送允许
BCFSTATUS,RP0
WAIT
BTFSSPIR1,RCIF;等待接收数据
GOTOWAIT
MOVFRCREG,0;读取数据
MOVWFINDF;将接收到的响应字节存入PIC2的RAM
INCFFSR
MOVWFTXREG;发送响应字节
LOOPTX
BTFSSPIR1,TXIF;等待写入完成
GOTOLOOPTX
BTFSSFSR,7;全部数据接收否?
GOTOWAIT1;没有,继续接收其它数据
BCFRCSTA,RCEN;接收完,则关断接收和发送数据允许
BSFSTATUS,RP0
BCFPIE1,TXEN
BCFSTATUS,RP0
CALLLED;调用显示子程序,将接受到的数据显示出来
END;程序完
单片机双机同步通信
1.单片机PIC1编程(主控发送)
LISTP=16F876
#INCLUDEP16F876.INCCBLOCK0X24;保留三个字节作为显示用
COUNT;作计数器或暂存器用
ENDC
ORG0X0000;程序复位入口
NOP
START
GOTOMAIN
ORG0X0100
MAIN
MOVLW0X30
MOVWFFSR;以下将从30H单元开始的RAM内容初始化
MOVLW0X30;将值30H赋给单元30H
MOVWFCOUNT
INTRAM
MOVFCOUNT,0;将30H~7FH赋给单元30H~7FH
MOVWFINDF
INCFCOUNT,1
INCFFSR,1
BTFSSCOUNT,7
GOTOINTRAM
BSFSTATUS,RP0;将SCI部件初始化
MOVLW0X19;将传输的波特率设为约9600bps
MOVWFSPBRG
MOVLW0X94;选择同步高速方式传输8位数据
MOVWFTXSTA
BCFSTATUS,RP0
MOVLW0X80;允许同步串行口工作
MOVWFRCSTA
BSFSTATUS,RP0
BSFTRISC,7;将RC6、RC7设置为输入方式,断绝与外接电路的连接
BSFTRISC,6
BSFSTATUS,RP0
MOVLW0X30;将从30H单元开始的内容传送到PIC2
MOVWFFSR
MOVFINDF,0
MOVWFTXREG;将待发送的数据写入发送缓冲器
TXREG
BSFSTATUS,RP0
BSFTXSTA,TXEN;发送允许
BCFSTATUS,RP0
TX1
BTFSSPIR1,TXIF;等待上一个数据写完
GOTOTX1
INCFFSR;准备发送下一个数据
MOVFINDF,0
MOVWFTXREG;将新的数据写入TXREG
BTFSSFSR,7;判断所有30H~7FH单元的内容是否发送完毕?
GOTOTX1;没有,则继续发送其它字节
TX2
BTFSSPIR1,TXIF;等所有要求发送的数据已经发送完,再额外
GOTOTX2;写一个字节到TXREG,使最后一个数据能够顺利发送
MOVWFTXREG
NOP;延时几个微秒后,关发送允许
NOP
NOP
NOP
NOP
BSFSTATUS,RP0
BCFTXSTA,TXEN
BCFSTATUS,RP0
CALLLED;调用显示子程序,将发送的数据显示出来
END;程序完
2.单片机PIC2编程(从动接收)
LISTP=16F876
#INCLUDEP16F876.INCCBLOCK0X24
COUNT
ENDC
ORG0X0000
NOP
START
GOTOMAIN
ORG0X0100
MAIN
BSFSTATUS,RP0
MOVLW0X10;选择同步从动方式
MOVWFTXSTA
BCFSTATUS,RP0
MOVLW0X80;串行口使能
MOVWFRCSTA
BSFSTATUS,RP0
BSFTRISC,7;关断与外部电路的联系
BSFTRISC,6
BCFSTATUS,RP0
MOVLW0X30;从30H单元开始存放接收的数据
MOVWFFSR
BSFRCSTA,CREN;接收允许
WAIT
BTFSSPIR1,RCIF;等待接收
GOTOWAIT
MOVFRCREG,0;读取接收到的数据
MOVWFINDF;将接收到的数据存入PIC2的RAM
INCFFSR
BTFSSFSR,7;所有的数据是否已接收完?
GOTOWAIT;没有,继续接收其它字节
NOP;延时数微秒后,清接收允许位
NOP
NOP
NOP
BCFRCSTA,RCEN
CALLLED;调用显示子程序,将接受到的数据显示出来
END;程序完
单片机与PC机通信
1.PC机编程PC采用ToubrC进行编写。
程序如下:
#include
#defineport0x3f8/*利用串口1进行通信*/
intch[15];
main()
{
inta;inti,j;intb[6]={88,15,38,26,20,0};
charc;
clrscr();
outportb(port+3,0x80);/*准备设置波特率*/
outportb(port,0x0C);/*波特率设置为9600bps*/
outportb(port+1,0x00);
outportb(port+3,0x03);/*8位数据位,奇偶检验,1位停止位*/
outportb(port+1,0x00);/*关中断*/
inportb(port+5);/*读一次线路状态寄存器,使其复位*/
{
printf("\t\tsenddataorreceivedata:
(sorr?
)\n\n\n");
c=getchar();
switch(c)
{
case’s’:
case’S’:
{while(!
(inportb(port+5)&0x20));/*发送保持器满则等待*/
outportb(port,0x01);/*否则发送数据01通知单片机准备接收*/
for(i=0;i<6;i++)/*共发送6个数据*/
{a=b[i];
while(!
(inportb(port+5)&0x20))
delay(100);/*发送保持器满,等待*/
outportb(port,a);/*发送a*/
printf("%d\n",a);/*显示a*/
while(!
(inport(port+5)&1));/*接收单片机送回的数据*/
ch[i]=inport(port);/*保存*/
}
delay(10);
for(j=0;j<8;j++)/*显示接收的回送数据*/
printf("\n%d\n",ch[j]);
getch();break;
}
case’r’:
/*接收数据*/
case’R’:
{
while(!
(inportb(port+5)&0x20));
outportb(port,0x02);/*发送数据02通知单片机发送数据*/
for(j=0;j<9;j++)/*共接收9个数据*/
{while(!
(inportb(port+5)&1));
ch[j]=inportb(port);
}
for(j=0;j<9;j++)
printf("\n%d\n",ch[j]);getch();break;
}
}
}
}
2.单片机编程
LISTP=16F876
#INCLUDEP16F876.INCCBLOCK0X24
COUNTTEMP
ENDC
ORG0X0000
NOP
START
GOTOMAIN
ORG0X020
MAIN
MOVLW0X30;将RAM单元初始化
MOVWFFSR
BCFSTATUS,RP0
MOVLW0X22
MOVWFCOUNT
INTRAM
MOVFCOUNT,0
MOVWFINDF
INCFCOUNT,1
INCFFSR,1
BTFSSFSR,7
GOTOINTRAM
BANKSELTXSTA;波特率设置为9600bps
MOVLW0X19
MOVWFSPBRG;异步高速方式
MOVLW0X04
MOVWFTXSTA
BCFSTATUS,RP0
MOVLW0X80;串行口使能
MOVWFRCSTA
MOVLW0X30
MOVWFFSR
BSFRCSTA,CREN;接收允许
BSFSTATUS,RP0
BSFTXSTA,TXEN;发送允许
BCFSTATUS,RP0
WAIT
BTFSSPIR1,RCIF;接收PC机命令
GOTOWAIT
MOVFRCREG,0
MOVWFTEMP
MOVWFINDF
INCFFSR
DECFSZTEMP;接收到的数据为1,则接收
GOTOTXW;否则发送数据
MOVLW0X06
MOVWFTEMP
WAIT1
BTFSSPIR1,RCIF;接收一个数据
GOTOWAIT1
MOVFRCREG,0
MOVWFCOUNT
MOVWFTXREG
LOOPTX
BTFSSPIR1,TXIF;将接收到的数据送回PC机
GOTOLOOPTX
MOVFCOUNT,0
MOVWFINDF
INCFFSR
DECFSZTEMP
GOTOWAIT1
GOTOOVER;处理完毕
TXW
MOVLW0X09;向PC机发送9个数据
MOVWFTEMP
MOVLW0X30
MOVWFFSR
TXW0
MOVFINDF,0
MOVWFTXREG
INCFFSR
TXW1
BTFSSPIR1,TXIF
GOTOTXW1
DECFSZTEMP
GOTOTXW0
OVER
BCFRCSTA,CREN;通信任务完成,关接受和发送允许
BSFSTATUS,RP0
BCFTXSTA,TXEN
BCFSTATUS,RP0
CALLLED;调用显示子程序,将发送(或接收)的数据显示出来
END;程序完
.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PIC 单片机 通讯 例程