📄 多路数据采集.txt
字号:
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 + -