⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 psp-master.c

📁 北航出版社《PIC18FXXX单片机程序设计及应用》所有章节源代码
💻 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 + -