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

📄 uart0.c

📁 主要用340单片机的控制的温和湿度采集和向主机发送已接受主机设置参数。
💻 C
📖 第 1 页 / 共 5 页
字号:
	 writenum++;

	 b1toa(1,6,2,6,2);                //分
     tbuf[writenum]=':';              //:
	 writenum++;

	 b1toa(1,6,0,0,3);                //秒
	 tbuf[writenum]=0x20;             //
	 writenum++;

     fengxiang=1;

	 b2toa(6,2,4);                  //风向
	 tbuf[writenum]=0x30;           //
	 writenum++;

	 tbuf[writenum]=0x20;           //
	 writenum++;


	 tbuf[writenum]=0x30;           //
	 writenum++;

	 b1toa(1,6,4,4,5);             //风速整数

	 b1toa(0,4,0,0,6);            //风速小数

	 tbuf[writenum]=0x20;             //
	 writenum++;

	 if(uporload==1)
	 {
	 for(i=0;i<19;i++)
	 {
	 b2toa(6,2,4);                  //风向
	 tbuf[writenum]=0x30;           //
	 writenum++;

	 tbuf[writenum]=0x20;           //
	 writenum++;



	 tbuf[writenum]=0x30;           //
	 writenum++;

	 b1toa(1,6,4,4,5);             //风速整数
//     tbuf[writenum]='.';            //.
//	 writenum++;

	 b1toa(0,4,0,0,6);            //风速小数

	 tbuf[writenum]=0x20;             //
	 writenum++;
	 }
	 }
     fengxiang=0;

	 b1toa(1,7,4,4,7+57*uporload);              //温度整数部分
 //    tbuf[writenum]='.';            //.
//	 writenum++;

	 b1toa(0,4,0,0,8+57*uporload);              //温度小数部分
	 tbuf[writenum]='0';              //0
	 writenum++;

	 tbuf[writenum]=0x20;           //
	 writenum++;

	 b1toa(1,7,0,0,9+57*uporload);             //湿度

	 tbuf[writenum]=0x20;           //
	 writenum++;

	 b2toa(4,4,10+57*uporload);                 //气压整数
//     tbuf[writenum]='.';            //.
//	 writenum++;

	 b1toa(0,4,0,0,11+57*uporload);             //气压小数
	 tbuf[writenum]=0x30;           //
	 writenum++;

}


/******************************************************************************
*单字节二进制转ASC码*
*******************************************************************************/
	 	 	  	 	     
void b1toa(unsigned char xorz,length,left,right,datanum)
{
     unsigned char databyte1,databyte2,databyte3=0xff;
	 unsigned char ge,shi,bai;
     databyte3>>=(8-length);	  
	 if(left==0)	 
	 {
	 databyte1=datatra[datanum];
	 databyte1>>=right;
	 databyte1 &= databyte3;
	 }
	 else
	 {
	 databyte1=datatra[datanum];
	 databyte1<<=left;
	 databyte2=datatra[++datanum];
	 databyte2>>=right;
	 databyte1 |= databyte2;
	 databyte1 &= databyte3;
	 }
     ge=databyte1%10;
	 ge += 0x30;
	 databyte1/=10;
	 shi=databyte1%10;
	 shi += 0x30;
	 databyte1/=10;
     bai=databyte1%10;
	 bai += 0x30;
	 if(bai!=0x30)
	 {
     tbuf[writenum]=bai;           //
	 writenum++;
	 }
	 if(xorz==1)
	 {
     tbuf[writenum]=shi;           //
	 writenum++;
	 tbuf[writenum]=ge;           //
	 writenum++;
	 }
     else
	 {
	 tbuf[writenum]=ge;           //
	 writenum++;
	 }
}

/******************************************************************************
*双字节二进制转ASC码*
*******************************************************************************/

