[单片机] MCU自定义引脚当串口

串口RS232的数据协议有两种,我们以PC与8位/32位单片机间比较常用的异步模式为例子讲解.
单片机的TXD引脚先发一个低电平0给对方,然后发送5–8个位作为数据,最后发送1个位奇偶校验和1个位高电平1作为停止位.
以下例子为波特率9600bps,1个开始位,8个数据位,1个停止位 [10位数据,无奇偶校验位:9600-8-N-1]
波特率:每秒钟发送的字节位,如果baud=9600,也就是说,每发送1位耗时1000/9600=104uSec

/**************************************
   利用51定时器中断模拟串口信息发送
   优点:可以自定义串口引脚,可以实现多个串口
   格式: 9600-8-N-1
   功能:模拟串口Send
*****************************************/
#include          
                                 
char   g_nSendInx=0;
char   g_nBuff=0;
char   g_nFlag=0;

#define MY_TXD P2_1 //定义TXD引脚,原生芯片是P3.1


void Timer0Init(void)//104微秒@11.0592MHz
{
 //1000ms/9600=104.166us
 //使用这种方案,由于精确性问题,长时间传输会偶然出现几个误码
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x02;		//设置定时器模式
	TL0 = 0xA0;		//设置定时初值
	TH0 = 0xA0;		//设置定时重载值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时

	ET0=1;
	EA=1;
}

/******************************
  自定义串口发送单字符  
******************************/
void MyUart_Send(char ch){
  g_nFlag=0;
  g_nBuff=ch;
  TR0=1;
  while(g_nFlag==0);
}


/******************************
  自定义串口发送字符串
******************************/
void MyUart_String(char* str){
 
  int i=0;
 
  while(*(str+i)){
   g_nFlag=0;
   g_nBuff=*(str+i);
    i++;
   TR0=1;
   while(g_nFlag==0);
  }
}


/*
   定时器0中断服务
*/
void Timer0_ISP() interrupt 1{

  g_nSendInx++;//发送模拟第几位

  if(g_nSendInx==1)
  {
     MY_TXD=0;//起始位拉低

  }else if(g_nSendInx==10)  //格式: 9600-8-N-1,完整10Bit数据
  {
     MY_TXD=1;//停止位拉高
	 TR0=0;
     g_nSendInx=0;
	 g_nFlag=1;///发送完成标志位
  }else{
   
    MY_TXD=g_nBuff&0x01;////sbuffer_data
	g_nBuff>>=1;
  }

   
}
										 
/**********************************
  用Timer0定时中断模拟串口信号
**********************************/
void main (void) {

   Timer0Init();///定时器初始化,周期为 1000ms/9600=104us

   MyUart_String("===Welcome,My Uart===\r\n ");
   MyUart_Send(0x61);
   MyUart_Send(0x62);
   MyUart_Send(0x63);

  while (1);

 }

你可能感兴趣的:(串口模拟)