PIC单片机通讯例程

发布者:Jinyu521最新更新时间:2017-12-10 来源: eefocus关键字:PIC单片机  通讯例程 手机看文章 扫描二维码
随时随地手机看文章

1. 单片机 PIC1编程(发送部分) 
LIST P=16F877 
#INCLUDE P16F876.INC 
CBLOCK 0X24 ;保留三个字节作为显示用 
COUNT ;作计数器或暂存器用 
ENDC 
ORG 0X0000 ;程序复位入口

NOP 
START GOTO MAIN 
ORG 0X20 
MAIN MOVLW 0X30 ;以下将RAM内容初始化 
MOVWF FSR ;从30H单元开始 
MOVLW 0X30 ;将值30H赋给单元30H 
MOVWF COUNT 
INTRAM MOVF COUNT,0 ;将30H~7FH赋给单元30H~7FH 
MOVWF INDF 
INCF COUNT,1 
INCF FSR,1 
BTFSS COUNT,7 
GOTO INTRAM 
BSF STATUS,RP0 ;将SCI部件初始化 
MOVLW 0X19 ;将传输的波特率设为约9600 bps 
MOVWF SPBRG 
MOVLW 0X04 ;选择异步高速方式传输8位数据 
MOVWF TXSTA 
BCF STATUS,RP0 
MOVLW 0X80 ;允许同步串行口工作 
MOVWF RCSTA 
BSF STATUS,RP0 
BSF TRISC,7 ;将RC6、RC7设置为输入方式,断绝与外接电路的连接 
BSF TRISC,6 
BCF STATUS,RP0 
MOVLW 0X30 ;30H作为同步字符发送 
MOVWF FSR 
MOVF INDF,0 
MOVWF TXREG ;将待发送的数据写入发送缓冲器TXREG 
BSF STATUS,RP0 
BSF TXSTA,TXEN ;发送允许 
BCF STATUS,RP0 
BSF RCSTA,CREN ;接收数据允许 
LOOPTX BTFSS PIR1,RCIF ;等待PIC2的响应字节 
GOTO LOOPTX 
MOVF RCREG,0 ;读响应字节,清RCIF 
LOOPTX1 BTFSS PIR1,TXIF ;发送下一字节 
GOTO LOOPTX1 
INCF FSR 
MOVF INDF,0 
MOVWF TXREG 
BTFSS FSR,7 ;30H~7FH单元的内容是否发送完? 
GOTO LOOPTX ;没有,继续下一字节的发送 
BSF STATUS,RP0 ;如果是,则停止发送 
BCF TXSTA,TXEN 
BCF STATUS,RP0 ;数据发送完毕 
CALL LED ;调用显示子程序,将发送的数据显示出来 
END ;程序完 
2. 单片机 PIC2编程(接收部分) 
LIST P=16F876 
#INCLUDE P16F876.INC 
CBLOCK 0X24 
COUNT 
ENDC 
ORG 0X0000 
NOP 
START GOTO MAIN 
MAIN BSF STATUS,RP0 ;初始化程序同发送子程序 
MOVLW 0X19 ;波特率设置与PIC1相同 
MOVWF SPBRG 
MOVLW 0X04 ;异步高速传输 
MOVWF TXSTA 
BCF STATUS,RP0 
MOVLW 0X80 ;串行口工作使能 
MOVWF RCSTA 
BSF STATUS,RP0


BSF TRISC,7 ;与外接电路隔离 
BSF TRISC,6 
BCF STATUS,RP0 
MOVLW 0X30 ;从30H单元开始存放发送来的数据 
MOVWF FSR 
BSF RCSTA,CREN ;接收允许 
BSF STATUS,RP0 
BSF TXSTA,TXEN ;发送允许 
BCF STATUS,RP0 
WAIT BTFSS PIR1,RCIF ;等待接收数据 
GOTO WAIT 
MOVF RCREG,0 ;读取数据 
MOVWF INDF ;将接收到的响应字节存入PIC2的RAM 
INCF FSR 
MOVWF TXREG ;发送响应字节 
LOOPTX BTFSS PIR1,TXIF ;等待写入完成 
GOTO LOOPTX 
BTFSS FSR,7 ;全部数据接收否? 
GOTO WAIT1 ;没有,继续接收其它数据 
BCF RCSTA,RCEN ;接收完,则关断接收和发送数据允许 
BSF STATUS,RP0 
BCF PIE1,TXEN 
BCF STATUS,RP0 
CALL LED ;调用显示子程序,将接受到的数据显示出来 
END ;程序完 



 

