×
单片机 > 单片机程序设计 > 详情

IO口模拟串口C51程序

发布时间:2020-06-04 发布时间:
|

/**************************
 文件所用资源
1.外部中断0
2.端口:P3.3、P3.4
**************************/
sbit BT_REC =P3^3;  //接收 P3.0
sbit BT_SND =P3^4;  //发送 P3.1

#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;
unsigned char com_dat;
/**************************
 定时器0中断服务函数
**************************/
void IntTimer0() interrupt 1
{
 F_TM=1;
}
/**************************
 模拟串口发送一个字节
**************************/
void PSend_Char(unsigned char inch)
{
 EX1=0;   //关闭INT0中断
 #ifdef MODE_QUICK 
 ACC=inch;

 F_TM=0;
 BT_SND=0;   
 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; 
 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
 IE1=0;   //清除中断标志
 EX1=1;   //INT0中断允许
}
/******************************** 
 外部中断0模拟串口接收一个字节
********************************/
void PGet_Char() interrupt 2
{   
 EX1=0;   //关闭INT0中断
  
 #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
 com_dat=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
 dat=rch;

 #endif 
 IE1=0;   //清除中断标志
 EX1=1;   //INT0中断允许
}



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
如何为单片机选择合适的负载电容