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

📄 c51模拟串口.txt

📁 c51模拟串口调试程序
💻 TXT
字号:
c51模拟串口
[ 2006-5-31 11:53:09 | By: 晒太阳的小猪 ]
在电路设计当中,经常会感觉控制器mcu的串口sci数量太少,一般mcu的sci数量不会超过3个(其实包含有3个的就是很多的了)。要想使用更多的串口sci,就得选用硬件串口uart扩展芯片或者采用软件协议利用一般的端口来模拟sci协议。利用软件模拟的方法是最廉价的设计方法。现在把c51模拟串口sci的程序提供出来,供大家享用。

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

//作者:晒太阳的小猪
//个人blog:http://emcu.c51bbs.com
//转载使用请注明

IO 口模拟232通讯程序,频率9600

占用定时器0 

**********************************************/
#i nclude    <MAIN.h>
#i nclude    <ABSACC.h>
#i nclude    <INTRINS.h>
#i nclude    <STRING.h>
#define uint unsigned int
#define uchar unsigned char
#define REN_485 P21  //为0则可以接受,否则发送
#define TIMER0_ENABLE TL0=TH0; TR0=1;
#define TIMER0_DISABLE TR0=0;
//#define F_TM F0
bit F_TM;
uchar time_count;
sbit BT_SND =P3^1;
sbit BT_REC =P3^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 using 1
{
F_TM=1;
time_count++;
}

//发送一个字符
void PSendChar(uchar inch)
{ 
  
  uchar ii; 
  time_count=0;
  REN_485=1;
  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);
  TIMER0_DISABLE; //停止timer
}

//接收一个字符
uchar PGetChar()
{
 uchar 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; 
}

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

}

void main()
{
 uchar gch; 
 TMOD=0x22; //定时器1为工作模式2(8位自动重装),0为模式2(8位8位自动重装)
 PCON=00;
 TR0=0; //在发送或接收才开始使用
 TF0=0; 
 TH0=0xA0;
        TL0=0xA0;
 ET0=1;
 EA=1;
 
        
 PSendChar(0x55);
 
 PSendChar(0xaa);
 PSendChar(0x00);
 PSendChar(0xff);
 
        
 while(1)
 {       
         REN_485=0;
  if(StartBitOn())
  {
  gch=PGetChar();
  PSendChar(gch);
  }
 }
}


⌨️ 快捷键说明

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