基于CAN总线的分布式测控系统.docx

上传人:b****2 文档编号:17671312 上传时间:2023-07-27 格式:DOCX 页数:22 大小:120.97KB
下载 相关 举报
基于CAN总线的分布式测控系统.docx_第1页
第1页 / 共22页
基于CAN总线的分布式测控系统.docx_第2页
第2页 / 共22页
基于CAN总线的分布式测控系统.docx_第3页
第3页 / 共22页
基于CAN总线的分布式测控系统.docx_第4页
第4页 / 共22页
基于CAN总线的分布式测控系统.docx_第5页
第5页 / 共22页
基于CAN总线的分布式测控系统.docx_第6页
第6页 / 共22页
基于CAN总线的分布式测控系统.docx_第7页
第7页 / 共22页
基于CAN总线的分布式测控系统.docx_第8页
第8页 / 共22页
基于CAN总线的分布式测控系统.docx_第9页
第9页 / 共22页
基于CAN总线的分布式测控系统.docx_第10页
第10页 / 共22页
基于CAN总线的分布式测控系统.docx_第11页
第11页 / 共22页
基于CAN总线的分布式测控系统.docx_第12页
第12页 / 共22页
基于CAN总线的分布式测控系统.docx_第13页
第13页 / 共22页
基于CAN总线的分布式测控系统.docx_第14页
第14页 / 共22页
基于CAN总线的分布式测控系统.docx_第15页
第15页 / 共22页
基于CAN总线的分布式测控系统.docx_第16页
第16页 / 共22页
基于CAN总线的分布式测控系统.docx_第17页
第17页 / 共22页
基于CAN总线的分布式测控系统.docx_第18页
第18页 / 共22页
基于CAN总线的分布式测控系统.docx_第19页
第19页 / 共22页
基于CAN总线的分布式测控系统.docx_第20页
第20页 / 共22页
亲,该文档总共22页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

基于CAN总线的分布式测控系统.docx

《基于CAN总线的分布式测控系统.docx》由会员分享,可在线阅读,更多相关《基于CAN总线的分布式测控系统.docx(22页珍藏版)》请在冰点文库上搜索。

基于CAN总线的分布式测控系统.docx

基于CAN总线的分布式测控系统

 

专业:

测控技术与仪器

班级:

姓名:

学号:

指导老师:

 

基于CAN总线的分布式测控系统

一、实验目的:

1.了解分布式测控的原理;

2.初步掌握用C语言开发较复杂的工程;

3.初步掌握项目了解、调试方法;

4.挫折训练

二、基本原理:

利用CAN总线串联4套实验设备,组成一分布式测控系统,其中一台一主机,另外三台为从机。

从机将检测到的温度、湿度等现场数据反馈回主机。

主机根据反馈数据,给定从机的直流电机的运行速度,从机根据此给定,控制电机运行。

要求主机能通过虚拟串口界面获取从机的现场数据,并能通过键盘控制从机的电机运行。

三、需用器件与单元:

达盛电子创新平台、CAN总线通信模块温、湿度传感器模块直流电机调压调速模块

四、实验内容:

1.根据文档“CAN模块调试说明”调试硬件;

2.对照SJA1000_cn.PDF读懂汇编工程文件CANSF.UV2;

3.将该汇编文件转换成C语言,注意封装成可以调用收发函数;

4.在从节点编写测温测湿函数;

5.熟悉虚拟串口的使用,可参照文件夹“Func_Ptr虚拟串口例程”;

6.关于键盘的使用,可参考KEIL1软件安装目录下的例程TRAFFIC。

五、硬件原理图:

 

6、程序流程图

(1)主节点软件流程

 

(2)直流电机节点流程图

(3)温度节点流程图

7、程序源码(子程序为放上)

1、主节点函数

/***********头文件定义*********************/

#include

#include

#include

#include

/***********宏定义**************************/

#defineucharunsignedchar

#defineuintunsignedint

#definecommand_T't'//获取温度数据命令

#defineget_tmp_succ'v'//获取温度数据成功

#definespeed_regulation's'//速度调节命令

#definespeed_regu_succ'k'//速度调节成功

#defineget_speed'g'//获取电机转速

#definelevel_1'a'//速度等级1

#definelevel_2'b'//速度等级2

#definelevel_3'c'//速度等级3

#definelevel_4'd'//速度等级4

#definelevel_5'e'//速度等级5

#definelevel_6'f'//速度等级6电机停转

/***********函数声明****************************/

voidcan_init(ucharID);

voidcan_send(uchar*send_table,ucharID);

ucharbus_check();

ucharcan_receive(uchar*receive_can);

voiderror_show();

//voiddelay(uintz);

/****************变量定义********************/

bitflag;

uchardata_table[8],T;

tmp_datatbl[60];

uchartemp_t,temp_m;

uinttime;

uintdatatbl_i;

ucharget_cmd;

ucharmotor_speed_lev;

uintmotor_speed;

/************主函数*******************************/

voidmain(void)

{

TMOD=0x01;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

EA=1;

ET0=1;

can_init(0xaa);

Printf51_Init();

printf("TheCANmodelisinitializedsucessfully!

!

!

\n");

printf("inputcommand:

");

TR0=1;

while

(1)

{

if(time==10)

{

time=0;

data_table[2]=command_T;

can_send(data_table,0xcc);

temp_t=SR;

temp_t=(temp_t&0x01);

while(temp_t!

=0x01)

{

printf("don'trecivethedatafromthetemperaturenode.\n");

temp_t=SR;

temp_t=(temp_t&0x01);

}

if(temp_t==0x01)

{

bus_check();

error_show();

can_receive(data_table);

if(data_table[1]!

=command_T)

{

printf("\n");

printf("waitingforthedatas.....\n");

flag=0;

while(!

flag)

{

tmp_datatbl[datatbl_i++]=data_table[2];

if(datatbl_i==60)

{

datatbl_i=0;

}

printf("nowthetemperatureis:

%02bd\n",T);

flag=1;

}

data_table[2]=get_tmp_succ;

can_send(data_table,0xcc);

}

}

}

get_cmd=_getkey();

if(get_cmd==speed_regulation)/*速度调节*/

{

printf("Inputthespeedyouwanttoregulate:

");

flag=0;

get_cmd=0;

while(flag==0)

{

get_cmd=_getkey();

switch(get_cmd)

{

caselevel_1:

printf("Thelevelofmotorspeedisa.\n");

get_cmd=0;

motor_speed_lev=0;

data_table[0]=motor_speed_lev;/*第0单元存储速度等级*/

data_table[1]=speed_regulation;

/*第1单元存储调节命令*/

can_send(data_table,0xbb);

/*发送调节值到电机节点*/

temp_m=SR;

temp_m=(temp_m&0x01);

while(temp_m!

=0x01)

{

temp_m=SR;

temp_m=temp_m&0x01

printf("don'trecivethedatafromthetemperaturenode.\n");

}

if(temp_m==0x01)

{

bus_check();

error_show();

can_receive(data_table);

if(data_table[1]==speed_regu_succ)

/*电机节点接收主节点信息成功*/

{

flag=1;/*速度调节结束*/

}

}

printf("Inputthecommand:

\n");

break;

caselevel_2:

printf("Thelevelofmotorspeedisb.\n");

get_cmd=0;

motor_speed_lev=1;

data_table[0]=motor_speed_lev;

data_table[1]=speed_regulation;

can_send(data_table,0xbb);

/*发送调节值到电机节点*/

temp_m=SR;

temp_m=(temp_m&0x01);

while(temp_m!

=0x01)

{

temp_m=SR;

temp_m=temp_m&0x01;

printf("don'trecivethedatafromthetemperaturenode.\n");

}

if(temp_m==0x01)

{

bus_check();

error_show();

can_receive(data_table);

if(data_table[1]==speed_regu_succ)/*电机节点接收主节点信息成功*/

{

flag=1;/*速度调节结束*/

}

}

printf("Inputthecommand:

\n");

break;

caselevel_3:

printf("Thelevelofmotorspeedisc.\n");

get_cmd=0;

motor_speed_lev=2;

data_table[0]=motor_speed_lev;

data_table[1]=speed_regulation;

can_send(data_table,0xbb);

/*发送调节值到电机节点*/

temp_m=SR;

temp_m=(temp_m&0x01);

while(temp_m!

=0x01)

{

temp_m=SR;

temp_m=temp_m&0x01;

printf("don'trecivethedatafromthetemperaturenode.\n");

}

if(temp_m==0x01)

{

bus_check();

error_show();

can_receive(data_table);

if(data_table[1]==speed_regu_succ)/*电机节点接收主节点信息成功*/

{

flag=1;/*速度调节结束*/

}

}

printf("Inputthecommand:

\n");

break;

caselevel_4:

printf("Thelevelofmotorspeedisd.\n");

get_cmd=0;

motor_speed_lev=3;

data_table[0]=motor_speed_lev;

data_table[1]=speed_regulation;

can_send(data_table,0xbb);

/*发送调节值到电机节点*/

temp_m=SR;

temp_m=(temp_m&0x01);

while(temp_m!

=0x01)

{

temp_m=SR;

temp_m=temp_m&0x01;

printf("don'trecivethedatafromthetemperaturenode.\n");

}

if(temp_m==0x01)

{

bus_check();

error_show();

can_receive(data_table);

if(data_table[1]==speed_regu_succ)/*电机节点接收主节点信息成功*/

{

flag=1;/*速度调节结束*/

}

}

printf("Inputthecommand:

\n");

break;

caselevel_5:

printf("Thelevelofmotorspeedise.\n");

get_cmd=0;

motor_speed_lev=4;

data_table[0]=motor_speed_lev;

data_table[1]=speed_regulation;

can_send(data_table,0xbb);

/*发送调节值到电机节点*/

temp_m=SR;

temp_m=(temp_m&0x01);

while(temp_m!

=0x01)

{

temp_m=SR;

temp_m=temp_m&0x01;

printf("don'trecivethedatafromthetemperaturenode.\n");

}

if(temp_m==0x01)

{

bus_check();

error_show();

can_receive(data_table);

if(data_table[1]==speed_regu_succ)/*电机节点接收主节点信息成功*/

{

flag=1;/*速度调节结束*/

}

}

printf("Inputthecommand:

\n");

break;

caselevel_6:

printf("Thelevelofmotorspeedisf.\n");

get_cmd=0;

motor_speed_lev=5;

data_table[0]=motor_speed_lev;

data_table[1]=speed_regulation;

can_send(data_table,0xbb);

/*发送调节值到电机节点*/

temp_m=SR;

temp_m=(temp_m&0x01);

while(temp_m!

=0x01)

{

temp_m=SR;

temp_m=temp_m&0x01;

printf("don'trecivethedatafromthetemperaturenode.\n");

}

if(temp_m==0x01)

{

bus_check();

error_show();

can_receive(data_table);

if(data_table[1]==speed_regu_succ)/*电机节点接收主节点信息成功*/

{

flag=1;/*速度调节结束*/

}

}

printf("Inputthecommand:

\n");

break;

}

}

}

if(get_cmd==get_speed)/*获取速度值*/

{

get_cmd=0;

data_table[1]=get_speed;

can_send(data_table,0xbb);

temp_m=SR;

temp_m=(temp_m&0x01);

while(temp_m!

=0x01)

{

temp_m=SR;

temp_m=temp_m&0x01;

printf("don'trecivethedatafromthetemperaturenode.\n");

}

if(temp_m==0x01)

{

bus_check();

error_show();

can_receive(data_table);

motor_speed=(uint)data_table[0];

/*电机节点将速度存储到数组第0单元*/

printf("Nowthemotorspeedis:

%04bd",motor_speed);

}

}

}

}

voidtimer0(void)interrupt1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

time++;

}

2、直流电机节点

#include

#include

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

#definespeed_regulation's'//速度调节命令

#definespeed_regu_succ'k'//速度调节成功

#defineget_speed'g'//获取电机转速

 

voidcan_init(ucharID);

voidcan_send(uchar*send_table,ucharID);

ucharbus_check();

ucharcan_receive(uchar*receive_can);

voiderror_show();

//voiddelay_ms(uintz);

voidmotor_regu(ucharnum);

uintmotorspeed(void);

bitflag;

ucharget_cmd;

uchardata_table[8];

ucharread_data_table;

voidmain()

{

ucharread_SR;

Printf51_Init();

can_init(0xbb);

printf("Allisinitializedsuccessfully!

!

!

\n");

while

(1)

{

get_cmd=0;

read_SR=SR;

read_SR=(read_SR&0x01);

while(read_SR!

=0x01)

{

printf("Therearenodatasinthebuffer!

\n");

read_SR=SR;

read_SR=(read_SR&0x01);

}

if(read_SR==0x01)

{

bus_check();

//主节点发送信号,进入步进电机节点总线检测以确定是否能接收信号

error_show();//总线错误显示

can_receive(data_table);//开始接收主节点信号

get_cmd=data_table[1];

//先读取命令,判断是调节速度还是获取速度

if(get_cmd==speed_regulation)

{

get_cmd=0;

read_data_table=data_table[0];

motor_regu(read_data_table);

data_table[1]=speed_regu_succ;

can_send(data_table,0xaa);

}

if(get_cmd==get_speed)

{

get_cmd=0;

data_table[0]=motorspeed();

can_send(data_table,0xaa);

}

}

}

}

3、温度节点

#include

#include

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

#definecommand_T't'//收到从主节点发送的命令

#defineget_tmp_succ'v'//主节点告知获取温度数据成功

voidcan_init(ucharID);

voidcan_send(uchar*send_table,ucharID);

ucharbus_check();

ucharcan_receive(uchar*receive_can);

voiderror_show();

uchartemperature();

voidPrintf51_Init();

voiddelay(uintz);

bitflag;

uchardata_table[8];

voidmain()

{

ucharread_SR;

Printf51_Init();

can_init(0xcc);//温度节点ID

while

(1)

{

//number=0;

read_SR=SR;

read_SR=(read_SR&0x01);

while(read_SR!

=0x01)

{

printf("Therearenodatasinthebuffer!

\n");

//delay(2000);

read_SR=SR;

read_SR=(read_SR&0x01);

}

if(read_SR==0x01)

{

bus_check();//检测温度节点总线是否正常

error_show();//总线错误显示

can_receive(data_table);//接收主节点发送的信号

//number=data_table[1];//读取接收到的信号

if(data_table[2]==command_T)//如果读取的信号确实是由主节点发送的,进入下一步处理

{

printf("sendthetemperaturevalue......\n");

fla

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2