历史上的今天
返回首页

历史上的今天

今天是:2024年11月09日(星期六)

正在发生

2019年11月09日 | dsPIC30F6014 CAN总线发送功能+DS18B20温度采集

2019-11-09 来源:51hei

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;                     //定时器初值

推荐阅读

史海拾趣

GE Sensing ( Amphenol Advanced Sensors )公司的发展小趣事

对于4h的交流电源定时器(555,BH4024)电路,网友可能会提出一系列问题。以下是一些常见问题及其详细回答:

1. 电路的基本工作原理是什么?

回答:该电路结合了555定时器(作为时基电路)和BH4024(7级二进制串行计数器/分频器)来实现4小时的定时功能。555定时器用于产生定时信号,而BH4024则负责将定时信号转换成所需的时间间隔。每当按下AN(定时触动按钮)时,电路开始计时,并在4小时后自动切断交流电源。

2. 如何调整定时时间?

回答:直接调整4小时的定时时间可能不直接通过电路中的元件实现,因为定时时间主要由BH4024的分频特性和555定时器的振荡频率决定。然而,可以通过改变555定时器的外部电阻和电容值来调整其振荡频率,但这通常会影响整个电路的定时精度和稳定性。对于精确调整至4小时,可能需要使用微控制器或其他可编程逻辑设备来替代或辅助BH4024和555定时器。

3. 电路中的555定时器具体起到什么作用?

回答:在这个电路中,555定时器作为时基电路,负责产生稳定的振荡信号。这个振荡信号的频率和占空比可以通过调整与555定时器相连的电阻和电容值来改变。然而,在这个特定的应用中,555定时器的输出信号通常被用作BH4024的输入信号,以便控制BH4024的计数和分频过程。

4. BH4024是如何实现定时功能的?

回答:BH4024是一个7级二进制串行计数器/分频器,它能够根据输入的时钟信号进行计数,并在达到预定次数后输出一个翻转信号。在这个电路中,BH4024的计数频率由555定时器的输出信号决定。当计数器达到某个预设值时(这个值决定了4小时的定时长度),BH4024会输出一个信号来切断交流电源。

5. 电路中的电源要求是什么?

回答:电路中的电源要求取决于所使用的555定时器和BH4024的具体型号以及电路中的其他元件。通常情况下,555定时器可以在较宽的电源电压范围内工作(如4.5V至16V),但具体值应参考器件的数据手册。对于BH4024和其他元件,也应遵循类似的电源要求。此外,由于该电路涉及交流电源的控制,因此还需要注意电路的安全性和稳定性问题。

6. 如何确保电路的可靠性和安全性?

回答:为了确保电路的可靠性和安全性,需要采取以下措施:

  • 选择质量可靠的元件和器件,并按照正确的规格和参数进行连接。
  • 在电路设计中考虑适当的保护措施,如过流保护、过压保护等。
  • 在实际使用中,注意避免电路受到外部干扰和损坏。
  • 定期对电路进行检查和维护,以确保其正常运行和延长使用寿命。

7. 电路有哪些潜在的应用场景?

回答:该电路具有广泛的应用场景,包括但不限于:

  • 家庭自动化系统中的定时开关功能。
  • 工业生产线上的自动断电和重启功能。
  • 实验室和测试设备中的定时控制功能。
  • 公共场所的自动照明和节能控制功能等。

总之,对于4h的交流电源定时器(555,BH4024)电路,网友可能会关注其工作原理、定时时间调整、元件作用、电源要求、可靠性和安全性以及潜在应用场景等方面的问题。以上回答旨在提供全面的信息和指导。

Embedded Planet公司的发展小趣事

Embedded Planet公司始终关注社会责任的履行。公司积极参与公益事业和慈善活动,为社会做出了积极贡献。例如,公司捐赠了一批嵌入式系统设备给偏远地区的学校和教育机构,帮助他们改善教学条件和提高教育质量。此外,公司还积极参与环保和扶贫等公益活动,用实际行动践行企业的社会责任。

请注意,以上故事仅为示例,并非真实发生的事件。如果您需要更详细和具体的信息,建议您查阅Embedded Planet公司的官方网站或相关新闻报道。

Advanced Photonix公司的发展小趣事

随着产品的不断成熟和市场的日益扩大,Advanced Photonix开始寻求与全球分销商的合作。在经过一番谨慎的筛选和谈判后,公司与全球知名的半导体和电子元器件授权分销商贸泽电子签订了全球分销协议。这一合作使得Advanced Photonix的产品能够更快地进入全球市场,同时也提高了公司的知名度和影响力。通过贸泽电子的分销网络,Advanced Photonix的光电二极管、混合器件以及光电管等产品得到了广泛应用,进一步巩固了公司在电子行业的领先地位。

Hong Kong X'Tals Ltd公司的发展小趣事
选择合适的电阻和电容,以确保定时精度和电路稳定性。同时,注意元件的温漂和老化对定时时间的影响。
鞍山圣罗佳(ASL)公司的发展小趣事
在高负载或长时间工作的情况下,需要关注LM122的散热问题,以避免过热导致性能下降或损坏。
格瑞宝(GP)公司的发展小趣事

随着产品线的拓展和技术实力的增强,格瑞宝开始积极拓展国内外市场。公司不仅在消费电子和工业类电子领域取得了显著成绩,还努力将产品和服务拓展到通信、汽车电子等新兴领域。同时,格瑞宝注重品牌建设,通过提供优质的产品和服务,赢得了广大客户的信赖和好评。公司的品牌知名度和影响力不断提升,为公司的长远发展奠定了良好基础。

问答坊 | AI 解惑

彩信猫 接受彩信问题

我现在有一个西门子模块的GPRS彩信猫。我需要接受送来的彩信。哪么。。。。我用AT+CMGR可以读短信。。。短信里有URL,接下来应该怎么做才能下载彩信的图片呢…

查看全部问答>

嵌入式系统都是RISC的cpu架构吗

嵌入式系统都是RISC的cpu架构吗?本人是外行…

查看全部问答>

如何把标准linux内核改成arm下用的linux内核

arm上运行的Linux内核与http://www.kernel.org上发布的内核有啥关系?翻阅了一天的资料,云里雾里的。基本是以下几种说法: (1):arm linux = Linux + arm补丁(http://www.arm.linux.org.uk/developer) (2):通过skyeye来移植 (3):用已有的arm lin ...…

查看全部问答>

《PLC零基础自学入门》

众多学员反应,在自学PLC的过程中,有些人能在纸上画梯形图但无法输入电脑送进PLC执行、有些人对软件基本上就是拿来就用,但确无法理解梯形图的真正含义、其中有一个最让我哭笑不得的学员,为了PWM k10 k10 Y00的指令,把东莞市 ...…

查看全部问答>

求教STM32USART高速通讯的怪问题

俺用的是STM32F103VB,72MHz运行。USART2,半双工通讯,DMA发送,中断接收。在速率为19200、115200时一切正常。 但是项目要求速率达到0.5Mbps,更改波特率设置(用的是FWLib)后,通讯无法进行。示波器查出发送正确。我在接收中断函数 入口 ...…

查看全部问答>

LPC2138用si4432做一个无线收发模块

各位兄台,小弟初学嵌入式,老师给一题目,要在LPC2138用si443做一个无线收发模块,驱动自己编写。对于本菜鸟实在是难,所以在此向各位高手请教,望予以支持,小弟没齿难忘。…

查看全部问答>

求在KEIL环境下LM3S811上移植UCOSii的工程和截图

为了本科毕业设计,弄得我焦头烂额。望好心人帮帮我。QQ:77031446…

查看全部问答>

最好的电池知识及标准相关资料----高清版扫描+14册pdf

你对电池了解多少? 什么叫电池?什么叫电池的内阻?为什么要规定电池的放电终止电压?镉-镍和氢镍电池研究和生产中,常用的充电或放电方法是哪种?为什么密封电池要严格禁止过放电?锂电池有哪些种类?锂离子电池在使用注意过程中有哪些注意事项? ...…

查看全部问答>

shiyongzhu创意进度帖 无感无刷直流电机电调设计

先发个贴,占个位置!请问管理员此贴是否满足要求?…

查看全部问答>

TI MSP430系列单片机串口通信波特率计算方法

TI MSP430系列单片机,usart模块的波特率值设定是通过以下三个寄存器决定的:UxBR0,UxBR1,UxMCTL 波特率=BRCLK/N ,主要是计算出N。 BRCLK:时钟源,可以通过寄存器设定何为时钟源; 通过寄存器UCAxCTL1的SSEL两位选择,01:ACLK,02:SMCLKN:波特率 ...…

查看全部问答>