void b2toa(unsigned char left,right,datanum)
{
     unsigned int databyte1,databyte2;
	 unsigned char ge,shi,bai,qian;
	 databyte1=datatra[datanum];
	 databyte2=datatra[++datanum];
	 databyte1<<=left;
	 databyte2>>=right;
	 databyte1+=databyte2;
	 ge=databyte1%10;
	 ge+=0x30;
	 databyte1/=10;
	 shi=databyte1%10;
	 shi+=0x30;
 	 databyte1/=10;
	 bai=databyte1%10;
	 bai+=0x30;
	 databyte1/=10;
	 qian=databyte1%10;
	 qian+=0x30;
	 if(fengxiang==0)
	 {
     tbuf[writenum]=qian;           //
	 writenum++;
	 }
//     tbuf[writenum]=qian;           //
//	 writenum++;
	 tbuf[writenum]=bai;           //
	 writenum++;
     tbuf[writenum]=shi;           //
	 writenum++;
	 tbuf[writenum]=ge;           //
	 writenum++;
}

/******************************************************************************
*数据发送子程序*
*******************************************************************************/

void send()
{
//     ES0=0;
	 while (tbuf[tnum]!=0x0a)
	 {
	 SBUF0=tbuf[tnum];
     tnum++;
	 while(TI0==0) {}
	 TI0=0;
	 }
	 SBUF0=tbuf[tnum];
     tnum++;
 	 while(TI0==0)	  {}
	 TI0=0;
	 tnum=0;
//	 ES0=1;
}

/******************************************************************************
*串口中断子程序*
*******************************************************************************/
void UART0_Interrupt (void) interrupt 4
{ 
     EA=0;
	 while(RI0==1)
	 {
	 rbuf[rnum]=SBUF0;	 
	 if(rbuf[rnum]==0x0a)
	 {
      uu=1;
	  ordernum++;
	 }
	 RI0=0;
     rnum++;
	 }
	 EA=1;
}

/******************************************************************************
*接收缓冲区数据处理子程序(ID部分)*
*******************************************************************************/

void buffer()
{
    ES0=0;
	EX0=0;
	 switch (rbuf[readnum])
	 {
	 case 'G': 
//       readnum=readnum99(10);
      readnum+=11;
	   global();
	   break;
	 case 'W': 
//	   readnum=readnum99(10);
      readnum++;       
	   IDjudge();
	   break;
	 case 'V':
//	   readnum=readnum99(10); 
      readnum+=11;
	   visibility();
	   break;
	 default:
	 readnum=rnum;
     lostre();
	 break;
	 }
	 ES0=1;
	 EX0=1;
}

/******************************************************************************
*接收缓冲区数据处理子程序(全局部分)*
*******************************************************************************/

void global()
{
    switch (rbuf[readnum])
	{	 
	case 'R': 
	  rdid();
	  break;
	case 'W':
	  wdid();
	  break;
	 default:
	 readnum=rnum;
     lostre();
	 break;        
	}
}

/******************************************************************************
*读ID子程序(全局部分)*
*******************************************************************************/

void rdid() 
{
    int i;
//    readnum=readnum99(6);
    readnum+=6;
	EEPROM_ByteRead(0x00,0x00,id);	 
 	 for(;readnum1<readnum-2;readnum1++)
	 {
	 tbuf[writenum]=rbuf[readnum1];
	 writenum++;
	 }
     tbuf[writenum]=0x20;           //
	 writenum++;
	for(i=0;i<7;i++)
	 {
     tbuf[writenum]=id[i];
	 writenum++;
	 }
     tbuf[writenum]=0x20;           //
	 writenum++;	     
     tbuf[writenum]='O';           //O
	 writenum++;
     tbuf[writenum]='K';           //K
	 writenum++;
     tbuf[writenum]=0x20;           //
	 writenum++;
	 ordertimepro();
     tbuf[writenum]=0x0D;           //回车
	 writenum++;
     tbuf[writenum]=0x0A;           //换行
	 writenum++;
	 writenum=0;
	 send();
	 
}


/******************************************************************************
*写ID子程序(全局部分)*
*******************************************************************************/

void wdid()
{	 
     int i;
    readnum+=5;
	for(i=0;i<7;i++)
	{
	id[i]=rbuf[readnum];
    readnum++;
	 }
     readnum+=2;
     EEPROM_ByteWrite(0x00,0x00,id);
     succeedre();
	 
}

