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

📄 51模拟串口c程序.txt

📁 51模拟串口c程序 //但我验证过
💻 TXT
字号:
#i nclude<reg52.h> 
#i nclude<stdio.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;
 unsigned char i;
 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);
 
 // 定时器1为9600bit/s 的波特率发生器 
 TL1=0xfd;
 TH1=0xfd;
 SCON=0x50;
 PCON=0x80;
 while(1)
 {
  if(StartBitOn())
  {
   gch=PGetChar();
//   printf("%s\n",gch);
   for(i = 0x30; i< 0x50; i++)
    PSendChar(i);
  }
 }
}

⌨️ 快捷键说明

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