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

📄 send.c

📁 温度遥测系统程序,半双工的,已经调试成功了
💻 C
字号:
#include   <reg51.h>
#include   <intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar  xstemp;
uchar  tll=0;
uchar  thh=50;
uchar inte,dec;


sbit DQ =P2^0;     //定义通信端口
sbit  rt=P1^0;		//收发选择端口
sbit  busy=P1^1;		//收发忙标志
sbit  enable=P1^7; //定义模块使能端
sbit beep=P1^3;
bit send_flag;


void delay1(unsigned int i)
{
 while(i--);
}


reset(void)
{
   unsigned char x=0;
   DQ = 1;    //DQ复位
   delay1(8);  //稍做延时
   DQ = 0;    //单片机将DQ拉低
   delay1(80); //精确延时 大于 480us
   DQ = 1;    //拉高总线
   delay1(14);
   x=DQ;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
   delay1(20);
}



//读一个字节
unsigned char read_byte(void)
{
  unsigned char i=0;
  unsigned char dat = 0;
  for (i=8;i>0;i--)
  {
     DQ = 0; // 给脉冲信号
     dat>>=1;
     DQ = 1; // 给脉冲信号
     if(DQ)
        dat|=0x80;        /*LSB to MSB*/
     delay1(4);
   }
   return(dat);
}



//写一个字节
write_byte(unsigned char dat)
{
   unsigned char i=0;
   for (i=8; i>0; i--)
   {
      DQ = 0;
      DQ = dat&0x01;
      delay1(5);
      DQ = 1;
      dat>>=1;
   }
}





//读取温度
unsigned char read_temperature(void)
{
   unsigned char a=0;
   unsigned char b=0;

   reset();
   write_byte(0xCC); // 跳过读序号列号的操作
   write_byte(0x44); // 启动温度转换
   reset();
   write_byte(0xCC); //跳过读序号列号的操作
   write_byte(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
   a=read_byte();
   b=read_byte();
   xstemp=a&0x0f;
   b=b<<4;
   a=a>>4;

return(a|b);
}

unsigned char read_temperature_dec(void)  //读入小数
{
   return(xstemp);
}


senddata(unsigned char dat)     //串口发送数据
{SBUF=dat;
 while(TI==0);
 TI=0;
}




send_temperature()    //发送温度
{
        
  inte = read_temperature();     //整数部分温度
  dec = read_temperature_dec();  //小数部分温度
 
  senddata(0xfe);
  senddata(dec);
  senddata(0xff);                   //发送标志,0xff表示后面是整数,0xfe表示后面是小数
  senddata(inte);
  send_flag=0;
  delay1(100);
 }


 serial_init()             //串口初始化
{
 SCON=0X50;         /* SCON: 串口方式1, 8位异步通信,接收使能*/ 
 TMOD=0x20;        /*波特率发生需用定时器1:TMOD: 定时器1, 8位自动重装 */
 PCON=0x80;        //双倍时钟
 TH1=0xfd;         /* TH1:自动重装值,19200baud ,晶振11.0592MHz */ 
 TL1=0xfd; 
 TR1=1;           /* TR1:启动定时器1 */ 
 EA=1;
 ES=1;
 
}

void receivedata()  interrupt 4  using 1//接收中断
{  uchar temp;     
   static bit flag_thh=0,flag_tll=0; //整数部分和小数部分的标志
   temp=SBUF;
	  if(flag_thh==1)
     {
	  thh=temp;              //接收温度上限部分
      flag_thh=0;           //  清除温度上限标志
	   
     }
     if(flag_tll==1)
     {
	  tll=temp;              //接收温度下限部分
      flag_tll=0;           //  清除温度下限标志
	   
     }
     
   if(temp==0xfd) flag_thh=1; //表示下面发送的是温度上限部分
	 
	 
   if(temp==0xfc) flag_tll=1;  //表示下面发送的是温度下限部分
   
  
   RI=0;                  //清除中断标志	  
  
   
}


main() 
{ 
  
serial_init();             //串口初始化
enable=0;           //使模块工作
//rt=0; 
                   //发送使能 0发送,1接收
while(1)
   {
    
	   	
	       if(inte<tll||inte>=thh)
	        beep=0;
	       else if(inte>=tll&&inte<thh)
		     beep=1;
			 
			if(send_flag==1)
			 send_temperature();   //发送温度 
			 delay1(20000);  //适当延时,使其进入串口中断
			 send_flag=1;
		
		 	 
   }
}

⌨️ 快捷键说明

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