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

📄 sfunc.c

📁 本文详细介绍了VB和单片机之间进行通信的过程。为了确保通信的可靠性
💻 C
字号:
#include<reg51.h>
//#include <intrins.h>
//------------------------------------------
#define true unsigned char 1
#define false unsigned char 0
#define COUNT 10/*DELAY 10*COUNT ms*/
/*----------------------------------------*/
 void delayms(unsigned int x);
/*--------全局变量区----------------------*/
 bit flag_t=0;
/*----------------------------------------*/
/*serial communicaton initial8*/
void init_s(void)//串口工作时T1不能再用。
 {
  TMOD=0X20;//定时器T1工作于自动装载模式
  TH1=0XE8;//1200BPS
  TL1=0XE8;  
  PCON=0X00; /*SMOD=0;*/
  SCON=0X50;/*方式1且允许接收*/
  TR1=1;//定时器开始工作
 }
/*函数功能:在内存Address处进行长度为n的数据填充,填充数据为i*/
void init_m(char data *Address,unsigned char n,unsigned char j)
{
   unsigned char i=0;
    //Address=0x30;
 for (i=0;i<n;i++)
   {
   *Address=j;
    Address++;
   }
}
/*TIMER0 Initial*/
void init_t0(void)
{
 TMOD=TMOD|0X21;/*保持TMOD的定时器1的原始设置,又开启T0。*/
 TH0=0xdc;/*10MS interrupt delay*/
 TL0=0x00;
 EA=1;
 ET0=0;/*enable it if want to work*!!!!*/
 TR0=0;
}
/*----------------------interrupt program----------------------*/
void int_t0(void) interrupt 1
  {
   static unsigned char n=0;//可能会有重复置零的问题!
   TH0=0xdc;/*10MS interrupt delay*/
   TL0=0x00;
   n+=1;/*not best*/
   if (n==COUNT)  
    {
      TR0=0;
      ET0=0;
      flag_t=1;
      n=0;
     }
   }
  //---------------------------------------------------------
/*ack flame*/
bit Ack(void)
{
 unsigned char i,j;
 while (RI==0);RI=0;/*等待接收,直到有信号(两者之一即可),等不到一个信号则死机??*/
 i=SBUF;//要观察I,不要看SBUF.
 ET0=1;//---------------!!
 TR0=1;
 while (RI==0&&flag_t==0);/*接收到信号或时间到10*COUNT ms退出等待*/
 //------------------- restore flag   
 RI=0;
 flag_t=0;
 ET0=0;
 TR0=0;
 j=SBUF;//如果J没接收到数据,则会和i的数据一样
//--------------------	  
 if((i==0x63)||(j==0x63))/*ASCII:c*/
     return(1);
 else 
     return(0);
}

/*hand to hand function,send 0x54,recieve0x63,if have wrong,重发3次*/
bit hd2hd(void)
{
  unsigned char i;
 for(i=0;i<3;i++)
     {
	   SBUF=0X54;//SEND T
           while(TI==0);TI=0;/*don't set breakpoint here*/
	   if (Ack()==1) return(1);
     }
        delayms(100);//????????????????等待1000MS,使计算机有时间反映
	return(0);
}
/*函数功能:从Adrress处发送n个数据*/
void Send_Data( char data *Adrress,unsigned char n)
{
 unsigned char pf=0;
 unsigned char i;
 SBUF=0X55;/*起始位55*/
 while(TI==0);TI=0;
 SBUF=n;/*data lenth*/
 while(TI==0);TI=0;
     pf=0;
      for (i=0;i<n;i++)
         {
	unsigned char m;///SBUF的值不定!!
          SBUF=*Adrress;///发送完才变为当前数
	  m=*Adrress;
          Adrress++;
          pf+=m;
	while(TI==0);TI=0;
         }
       SBUF=pf;
       while(TI==0);TI=0;
 }    
 void delayms(unsigned int x)//延时1ms*X
  {
  	unsigned char j;
  	while(x--)
  	{
        	for(j=0;j<125;j++)
  		{;}
  	}
  }
   

⌨️ 快捷键说明

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