/******************************************************************************
*ID判断子程序(全局部分)*
*******************************************************************************/
void IDjudge()
{
    int i;
	bit IDwrong=0;
	for(i=1;i<7;i++)
	{
	if(rbuf[readnum]==id[i])
	{
	IDwrong=0;
	}
	else
	{
	IDwrong=1;
	break;
	}
	readnum++;
	}
	if(IDwrong==0)
	{
	readnum+=4;
	wenshi();
	}
	else
	{
	 tbuf[writenum]='W';           //W
	 writenum++;
     tbuf[writenum]='R';           //R
	 writenum++;
	 tbuf[writenum]='O';           //O
	 writenum++;
     tbuf[writenum]='N';           //N
	 writenum++;
	 tbuf[writenum]='G';           //G
	 writenum++;
     tbuf[writenum]='I';           //I
	 writenum++;
	 tbuf[writenum]='D';           //D
	 writenum++;
     tbuf[writenum]=0x0D;           //回车
	 writenum++;
     tbuf[writenum]=0x0A;           //换行
	 writenum++;
	 writenum=0;
	 send();
	 }
}
/******************************************************************************
*气象部分数据处理子程序(全局部分)*
*******************************************************************************/  

void wenshi ()
{
    switch (rbuf[readnum])
	{
	case 'R':
	   rsts();
	   break;
    case 'C':
	   cktm();
	   break;
    case 'L':
	   load();
	   break;
    case 'B':
	   baud();
	   break;
    case 'P':
	   para();
	   break;
	 default:
	 readnum=rnum;
     lostre();
	 break;
    }
}

/******************************************************************************
*系统复位子程序(全局部分)*
*******************************************************************************/

void rsts()
{    
//    int i;
/*	for(i=0;i<7;i++)
	 {
     tbuf[writenum]=id[i];
	 writenum++;
	 }
*/
    readnum+=6;
     succeedre();
   RSTSRC=0x10;
} 

/******************************************************************************
*时间校准子程序(全局部分)*
*******************************************************************************/

void cktm(){
 //  readnum=readnum99(6);
   readnum+=7;
   timefromcomputer[0]=rbuf[readnum]-0x30;
   timefromcomputer[0]*=10;
   readnum++;
   timefromcomputer[0]+=rbuf[readnum]-0x30;
   readnum+=2;
   timefromcomputer[1]=rbuf[readnum]-0x30;
   timefromcomputer[1]*=10;
   readnum++;
   timefromcomputer[1]+=rbuf[readnum]-0x30;
   readnum+=2;
   timefromcomputer[2]=rbuf[readnum]-0x30;
   timefromcomputer[2]*=10;
   readnum++;
   timefromcomputer[2]+=rbuf[readnum]-0x30;
   readnum+=2;
   timefromcomputer[3]=rbuf[readnum]-0x30;
   timefromcomputer[3]*=10;
   readnum++;
   timefromcomputer[3]+=rbuf[readnum]-0x30;
   readnum+=2;
   timefromcomputer[4]=rbuf[readnum]-0x30;
   timefromcomputer[4]*=10;
   readnum++;
   timefromcomputer[4]+=rbuf[readnum]-0x30;
   readnum+=2;
   timefromcomputer[5]=rbuf[readnum]-0x30;
   timefromcomputer[5]*=10;
   readnum++;
   timefromcomputer[5]+=rbuf[readnum]-0x30;
 //  readnum=readnum99(3);
   readnum+=3;
   	S3530Aini();
 	 for(;readnum1<readnum-2;readnum1++)
	 {
	 tbuf[writenum]=rbuf[readnum1];
	 writenum++;
	 }
     tbuf[writenum]=0x20;           //0
	 writenum++;
   ordertimepro();
     tbuf[writenum]=0x20;           //0
	 writenum++;	     
   tbuf[writenum]='O';
   writenum++;
   tbuf[writenum]='K';
   writenum++;
   tbuf[writenum]=0x0D;           //回车
   writenum++;
   tbuf[writenum]=0x0A;           //换行
   writenum++;
   writenum=0;
   send();
   timefrocomputer01=1;

}

/******************************************************************************
*波特率设置子程序(全局部分)*
*******************************************************************************/     

void baud()
{ 

⌨️ 快捷键说明

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