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

📄 sp23x9 demo.c.bak

📁 一种新颖的串口扩展芯片sp234X系列的应用代码。
💻 BAK
字号:
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!申    明!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
//本驱动程序属于成都视普科技公司所有,仅允许免费用于本公司销售的产品中,未  //
//经书面许可任何单位或个人不可将本程序用于其它用途,否则将追究其法律责任   //
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
/***************************************************************************
 SP2339_SP2349_driver.c source file SP2339/SP2349 serial communication
 example for MCS-51 MCU  (oscillating crystal: 11.0592MHz)
 Author: ShouPing Yang , 2007-09-18 
***************************************************************************/


//说明:AT89C52在11.0592Mhz下不能获得76.8Kbps的波特率,必须采用22.1184Mhz!!!!!


#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int

uchar idata TempBuffer[32]; //子串口数据发送缓冲区(大小可由用户随意配置)

uchar idata SendByteNum,SendOverFlag;	//

/*****************************************************************************
功能:设定SP2339/SP2349输入、输出地址,可根据实际电路修改
*****************************************************************************/
//sbit 	AdrIn0 =P1^0;	/* 连接到SP2349的PIN0(ADRO0),可以不用连接*/
//sbit	AdrIn1 =P1^1;	/* 连接到SP2349的PIN1(ADRO1),可以不用连接*/
sbit	AdrOut0=P1^2;	/* 连接到SP2349的PIN18(ADRI0)*/
sbit	AdrOut1=P1^3;	/* 连接到SP2349的PIN17(ADRI1)*/

serial () interrupt 4 {
	if(RI){				//由于不会同时接收两个串口的数据,所以不需要判断接收地址
		RI=0;
		TempBuffer[--SendByteNum]=SBUF;	//SendByteNum需要初始化
	}
	else{
		TI=0;
		SendOverFlag=0;
		if(SendByteNum){		//如果数据还没有发送结束,则继续发送
			SBUF=TempBuffer[--SendByteNum];
		}
	}
}

void init_serialcomm(void){
	SCON   = 0x50; 			//SCON: serail mode 1, 8-bit UART, enable ucvr
	T2CON |= 0x34; 			//TMOD: timer 2, mode 2, 16-bit reload,timer 2 run
	RCAP2H = 0xFF; 			//Baud:76800  fosc=22.1184MHz
	RCAP2L = 0xF7;			//Baud:76800  fosc=22.1184MHz
	IE    |= 0x90; 			//Enable Serial Interrupt
	IP	   = 0x10;			//只允许串口中断为最高优先级,其它为次优先级。
	SendByteNum=0;			//初始化串口0发送缓冲区"空"
}

void SetUartMode(uchar SerialNum){//"0"设置串口0为单串口,否则设置串口1为单串口
	if(SerialNum){			//设置串口1为单串口模式(波特率为:57600)
		RCAP2H = 0xFF; 		//Baud:76800  fosc=22.1184MHz
		RCAP2L = 0xF7;		//Baud:76800  fosc=22.1184MHz
		AdrOut0=1;
		AdrOut1=1;
		SBUF=0x0D;			//设置为单串口模式1
		SendOverFlag=1;
		while(SendOverFlag);
		AdrOut0=1;
		AdrOut1=0;
		RCAP2H = 0xFF; 		//Baud:57600  fosc=22.1184MHz
		RCAP2L = 0xF4;		//Baud:57600  fosc=22.1184MHz
	}
	else{					//设置串口0为单串口模式(波特率为:115200)
		RCAP2H = 0xFF; 		//Baud:76800  fosc=22.1184MHz
		RCAP2L = 0xF7;		//Baud:76800  fosc=22.1184MHz
		AdrOut0=1;
		AdrOut1=1;
		SBUF=0x0C;			//设置为单串口模式0
		SendOverFlag=1;
		while(SendOverFlag);
		AdrOut0=0;
		AdrOut1=0;
		RCAP2H = 0xFF; 		//Baud:115200  fosc=22.1184MHz
		RCAP2L = 0xFA;		//Baud:115200  fosc=22.1184MHz
	}
}

main(){
	uchar i=0;			
	init_serialcomm();		//初始化MCU串口波特率和所有子串口波特率
	SetUartMode(0);			//设置串口0为单串口模式
	TempBuffer[i++]=0x30;	//串口0依次发送"0x37"、"0x36" ..."0x30"
	TempBuffer[i++]=0x31;
	TempBuffer[i++]=0x32;
	TempBuffer[i++]=0x33;
	TempBuffer[i++]=0x34;
	TempBuffer[i++]=0x35;
	TempBuffer[i++]=0x36;
	TempBuffer[i++]=0x37;
	SendByteNum=i;
	TI=1;
	while(SendByteNum);		//等待串口0的数据发送结束
	
	SetUartMode(1);			//设置串口1为单串口模式
	TempBuffer[i++]=0x40;
	TempBuffer[i++]=0x41;
	TempBuffer[i++]=0x42;
	TempBuffer[i++]=0x43;
	TempBuffer[i++]=0x44;
	TempBuffer[i++]=0x45;
	TempBuffer[i++]=0x46;
	TempBuffer[i++]=0x47;
	SendByteNum=i;
	TI=1;
	while(SendByteNum);		//等待串口1的数据发送结束
	while(1);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -