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

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);

[1] [2]
关键字:dsPIC30F6014  CAN总线  发送功能  DS18B20  温度采集 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic479503.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

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

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

dsPIC30F6015控制AD7715程序源码 亲测可用
这是我写的dsPIC30F6015控制AD7715程序,亲测可用单片机源程序如下:#include <p30f6015.h>_FOSC(CSW_FSCM_OFF & XT_PLL4);_FWDT(WDT_OFF);#define uchar unsigned char#define uint unsigned int  #define CS_A          LATCbits.LATC13 //RC13输出#define DRDY                
发表于 2019-11-11
dsPIC33F串口通讯中断接收发送数据UART
/* 功能描述: 串行通讯程序,DSP中断收到8个数据后,将收到的8个数 据以中断发送方式返送回发送方。 * */ #include "p30f6014.h" //ds30f6014头文件 unsigned int receive[8]; // 接收数据数组 unsigned int send[8]; // 发送数据数组 unsigned int receive_count=0; // 接收数据个数计数 unsigned int send_count=0; // 发送数据个数计数 unsigned int *pointer; // 发送指针
发表于 2016-06-14
基于dsPIC30F的脉冲氙灯驱动系统
脉冲氙灯的驱动系统。本文设计了满足脉冲氙灯工作时的起辉、预燃和高压放电三个阶段的驱动系统。脉冲氙灯驱动系统采用Microchip dsPIC30F为主控芯片。该芯片是一款将单片机与DSP技术相结合的高性能16位数字信号控制器,综合了单片机(MCU)的控制功能和集成了多种外设的优点,以及数字信号处理器(DSP)的计算能力和数据处理吞吐能力[2]。此外,它在异常事件处理,软件开发环境等方面也表现出强大的性能[3]。由于dsPIC30F芯片的内部资源丰富,基于dsPIC30F平台开发的脉冲氙灯驱动系统需要的外设很少,不但系统的抗干扰性和可靠性能够满足脉冲氙灯在各种环境下运行的要求,而且可以提高系统的灵活性,缩短开发时间,降低开发
发表于 2014-11-20
基于dsPIC30F的脉冲氙灯驱动系统
基于CAN的远程下载技术开发及应用
极少的存储空间,可以位于单片机程序存储器特定的Boot Segment 区域。程序存储器还有一段称为General Segment 区域可用于存储用户应用程序。单片机的程序存储器大多都是FLASH 闪存,数据是以一个个数据页的形式存储,必须先对当前存储页擦除,然后才能写入数据。自举程序还需使用dsPIC33 单片机器件中断向量表 (IVT) 中的复位向量实现程序的跳转、以及器件上的CAN 通信模块。单片机的程序存储器的地址映射如下图4 所示。dsPIC33F 程序存储器地址映射图图 4 dsPIC33F 程序存储器地址映射图上图给出了dsPIC33 单片机器件的程序存储器的物理地址映射,由图可知用户应用代码应放置在用户应用程序地址段
发表于 2014-11-03
基于CAN的远程下载技术开发及应用
dsPIC3F3013的CAN总线数据采集系统
构成:控制部分,包括前端信号的抗混叠滤波器和用于信号采集的12位模数转换器;CAN总线接口电路部分,由MCP2515 CAN协议控制器和MCP2551高速CAN收发器构成。系统接3路信号,TEM、PRE、RH分别为温度、气压、相对湿度。   1.1 控制部分   dsPIC30F3013是Microchip公司生产的传感器系列数字信号控制器。该控制器采用16位(数据)改良的哈佛结构,并带有增强型指令集,包含对DSP的有力支持。工作速度最高可达30MIPS,内部集成10通道12位模数转换器,最大转换速度为200 ksps。   工控系统中,由于各类噪声的存在,需要在信号采集端加上抗混叠滤波电路,如图2所示。  
发表于 2014-10-22
dsPIC3F3013的CAN总线数据采集系统
基于ERTOS的CAN总线驱动设计
;INT16U OSQSize; /* 消息队列中总的单元数*/ INT16U OSQEntries; /*消息队列中总的消息数量*/ } OS_Q; 图 2 为消息队列信息流的演示说明。 ① CanSendMessageProcess 任务完成信息的计算工作以后,将要发送的信息送进消息队列 1。 ② CanSendMessage 任务负责取得消息队列 1 里面的信息。 ③ 通过 CAN 总线 I/O 端口将数据发送到总线上去。如果消息队列中没有信息,则该任务由运行状态进入等待状态,直到从消息队列中接收到信息为止。 ④ CanReceiveMessage 任务负责
发表于 2019-11-14
基于ERTOS的CAN总线驱动设计
小广播
何立民专栏 单片机及嵌入式宝典

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

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