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

📄 多路数据采集.txt

📁 多路数据采集系统
💻 TXT
📖 第 1 页 / 共 3 页
字号:
                show_num(x_rdat[j*2+1]/10);
                show_num(x_rdat[j*2+1]%10);
                coding_display(" v ");
              }
            WriteCommand(0x88);
            for(j=15;j<17;j++)
              {
                show_num(x_rdat[j*2]/10);
                coding_display(".");
                show_num(x_rdat[j*2]%10);
                show_num(x_rdat[j*2+1]/10);
                show_num(x_rdat[j*2+1]%10);
                coding_display(" v ");
             }
            WriteCommand(0x98);
            for(j=17;j<19;j++)
             {
                show_num(x_rdat[j*2]/10);
                coding_display(".");
                show_num(x_rdat[j*2]%10);
                show_num(x_rdat[j*2+1]/10);
                show_num(x_rdat[j*2+1]%10);
                coding_display(" v ");
             } 
      }
}
//-------------------------------------------------------------------------
//主要处理在通讯过程中的按键的设置,执行,以及处理
//-------------------------------------------------------------------------
void key()
{
        if (KEY_3 == 0) // 设置时间
      		{
       		delayms(20);	   //去抖
			if(KEY_3 == 0 && w == 1)  //当是调时状态 本键用于调整下一项
			{
                                //lcd_cls();//清屏
				e++;

				if (e >7){e = 0;}
				set_page(e);//调整模块选项
                        }
		       if(KEY_3 == 0 && w == 0)  //当是正常状态时就进入调时状态
		        {
		                lcd_cls();//清屏
			        w=1;	  //进入设置
				WriteCommand(0x80);
				coding_display("Esc");
				WriteCommand(0x86);
				coding_display("Next");

				WriteCommand(0x98);
				coding_display("[+] ");
				WriteCommand(0x9e);
				coding_display(" [-]");
                set_page(e);

			}
       		        while(KEY_3 == 0);//等待键松开
                        delayms(20);	   //去抖
      		}

		//------------------------------------------------------------------
		if (KEY_1 == 0) // 当在调整状态时就退出调时
      		{
       			delayms(50);
       			if(KEY_1 == 0 && w == 1)
				{
					w = 0;	  //退出调时
					e = 0;		//“下一项”计数器清0
                                	while(KEY_1 == 0);//等待键松开
                                        delayms(50);	   //去抖
                                }

			if(KEY_1 == 0 && w == 0)
				{
                                lcd_cls();//清屏
			        w=1;	  //进入设置
				WriteCommand(0x80);
                                show_flag=1;
				coding_display("Esc");
				while(KEY_1 == 0);//等待键松开
                                delayms(20);	   //去抖
				}


      		}

		//------------------------------------------------------------------
		if (KEY_2 == 0 && w == 1)// 加减调整
		{
       			delayms(20);
       			if(KEY_2 == 0 && w == 1)
			{
				set_page(e);//调整 获取调整之后的参数
                                up_data();//刷新参数
			}

       			while(KEY_2 == 0);//等待键松开
                        delayms(20);	   //去抖
      		}

		//------------------------------------------------------------------
		if (KEY_4 == 0 && w == 1)// 加减调整
		{
       			delayms(20);
       			if(KEY_4 == 0 && w == 1)
			{
				set_page(e);//调整 获取调整之后的参数
                                up_data();//刷新参数

			}
       			while(KEY_4 == 0);//等待键松开
                        delayms(20);	   //去抖

      		}

}
unsigned char comm(unsigned char data add,unsigned char data command)
{       unsigned char idata r_buff[5]={0,0,0,0,0};
        unsigned char data j,err=0;
        e_485=1;
	SBUF=add;while(TI==0);TI=0;//发送地址
	SBUF=command;while(TI==0);TI=0;//发送命令
	SBUF=add+command;while(TI==0);TI=0;//发送地址
        //RI=0;//注意这一点是必须要加的,由于在发送完毕之后会出现的抖动,不加的情况下,会产生失步的情况
        e_485=0;       //打开诗句接收使能端?
        for(j=0;j<5;j++)//在主机发送完之后,在一定的时间之内没有收到从机的信息视为发送失败
	{
		r_dat=0;
                RI=0;//注意这一点是必须要加的,由于在发送完毕之后会出现的抖动,不加的情况下,会产生失步的情况
	        while((RI==0)&&(r_dat<400))//(超时)当两个字节之间中断事件大于某个数值时就返回err=1
                //这里取值120是手动试出来的,大概是在六毫秒时间,是实际TO延时的两倍
                	{r_dat++;}
		if(RI==1)
			{
                        r_buff[j]=SBUF;RI=0;}
		else
			{err=1;break;}			//退出
	}
        if((err==0)&&(r_buff[4]==r_buff[3]+r_buff[2]+r_buff[1]+r_buff[0])&&(r_buff[0]==add))
                   { r_dat=0xFF;}
        else
                   { r_dat=0x00; }
	x_tdat[2*add]=r_buff[1];
        x_tdat[2*add+1]=r_buff[2];
        t[add]=r_buff[3];
        //当接收到的电压的值大于报警的预设值,并且该路设置了报警(默认为设置的参数不为0为设置了报警)
        if(((r_buff[1]*10+r_buff[2]/10)>alarm[add])&&(alarm[add]!=0))
        {
                alarm_flag=1;
                alarm_td=add;
         }

	 return r_dat;
}		   //结束
///////////////////////////////////////////
//汉字的位置
//0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,      //第一行汉字位置
//0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,      //第二行汉字位置
//0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,      //第三行汉字位置
//0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,      //第四行汉字位置
///////////////////////////////////////////
void fs() interrupt 1
{
   TR0=0;
   TH0 = 0x3c;				// 定时扫描子机
   TL0 = 0xb0;
   time=time+1;
   show_time=show_time+1;
   if(time==2)
   {
     time=0;
     comm(fs_td,0x00);
     fs_td=fs_td+1;
   }
   sec=sec+1;
   sec_page=sec_page+1;                 //用于显示保存的20个点的数据的标志位,分3页显示                          //
   if(fs_td>7){fs_td=0;}
   TR0=1;
}
void diaodian() interrupt 0
{
    byte_write(x_j,0x0190);
}
void watchdog()
{
 dog=0;
 _nop();
  _nop_();
  _nop_();
 dog=1;
}
main()
{
   //SM0 SM1 SM2 REN X X X X
   TMOD = 0x21;			// 定时器1工作于8位自动重载模式, 用于产生波特率
   TH1 = 0xFD;				// 波特率9600
   TL1 = 0xFD;
   TH0 = 0x28;				// 定时扫描子机
   TL0 = 0x00;
   SCON = 0x50;			// 设定串行口工作方式
   ET0=1;
   select=1;
   e_485=0;                   //打开485发送使能?
   EX0=1;
   TR1 = 1;				// 启动定时器1
   TR0 = 1;
   EA=1;
   set_1302();
   lcd_init(); //LCD初始
   x_j=byte_read(0x0190);
   for(alarm_i=0;alarm_i<8;alarm_i++)
   {
   alarm[alarm_i]=byte_read(0x01C2+alarm_i);
   }
   while(1)
   {
                watchdog();
   		if (w == 0)                        //模式调节标志位
		{
		   up_page();
                   show_flag=0;
                }
		key();
                watchdog();
                if((show_flag==1)&&(show_time>15))
                {
                   EA=0;
                   up_show();
                   EA=1;
                   show_time=0;
                }
                watchdog();
                 //------------保存数据程序 ---------------------
                 if(sec%150==0)
                 {  
                    unsigned char i;
                    sec=0;
                    for(i=0;i<16;i++)
                    {
                        byte_write(x_tdat[i],16*x_j+i);
                        
                    }
                    x_j=x_j+1;
                  
                    if(x_j>19){x_j=0;}
                 } 
                 //--------------- 完毕---------------------------
                 if(alarm_flag==1)
                 {
                  alarm_led=~alarm_led;
                  alarm_flag=0;
                 }
      }
}
2、子机源程序
#include <reg52.h>
#include <intrins.h>
int   addat1;        //定义A/D采样结果变量
bit   adover=0;      //定义A/D结束标志
sbit  pol=P1^6;      //定义A/D结果符号输入接口
sbit  e_485=P1^5;     //定义A/DBUSY输入接口
sbit  wd=P1^7;
char  add;
sbit  lm71_sio= P2^1;       //485数据传输和接收使能端。
sbit  lm71_sck = P2^0;	 //左上		功能:退出  显示数据功能
sbit  lm71_cs = P2^2;	 //左下		功能:加一
unsigned int t;
//返回温度为实际温度的128倍
unsigned char data r_buff[3],t_buff[5],r_count=0,t_count=0,tt;

void ad_t0_int() interrupt 0
{
  TR0=0;
  addat1=(256*TH0+TL0)*1.239567;
  TH0=55535/256;     //初值为-10000
  TL0=55535%256;
  if(pol==0){addat1=0-addat1;}
  adover=1;          //置位采样结束标志,通知主函数
  TR0=1;
}
void com_int() interrupt 4
{
	if(RI==1)//由于两个SBUF是全双工的,所以在工作的时候可以在串口中断里面放入数据发送,与接收中断是没有关系的
	{
		RI=0;r_buff[r_count]=SBUF;r_count=r_count+1;
		TH2=(65536-3000)/256;				//3字节3ms延时	  //th0=244   TH0=F4
		TL2=(65535-3000)%256;					//	tl0= 0					  TL0=0
		//TH0=0X00;
		//TL0=0X00;
		TR2=1;							//在这里开定时计数器可以用来进行判断是否开始收发,以及收发的延时
		ET2=1;
 	}
	else
	{	TI=0;
         e_485=1;
					//发送一字节,此时发送的是从机的响应信号
		if(t_count<5)		//此处最好不要用while来判断是否是小于3
		{	SBUF=t_buff[t_count];
         t_count=t_count+1;
         while(TI==0);
		}//发下一个
	}
}
void Timer2_Server(void) interrupt 5
{      TF2=0;
        TR2=0;
	ET2=0;
	if((r_count==3)&&(r_buff[0]==add
        )&&(r_buff[2]==r_buff[1]+r_buff[0]))//0x00表示为本机地址
	{         t_buff[4]=t_buff[0]+t_buff[3]+t_buff[2]+t_buff[1];
	          t_buff[0]=r_buff[0];
                  t_count=0;
                  TI=1;
	}
	r_count=0;				//这里的r_count=0;必须放在这里,由于r_count是全局变量,需要注意累加和的影响
}	 //结束
int lm71()
{unsigned char data i;
int data j,k;
         lm71_sio=1;
         lm71_sck=0;
         lm71_cs=0;
         i=16;
         while(i!=0)
            {
             j=j<<1;
             k=lm71_sio;
             j=j|k;
             lm71_sck=1;
             lm71_sck=0;
             i--;
            }
         lm71_cs=1;
         return j;
}
void watchdog()
{ wd=0;
 _nop_();
 _nop_();
 wd=1;       
}
main()
{   add=P1&0x0f;
	TMOD = 0x2D;			// 定时器1工作于8位自动重载模式, 用于产生波特率
	TH1 = 0xFD;				// 波特率9600
	TL1 = 0xFD;
        IT0= 1;
        EX0= 1;
	SCON = 0x50;			// 设定串行口工作方式
        adover=0;
	TR1=1;				// 启动定时器1
        TR0=1;
	ES=1;
	EA=1;
        e_485=0;
	while(1)
	{   watchdog();
        t=lm71()/128;
        e_485=0;        
        while( adover==0);
        adover=0;
        t_buff[1]=addat1/1000;
        t_buff[2]=addat1%1000/10;
        t_buff[3]=t;
        }
}

⌨️ 快捷键说明

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