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

📄 io口模拟串口通讯c源程序.c

📁 IO口模拟串口通讯C源程序
💻 C
字号:
51 IO口模拟串口通讯C源程序(给美丽心情)(wxkc51bbs)
 

#include <reg51.h>
sbit BT_SND =P1^0;
sbit BT_REC =P1^1;
/**********************************************

IO 口模拟232通讯程序

使用两种方式的C程序 占用定时器0 

**********************************************/

#define MODE_QUICK

#define F_TM F0

#define TIMER0_ENABLE  TL0=TH0; TR0=1;
#define TIMER0_DISABLE TR0=0;

sbit ACC0=   ACC^0;
sbit ACC1=   ACC^1;
sbit ACC2=   ACC^2;
sbit ACC3=   ACC^3;
sbit ACC4=   ACC^4;
sbit ACC5=   ACC^5;
sbit ACC6=   ACC^6;
sbit ACC7=   ACC^7;

void IntTimer0() interrupt 1
{
	F_TM=1;
}
//发送一个字符
void PSendChar(unsigned char inch)
{
#ifdef MODE_QUICK 
	ACC=inch;
	
	F_TM=0;
	BT_SND=0; //start bit 
	TIMER0_ENABLE; //启动
	while(!F_TM);
	
	BT_SND=ACC0; //先送出低位
	F_TM=0;
	while(!F_TM);
	
	BT_SND=ACC1; 
	F_TM=0;
	while(!F_TM);
	
	BT_SND=ACC2; 
	F_TM=0;
	while(!F_TM);
	
	BT_SND=ACC3; 
	F_TM=0;
	while(!F_TM);
	
	BT_SND=ACC4; 
	F_TM=0;
	while(!F_TM);
	
	BT_SND=ACC5; 
	F_TM=0;
	while(!F_TM);
	
	BT_SND=ACC6; 
	F_TM=0;
	while(!F_TM);
	
	BT_SND=ACC7; 
	F_TM=0;
	while(!F_TM);
	
	BT_SND=1; 
	F_TM=0;
	while(!F_TM);
	
	
	TIMER0_DISABLE; //停止timer
	#else
unsigned char ii;
	
	ii=0;
	
	F_TM=0;
	BT_SND=0; //start bit 
	TIMER0_ENABLE; //启动
	while(!F_TM);
	
	while(ii<8)
	{
		if(inch&1)
		{
			BT_SND=1;
		}
		else
		{
			BT_SND=0;
		}
		F_TM=0;
		while(!F_TM);
		ii++;
		inch>>=1;
	}
	BT_SND=1; 
	F_TM=0;
	while(!F_TM);
	
#endif 
	TIMER0_DISABLE; //停止timer
}
//接收一个字符
unsigned char PGetChar()
{
#ifdef MODE_QUICK 

	TIMER0_ENABLE; 
	F_TM=0;
	while(!F_TM); //等过起始位
	ACC0=BT_REC;
	
	TL0=TH0;
	
	F_TM=0;
	while(!F_TM);
	ACC1=BT_REC;
	
	F_TM=0;
	while(!F_TM);
	ACC2=BT_REC;
	
	F_TM=0;
	while(!F_TM);
	ACC3=BT_REC;
	
	F_TM=0;
	while(!F_TM);
	ACC4=BT_REC;
	
	F_TM=0;
	while(!F_TM);
	ACC5=BT_REC;
	
	F_TM=0;
	while(!F_TM);
	ACC6=BT_REC;
	
	F_TM=0;
	while(!F_TM);
	ACC7=BT_REC;
	
	F_TM=0;
	
	while(!F_TM)
	{
		if(BT_REC)
		{
			break;
		} 
	}
	TIMER0_DISABLE; //停止timer
	return ACC;
#else
unsigned char rch,ii;
	TIMER0_ENABLE; 
	F_TM=0;
	ii=0;
	rch=0;
	while(!F_TM); //等过起始位
	
	while(ii<8)
	{
		rch>>=1;
		if(BT_REC)
		{
			rch|=0x80;
		}
		ii++;
		F_TM=0;
		while(!F_TM);
		
	}
	F_TM=0;
	while(!F_TM)
	{
		if(BT_REC)
		{
		break;
		}
	}
	TIMER0_DISABLE; //停止timer
	return rch;

#endif 

}
//检查是不是有起始位
bit StartBitOn()
{
	return  (BT_REC==0);
}
void main()
{
unsigned char gch;

TMOD=0x22; /*定时器1为工作模式2(8位自动重装),0为模式2(8位
自动重装) */
PCON=00;

TR0=0; //在发送或接收才开始使用
TF0=0; 
TH0=(256-96); //9600bps 就是 1000000/9600=104.167微秒 执行的timer是//104.167*11.0592/12= 96 
TL0=TH0;
ET0=1;
EA=1;

PSendChar(0x55);
PSendChar(0xaa);
PSendChar(0x00);
PSendChar(0xff);

	while(1)
	{
		if(StartBitOn())
		{
		gch=PGetChar();
		PSendChar(gch);
		}
	}

}
 

⌨️ 快捷键说明

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