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

📄 iotoserial.c

📁 C51普通IO模拟Uart
💻 C
字号:
	#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;

#define uchar unsigned char
void dlms(void);
uchar kbscan(void);

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 

}

void dlms(void)
{
	uchar i;
	for(i=200;i>0;i--){ }
}

uchar kbscan(void)           							//key scan Function
{
	uchar sccode,recode;
	P2 = 0xf0;			       							//发全“0"行扫描,列线输入
	if ( (P2 & 0xf0) != 0xf0 ){							//	   //key press
			dlms();		       							//延时去抖动
			if ( (P2 & 0xf0) != 0xf0){	 				//
				sccode = 0xfe;	  						//逐行扫描初值
				while ( (sccode & 0x10) != 0 ) 			//
				{
					P2=sccode;		  					//输出行扫描码
					if ( (P2 & 0xf0) != 0xf0 ) 			//本行有键按下
					{
						recode = (P1 & 0xf0)|0x0f;
						return((~sccode)+(~recode));
					}
					else
						sccode = (sccode<<1)|0x01;
				}
			}
		}
	return(0);
} 

//检查是不是有起始位
bit StartBitOn()
{
	return (BT_REC==0);

}

void main()
{
	unsigned char gch;
	uchar key;

	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) {
	 	key = kbscan();
		if(key != 0)
		PSendChar(key);
		dlms();
	}

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

}

⌨️ 快捷键说明

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