单片机 双机同步通信 
1. 单片机 PIC1编程(主控发送) 
LIST P=16F876 
#INCLUDE P16F876.INC 
CBLOCK 0X24 ;保留三个字节作为显示用 
COUNT ;作计数器或暂存器用 
ENDC 
ORG 0X0000 ;程序复位入口 
NOP 
START GOTO MAIN 
ORG 0X0100 
MAIN MOVLW 0X30 
MOVWF FSR ;以下将从30H单元开始的RAM内容初始化 
MOVLW 0X30 ;将值30H赋给单元30H 
MOVWF COUNT 
INTRAM MOVF COUNT,0 ;将30H~7FH赋给单元30H~7FH 
MOVWF INDF 
INCF COUNT,1 
INCF FSR,1 
BTFSS COUNT,7 
GOTO INTRAM 
BSF STATUS,RP0 ;将SCI部件初始化 
MOVLW 0X19 ;将传输的波特率设为约9600 bps 
MOVWF SPBRG 
MOVLW 0X94 ;选择同步高速方式传输8位数据 
MOVWF TXSTA 
BCF STATUS,RP0 
MOVLW 0X80 ;允许同步串行口工作 
MOVWF RCSTA 
BSF STATUS,RP0 
BSF TRISC,7 ;将RC6、RC7设置为输入方式,断绝与外接电路的连接 
BSF TRISC,6 
BSF STATUS,RP0 
MOVLW 0X30 ;将从30H单元开始的内容传送到PIC2 
MOVWF FSR 
MOVF INDF,0 
MOVWF TXREG ;将待发送的数据写入发送缓冲器TXREG 
BSF STATUS,RP0 
BSF TXSTA,TXEN ;发送允许 
BCF STATUS,RP0 
TX1 BTFSS PIR1,TXIF ;等待上一个数据写完 
GOTO TX1 
INCF FSR ;准备发送下一个数据 
MOVF INDF,0 
MOVWF TXREG ;将新的数据写入TXREG 
BTFSS FSR,7 ;判断所有30H~7FH单元的内容是否发送完毕? 
GOTO TX1 ;没有,则继续发送其它字节 
TX2 BTFSS PIR1,TXIF ;等所有要求发送的数据已经发送完,再额外 
GOTO TX2 ;写一个字节到TXREG,使最后一个数据能够顺利发送 
MOVWF TXREG 
NOP ;延时几个微秒后,关发送允许 
NOP 
NOP 
NOP 
NOP 
BSF STATUS,RP0 
BCF TXSTA,TXEN 
BCF STATUS,RP0 
CALL LED ;调用显示子程序,将发送的数据显示出来 
END ;程序完

2. 单片机 PIC2编程(从动接收) 
LIST P=16F876 
#INCLUDE P16F876.INC 
CBLOCK 0X24 
COUNT 
ENDC 
ORG 0X0000 
NOP 
START GOTO MAIN 
ORG 0X0100 
MAIN BSF STATUS,RP0 
MOVLW 0X10 ;选择同步从动方式 
MOVWF TXSTA 
BCF STATUS,RP0 
MOVLW 0X80 ;串行口使能 
MOVWF RCSTA 
BSF STATUS,RP0 
BSF TRISC,7 ;关断与外部电路的联系 
BSF TRISC,6 
BCF STATUS,RP0 
MOVLW 0X30 ;从30H单元开始存放接收的数据 
MOVWF FSR 
BSF RCSTA,CREN ;接收允许 
WAIT BTFSS PIR1,RCIF ;等待接收 
GOTO WAIT 
MOVF RCREG,0 ;读取接收到的数据 
MOVWF INDF ;将接收到的数据存入PIC2的RAM 
INCF FSR 
BTFSS FSR,7 ;所有的数据是否已接收完? 
GOTO WAIT ;没有,继续接收其它字节 
NOP ;延时数微秒后,清接收允许位 
NOP 
NOP 
NOP 
BCF RCSTA,RCEN 
CALL LED ;调用显示子程序,将接受到的数据显示出来 
END ;程序完 



 

单片机 与PC机通信 
1. PC机编程 
PC采用Toubr C 进行编写。程序如下: 
#include 
#define port 0x3f8 /*利用串口1进行通信*/ 
int ch[15]; 
main () 

int a; 
int i,j; 
int b[6]={88,15,38,26,20,0}; 
char c; 
clrscr(); 
outportb(port 3,0x80); /*准备设置波特率*/ 
outportb(port,0x0C); /*波特率设置为9 600 bps*/ 
outportb(port 1,0x00); 
outportb(port 3,0x03); /*8位数据位,奇偶检验,1位停止位*/ 
outportb(port 1,0x00); /*关中断*/ 
inportb(port 5); /*读一次线路状态寄存器,使其复位*/ 

printf("\t\tsend data or receive data: (s or r?)\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. 单片机 编程 
LIST P=16F876 
#INCLUDE P16F876.INC 
CBLOCK 0X24 
COUNT 
TEMP 
ENDC 
ORG 0X0000 
NOP 
START GOTO MAIN 
ORG 0X020

MAIN MOVLW 0X30 ;将RAM单元初始化 
MOVWF FSR 
BCF STATUS,RP0 
MOVLW 0X22 
MOVWF COUNT 
INTRAM MOVF COUNT,0 
MOVWF INDF 
INCF COUNT,1 
INCF FSR,1 
BTFSS FSR,7 
GOTO INTRAM 
BANKSEL TXSTA ;波特率设置为9 600 bps 
MOVLW 0X19 
MOVWF SPBRG ;异步高速方式 
MOVLW 0X04 
MOVWF TXSTA 
BCF STATUS,RP0 
MOVLW 0X80 ;串行口使能 
MOVWF RCSTA 
MOVLW 0X30 
MOVWF FSR 
BSF RCSTA,CREN ;接收允许 
BSF STATUS,RP0 
BSF TXSTA,TXEN ;发送允许 
BCF STATUS,RP0 
WAIT BTFSS PIR1,RCIF ;接收PC机命令 
GOTO WAIT 
MOVF RCREG,0 
MOVWF TEMP 
MOVWF INDF 
INCF FSR 
DECFSZ TEMP ;接收到的数据为1,则接收 
GOTO TXW ;否则发送数据 
MOVLW 0X06 
MOVWF TEMP 
WAIT1 BTFSS PIR1,RCIF ;接收一个数据 
GOTO WAIT1 
MOVF RCREG,0 
MOVWF COUNT 
MOVWF TXREG 
LOOPTX BTFSS PIR1,TXIF ;将接收到的数据送回PC机 
GOTO LOOPTX 
MOVF COUNT,0 
MOVWF INDF 
INCF FSR 
DECFSZ TEMP 
GOTO WAIT1 
GOTO OVER ;处理完毕 
TXW MOVLW 0X09 ;向PC机发送9个数据 
MOVWF TEMP 
MOVLW 0X30 
MOVWF FSR 
TXW0 MOVF INDF,0 
MOVWF TXREG 
INCF FSR 
TXW1 BTFSS PIR1,TXIF 
GOTO TXW1 
DECFSZ TEMP 
GOTO TXW0 
OVER BCF RCSTA,CREN ;通信任务完成,关接受和发送允许 
BSF STATUS,RP0 
BCF TXSTA,TXEN 
BCF STATUS,RP0 
CALL LED ;调用显示子程序,将发送(或接收)的数据显示出来 
END ;程序完 


关键字:PIC单片机  通讯例程 引用地址:PIC单片机通讯例程

上一篇:MCD2-DEMO 数码管显示PICC-18范例(适合初学者)
下一篇:PIC编的数字钟

推荐阅读最新更新时间:2024-03-16 15:49

PIC单片机控制DS1302子程序
;================================================ ;DS1302控制子程序 ;================================================= ;程序包括:DS1302初始化,时间数据写入和读取程序 ;DS1302_init ;init ds1302 ;Set_DS1302 ;set time to ds1302 ;Get_DS1302 ;get time from ds1302 ;================================================= ;============== 130
[单片机]
PIC单片机 的编译环境MPLAB的配置
在讲基于MPLAB X IDE 配置位配置前我先讲讲如何配置配置位。 比如PICLF1823的数据手册 可以再器件配置中找到两个寄存器。一个是配置字1 ,一个是配置字2. 对于初学者来说如此多的配置选项,该如何配置呢?我们要抓主重点。 配置字中最重要的配置选项就是: 看门狗配置 如:WDTE 1;0 ; 一般选择关闭看门狗 MCLRE复位脚的配置 如:MCLRE;一般选择复位脚作I/O 震荡器的选择: 如:FOSC 2:0 ;根据实际情况配置,我这里一般选择用 INTOSC 内部振荡器. 因为如果这三个没有配置好的话程序根本无法运行。其他配置可以看数据手册此不赘述。 MPLAB X IDE和MPLAB IDE 8不同。
[单片机]
<font color='red'>PIC单片机</font> 的编译环境MPLAB的配置
PIC单片机的延时函数
  PIC单片机C语言中的延时函数(即延时一定值),有多种等效的编写,这里介绍一种最简延时函数。   函数中的K为给定的整形。
[单片机]
<font color='red'>PIC单片机</font>的延时函数
PIC单片机SPI接口配置
一般所有单片机的SPI接口都需要配置以下几点内容(CPU作为SPI主模式): 1.引脚功能/方向配置:标准SPI接口由4根线组成,SCK,MISO(SDI),MOSI(SDO),SS(CS),其中SCK,MISO,MOSI都应设置成SPI功能,并且SCK和MOSI设置成输出引脚,MISO设置成输入引脚,SS引脚设置成普通GPIO功能,并且设置成输出。 2.SPI参数配置: (1)SPI的时钟频率设置,一般设置范围几K到几M不等,该频率决定SPI的时钟线和数据线的速率。 (2)SPI时钟极性 (3)SPI时钟相位(边沿) (4)数据宽度,一般选择8位或者16位 (5)位序,传输过程中是高位在前,还是低位在
[单片机]
<font color='red'>PIC单片机</font>SPI接口配置
AVR单片机SPI通讯例程
本人的一个SPI的实例,通过SPI实现两机通讯, 采用中断方式实现双全工通讯。   本例用两MEGA8515实现,连接为:     MISO----MISO     MOSI----MOSI     SCK ----SCK     /SS ----/SS   将要发送的数据加载到发送缓冲区的函数fill_tx_buffer和从接收缓冲区读出数据的函数read_rx_buffer未给出,根据各自需求请自己完成。 #define SPI_RX_BUFFER_SIZE 10 #define SPI_RX_BUFFER_MASK ( SPI_RX_BUFFER_SIZE - 1 ) #define SPI_TX_BUFFER_SIZE 1
[单片机]
PIC单片机之TIME2
TMR2的宽度与TMR0一样的也是8位,一般伴随着CCP模块和PWM功能一起出现。 8位宽度的TMR2定时器有一个前置预分频器和后置预分频器,同时还有一个周期控制寄存器与它配合一起实现针对单片机指令周期的计数。 TMR2只能作为定时器使用,无法对外部输入的脉冲作计数。 TMR2定时器与TMR0相比,最大的区别是TMR2有一个周期的控制寄存器PR2。PR2寄存器可以设定定时器的上限值。只要当TMR2的计数值和PR2的设定值相等时就会自动归0,同时产生一个中断。 当TMR2的计数值与PR2寄存器中所设定的数值相一致后,一睛个计数脉冲,的到来应会让TMR2溢出归0,注意:一个计数溢出归0后,并不一定产即产生TMR2IF中
[单片机]
stm32单片机与pic单片机的优缺点对比分析
stm32单片机 由ST厂商推出的STM32系列单片机,行业的朋友都知道,这是一款性价比超高的系列单片机,应该没有之一,功能及其强大。其基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARM Cortex-M内核,同时具有一流的外设:1μs的双12位ADC,4兆位/秒的UART,18兆位/秒的SPI等等,在功耗和集成度方面也有不俗的表现,当然和MSP430的功耗比起来是稍微逊色的一些,但这并不影响工程师们对它的热捧程度,由于其简单的结构和易用的工具再配合其强大的功能在行业中赫赫有名其强大的功能主要表现在: stm32单片机特性 1、内核:ARM32位Cortex-M3CPU,最高工作频率72MHz,1.25DMIPS/
[单片机]
stm32单片机与<font color='red'>pic单片机</font>的优缺点对比分析
PIC单片机在远程控制中的应用
本文介绍了一种用单片机控制的采用电话遥控的简易远程教学系统。它借助于现有的丰富的电话网络资源,具有结构简单,造价低廉,易于操作等特点,可以实现对录像机的各种远距离控制操作。 1 系统的总体结构 该电话遥控教学系统的总体结构如图1所示。 该系统由电话机、小型程控机、远程控制器和数台录像机、电视机组成,该系统既可以通过小型程控机构成一个局域的小系统,也可以利用电信网构成一个跨省市的远距离遥控系统。在该系统中,远程控制器的设计与制造是该系统的核心与关键。 2 远程控制器的结构及工作原理 该控制器的CPU采用美国Microchip公司生产的PIC16C54一次性用户可编程(OPT)单片机,同时,配以
[单片机]
<font color='red'>PIC单片机</font>在远程控制中的应用
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved