dsPIC30F6014 CAN总线发送功能+DS18B20温度采集

发布者:TranquilWhisper最新更新时间:2019-11-09 来源: 51hei关键字:dsPIC30F6014  CAN总线  发送功能  DS18B20  温度采集 手机看文章 扫描二维码
随时随地手机看文章

1。DS18B20定时采集温度

2。温度采集时间间隔用T1定时器控制

3。采集到的温度通过CAN总线送另一主机处理

#include             //dsPIC30F6014标准头文件

  _FOSC(0x0ffe5);                 //4倍频晶振,Failsafe 时钟关闭

  _FWDT(WDT_OFF);                 //关闭看门狗定时器

  _FBORPOR(PBOR_OFF & MCLR_EN);   //掉电复位禁止,MCLR复位使能。

  _FGS(CODE_PROT_OFF);            //代码保护禁止

unsigned long int i = 0;

#define  uch unsigned char                     //给unsigned char起别名 uch

# define DQ PORTFbits.RF6                      //定义18B20数据端口 

# define DQ_DIR TRISFbits.TRISF6               //定义18B20D口方向寄存器 

# define DQ_HIGH() DQ_DIR =1                   //设置数据口为输入

# define DQ_LOW() DQ = 0; DQ_DIR = 0           //设置数据口为输出

#define rs LATBbits.LATB4          //定义LCD控制位(注意这里只能用LATB寄存器,不能直接用PORTB寄存器)

#define rw LATBbits.LATB5

#define e  LATBbits.LATB6

                        

unsigned char __attribute__((address(0x900))) TLV;   //采集到的温度高8位

unsigned char __attribute__((address(0x902))) THV;   //采集到的温度低8位

unsigned char __attribute__((address(0x904))) TZ;    //转换后的温度值整数部分

unsigned char __attribute__((address(0x906))) TX;    //转换后的温度值小数部分

unsigned int  __attribute__((address(0x908))) wd;    //转换后的温度值BCD码形式

unsigned char __attribute__((address(0x9a0))) loop;  //LCD显示次数计数器

//**********************CAN总线初始化*************************

void initcan()

{

    C1CTRLbits.REQOP = 0x4; //请求进入配置模式

    while (C1CTRLbits.OPMODE!=0x4){}  //确认进入配置模式

    C1TX0CON = 0x0003;      //发送0邮箱配置

    C1TX0SID = 0x0020;      //发送0标准标识符,11位

    C1TX0DLC = 0x01c0;      //发送0数据长度,8字节

    C1RX0CON = 0x0000;      //接收0邮箱配置

    C1RX0DLC = 0x0008;      //接收0数据长度,8字节

    C1RXF0SID = 0x0020;     //接收滤波器0标准标识符,11位

    C1RXM0SID = 0xffff;     //接收屏蔽0标准标识符 

   C1CFG1bits.SJW=0;  //SJW=1 x TQ 

   C1CFG1bits.BRP = 9;      //125K  

   C1CFG2 = 0x03Ac;         //SEG2PH=5;SEG1PH=6;PRSEG=4

    C1CTRLbits.REQOP = 0x0; //请求进入正常模式

    while (C1CTRLbits.OPMODE!=0x0){}  //确认进入正常模式

return;

}      


//**********************延时函数**************************

//延时函数(延时时间为(2+x)us)

void delay(  char x) 

{

   unsigned char i;

   for(i=0;i}

//********************系统初始化函数**********************

void init()

{

  TRISF=0X0000;                                 //先设置18B20口方向为输出

  TRISB=0X0000;                                 //设置B口方向为输出

  TRISD=0X0000;                                 //设置D口方向为输出

  IFS0bits.T1IF=0;                              //先清除定时器中断标志位

  PR1=0XFFFF;                                   //周期定最大

  T1CON=0X0020;                                 //分频比为1:64

  INTCON1=0x0000; 

  INTCON2=0x0000;                             //关闭所有中断  

}


//******************复位DS18B20函数*****************************

//主控制器(dsPIC30F6014A)先拉低总线480us,然后释放总线回到高电平

//18B20检测到上升沿后先等待15-60us,然后拉低总线做为复位的应答信号

//主控制器释放总线后到复位结束时间应为480US

reset(void)

{

  char presence=1;

  while(presence)

  { 

    DQ_LOW() ;                                //主机拉至低电平

    delay(100);                         

    delay(100);   

    delay(100);   

    delay(100);

    delay(78);                                //以上5条共延时480us

    DQ_HIGH();                                //释放总线等电阻拉高总线,并保持15~60us

    delay(38);                                //延时40us        

    if(DQ==1) presence=1;                     //没有接收到应答信号,继续复位

    else presence=0;                          //接收到应答信号

    delay(100);                         

    delay(100);   

    delay(100);   

    delay(100);

    delay(38);                                //以上5条共延时440us

   }

  }

//****************写18b20写字节函数*****************************

//主控制器写数据1:先把总线拉低,然后在15us内释放总线

//主控制器写数据0:把总线拉低至少60us

//写一位数据至少需要60us

//两位数据之间至少延时1us

void write_byte(uch val)

{

uch i;

uch temp;

for(i=8;i>0;i--)

{

   temp=val&0x01;                            //最低位移出

   DQ_LOW(); 

   delay(3);                                 //保持拉低5us

   if(temp==1)  DQ_HIGH();                   //如果写1,拉高电平

   delay(58);                                //延时60us

   DQ_HIGH(); 

   delay(1);                                 //在两位之间插入3us延时

   val=val>>1;                               //右移一位

  }

}

//****************18b20读字节函数********************************

//主控制器把总线拉低至少1US,然后释放

//主控制器读数据1:18B20保持总线状态不变

//主控制器读数据0:18B20检测到总线拉低后继续拉低总线至少60ms

//主控制器在拉低总线后的15us读取总线上的状态

//读取1位数据至少需要60us

uch read_byte(void)

{

uch i;

uch value=0;                                //读出温度

for(i=8;i>0;i--)

{

   value>>=1; 

   DQ_LOW();

   delay(1);                                //保持总线拉低3us

   DQ_HIGH();                               //拉至高电平

   delay(5);                                //释放总线后保持7us再读取数据

   if(DQ) value|=0x80;

   delay(48);                               //延时50us,保证每1位的60us延时

  }

  return(value);

}

//*****************启动温度转换函数***************************

void get_temp()

int i;

DQ_HIGH();                               

reset();                                 //复位等待从机应答 

write_byte(0XCC);                        //忽略ROM匹配 

write_byte(0X44);                        //发送温度转化命令  

for(i=0;i<8;i++)

    {

        

      delay(98);                         //确保温度转换完成所需要的时间

    }

reset();                                 //再次复位,等待从机应答 

write_byte(0XCC);                        //忽略ROM匹配 

write_byte(0XBE);                        //发送读温度命令 

TLV=read_byte();                         //读出温度低8 

THV=read_byte();                         //读出温度高8位 

DQ_HIGH();                               //释放总线 

TZ=(TLV>>4)|(THV<<4)&0X3f;               //温度整数部分

TX=TLV<<4;                               //温度小数部分

}

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

int main(void)

{

   init();                              //调用系统初始化函数

   initcan();

   LATDbits.LATD0=1;

   LATDbits.LATD1=0;

   while(1)

     { 

       TMR1=0XC2F6;                     //定时器初值

[1] [2]
关键字:dsPIC30F6014  CAN总线  发送功能  DS18B20  温度采集 引用地址:dsPIC30F6014 CAN总线发送功能+DS18B20温度采集

上一篇:PIC 16f877a PORTB State Change Interrupt仿真与源码
下一篇:PIC单片机驱动LCD12864显示字符源代码

推荐阅读最新更新时间:2024-11-19 20:59

基于STM32+ucos-II+DS18B20调试成功
前几天调试了一下DS18B20的程序,起初系统在裸奔的时候DS18B20可以很正常的读取数据。由于项目前期设计时添加了ucos实时操作系统。原以为把裸奔的程序移植过来就可以使用。结果悲剧发生了 如果做过这方面的朋友一定知道。添加后,你会发现系统不跑了,彻底的死掉了。原因在何处?经过一整天的查找,发现原来系统的时间片被占用了。导致ucos的ticks出现异常。 解决办法:一种方法是:修改OS_CPU_SysTickInit(void)函数,与delay函数进行兼容。在温度传感器延时的时候不影响操作系统的tick运行。这样就可以解决问题了。 还有一种方法就是,把18B20的延时定时器更换成TIM3或者是其他定时器。和系统的tick分开
[单片机]
基于SAE J1939协议的发动机总线数据模拟器开发
在车载网络的开发过程中,需要发动机节点向总线网络发送报文,为了降低成本,提高开发效率,模拟发动机。基于SAE J1939协议巾车辆应用层子标准及应用层诊断子标准,通过软件编程进行发动机总线数据模拟器的开发,模拟总线网络中的发动机ECU节点,向总线网络发送报文,从而测试总线网络上的另一节点仪表,检验仪表是否工作正常。 1 SAE J1939协议概述 SAE J1939标准是美国汽车工程师协会(SAE)发布的以CAN总线为核心的车辆网络串行通讯和控制协议,采用多路复用技术为车辆上各传感器、执行器和控制器提供在CAN总线基础上的标准化高速网络连接,在车辆电子装置之间实现高速数据共享,有效减少电子线束的数量,提高车辆电子控制系
[工业控制]
CAN总线技术在矿井安全生产监控系统中的应用
        我国的矿井安全生产监控系统经历了从无到 有,从简到繁,从一体机到网络化,从二级网络 到多级网络的综合监控的过程。经过十几年的应 用表明,矿井安全生产监控系统为我国煤矿安全生产和现代化管理起到了显著作用。但是,由于现有的监控系统几乎都采用各自专用的通信协议, 所以,很难找到两个相互兼容的系统。目前,信息传输系统的兼容性已成为装备监控系统的各局、 矿进一步扩充系统功能的制约因素。因此,寻找 一种解决系统兼容性问题的途径,对促进矿井监 控技术的发展和系统的推广应用均具有十分重要 的意义。         矿井安全生产监控系统中采用通信协议的现状         通信协议是在网络中用于规定信息的格式以 及信息如何发送和接收的
[嵌入式]
没听过这个,都不好意思说自己做过CAN总线开发!
CAN总线网络中,若其中一个节点出现硬件或者软件上的错误,很可能导致总线电平持续保持在显性状态,总线上所有节点均不能正常通信。在节点设计时,应该如何通过硬件手段避免这一问题发生? 总线值 CAN总线上的数据采用不归零编码方式,可具有两种互补的逻辑值之一:“显性”或“隐性”。“显性”位和“隐性”位同时传送时,总线的结果值为“显性”。比如,在执行总线的“线与”时,逻辑 0 代表“显性”,逻辑1 代表“隐性”。 CAN总线节点的基本组成如图1所示,当MCU的TXD引脚输出0时,总线电平为显性,若输出1,总线电平则为隐性。 图1 CAN节点基本组成示意图 TXD 显性超时 由于CAN总线显性电平的“支配地位”,在C
[嵌入式]
PIC入门6,DS18B20测温度
程序如下: //PIC C DS18B20测温,LCD显示.c 时间:2008-8-20 //适合3ePIC实验板 //C语言写的温度计,DS18B20测温,LCD显示,显示到0.1度 //USING 16F877 READ MAXIM DS18b20 AND DISPLAY ON LCD1602 */ #include pic.h //连线说明 #define LCDRS RB1 #define LCDRW RB2 #define LCDE RB3 #define LCDDATA PORTD #define DSDQ RB0 /* 连接ds18b20 */ #define TRISDQ TRISB0 //函数定义
[单片机]
CAN总线技术在汽车电子的应用与实现研究
1 汽车电子与CAN总线 随着汽车电子技术的不断发展,汽车上各种电子控制单元的数目不断增加,连接导线显著增加,因而提高控制单元间通讯可靠性和降低导线成本已成为迫切需要解决的问题。为此以研发和生产汽车电子产品著称的德国BOSCH公司开发了CAN总线协议,并使其成为国际标准(ISO11898)。1989年,Intel公司率先开发出CAN总线协议控制器芯片,到目前为止,世界上已经拥有20多家CAN总线控制器芯片生产商,110多种CAN总线协议控制器芯片和集成CAN总线协议控制器的微处理器芯片。在北美和西欧,CAN总线协议已经成为汽车计算机控制系统和嵌入式工业控制局域网的标准总线,并且拥有以CAN为底层协议专为大型货车和重工机械
[汽车电子]
CAN总线与以太网嵌入式网关电路设计的两种方法对比分析
本文从以太网与工业现场总线的互联出发,主要介绍了CAN总线与以太网嵌入式网关电路的设计与实现,本文对比了CAN 和以太网相连的嵌入式网关设计的两种方法,并从硬件结构和软件结构两方面进行了阐述。 目前,对于CAN 和以太网相连的嵌入式网关设计主要有两种方法:一种是低档MCU 加接口芯片的设计方法,另一种是高档MCU 加EOS(实时多任务操作系统)再加接口芯片的设计方法。因CAN 只采用了ISO/OSI 参考模型的一、二层,协议相对简单,比较适合用于低成本、速率要求不高的离散控制系统。从合理的成本和有效利用处理能力这两方面考虑,该设计采用低档MCU 加接口芯片的方法,其硬件框图见图。 图1 主控芯片及以太网接口模块 根据要求,
[单片机]
<font color='red'>CAN总线</font>与以太网嵌入式网关电路设计的两种方法对比分析
CAN总线扩充器MCP25050
摘要:介绍了MicroChip公司生产的CAN总线I/O扩充器MCP25050的主要特点、内部结构、引脚定义及工作原理,给出了用MCP25050扩充CAN节点的典型应用电路原理图。 关键词:CAN总线 扩充器 MCP25050 1 概述 MicroChip公司生产的CAN(Controller Area Net-work)总线I/O扩充器MCP25050,可用于在CAN总线系统中扩充CAN总线节点,它可以独立构成一个CAN节点而不需要再加微控制器。该器件采用14脚小型封装和低功耗CMOS工艺技术,可在2.7~5.5V电压范围内正常工作。它能够支持的CAN2.0B标准位速率可达1Mbit/s;NCP25050内含一个可编程的屏
[传感技术]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved