📄 psp-master.c
字号:
/* ****************************************************************
** 功能描述: 单片机接收到PC机串行通讯数据,=1,通过PSP读取从机数据,并将数据送回PC机;不=1,向从单片机写接收的数据并将通信数据返送PC机
*************************************************************** */
#include "pic18.h" /* PIC18系列的头文件 */
unsigned int recdata; /* 接收数据寄存器 */
unsigned int PSP_data; /* 接收从单片机并行从动口数据寄存器 */
unsigned int SciReceiveFlag=0; /*=1表示接收到新数据,=0未接收到新数据 */
/* ****************************************************************
** 函 数 名: initial()
** 功能描述: 系统初始化子程序,放在程序首部
*************************************************************** */
void initial()
{
INTCON=0x00; /* 关总中断 */
ADCON1=0X07; /* 设置数字输入输出口 */
PIE1=0; /* PIE1 的中断不使能 */
PIE2=0; /* PIE2 的中断不使能 */
}
/* ****************************************************************
** 函 数 名: psp_master_initial()
** 功能描述: 主单片机通过PORTD口向从单片机并行从动口读写数据初始化子程序
*************************************************************** */
void psp_master_initial()
{
CMCON=0x07; /* 关比较器 */
TRISD=0x00; /* PORTD为输出口 */
TRISE=0x00; /* RD、WD、CS为输出口 */
PORTE=0xff; /* E口(只有3个引脚)输出全1,不对从机进行操作 */
}
/* ****************************************************************
** 函 数 名: sciinitial()
** 功能描述: 232串行通讯初始化子程序,设置中断接收,使能232收和发
*************************************************************** */
void sciinitial()
{
TXSTA=0x04; /* 选择异步高速方式传输8位数据 */
RCSTA=0x80; /* 允许串行口工作使能, */
TRISC=TRISC|0X80; /* PIC18F458:将RC7(RX)设置为输入方式 */
TRISC=TRISC&0Xbf; /* RC6(TX)设置为输出 */
SPBRG=25; /* 4M晶振时波特率为25 */
PIR1=0x00; /* 清中断标志 */
PIE1=PIE1|0x20; /* 允许串行通讯接口接收中断使能 */
CREN=1; /* 允许串口接收数据 */
TXEN=1; /* 允许串口发送数据 */
}
/* ****************************************************************
** 函 数 名: interrupt HI_ISR()
** 功能描述:中断子程序:RS232接收中断
*************************************************************** */
void interrupt HI_ISR()
{
if(RCIF==1) /* RS232接收中断 */
{
RCIF=0; /* 清接收中断标志 */
recdata=RCREG; /* 接收数据并存储 */
TXREG=recdata; /* 返送接收的数据 */
SciReceiveFlag=1; /* 置接收到232数据标志 */
}
}
main()
{
initial(); /* 系统初始化 */
sciinitial(); /* 串行通讯初始化子程序 */
psp_master_initial(); /* 向从单片机读写控制初始化子程序 */
INTCON=INTCON|0xc0; /* 开总中断、开外围接口中断 */
while(1)
{
if(1==SciReceiveFlag) /* 是否接收到通信数据 */
{
SciReceiveFlag=0; /* 清接收到通信数据标志 */
if( recdata!=1) /* 接收通信数据不为1,向从机写接收到的数据 */
{
CMCON=0x07; /* 关比较器 */
TRISD=0x00; /* 向从机写操作时,主机PORTD口为输出口 */
PORTD=recdata; /* 写数据到总线上 */
PORTE=0x01; /* 写操作:RE0(RD)=1,RE1(WR)=0,RE2(CS)=0 */
PORTE=0xFF; /* 停止向从机写数据 */
}
if(1==recdata) /* 接收通信数据为1,向从机读数据 */
{
CMCON=0x07; /* 关比较器 */
TRISD=0xff; /* 向从机读操作时,主机PORTD口为输入口 */
PORTE=0x02; /* 读操作:RE0(RD)=0,RE1(WR)=1,RE2(CS)=0 */
PSP_data=PORTD; /* 通过并行从动口读从机数据 */
PORTE=0xFF; /* 停止向从机读数据 */
TXREG=PSP_data; /* 将读取的PSP数据送回PC机 */
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -