历史上的今天
今天是:2024年11月09日(星期六)
2019年11月09日 | dsPIC30F6014 CAN总线发送功能+DS18B20温度采集
2019-11-09 来源:51hei
1。DS18B20定时采集温度
2。温度采集时间间隔用T1定时器控制
3。采集到的温度通过CAN总线送另一主机处理
#include _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; //定时器初值
史海拾趣
|
我现在有一个西门子模块的GPRS彩信猫。我需要接受送来的彩信。哪么。。。。我用AT+CMGR可以读短信。。。短信里有URL,接下来应该怎么做才能下载彩信的图片呢… 查看全部问答> |
|
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执行、有些人对软件基本上就是拿来就用,但确无法理解梯形图的真正含义、其中有一个最让我哭笑不得的学员,为了PWM k10 k10 Y00的指令,把东莞市 ...… 查看全部问答> |
|
俺用的是STM32F103VB,72MHz运行。USART2,半双工通讯,DMA发送,中断接收。在速率为19200、115200时一切正常。 但是项目要求速率达到0.5Mbps,更改波特率设置(用的是FWLib)后,通讯无法进行。示波器查出发送正确。我在接收中断函数 入口 ...… 查看全部问答> |
|
各位兄台,小弟初学嵌入式,老师给一题目,要在LPC2138用si443做一个无线收发模块,驱动自己编写。对于本菜鸟实在是难,所以在此向各位高手请教,望予以支持,小弟没齿难忘。… 查看全部问答> |
|
最好的电池知识及标准相关资料----高清版扫描+14册pdf 你对电池了解多少? 什么叫电池?什么叫电池的内阻?为什么要规定电池的放电终止电压?镉-镍和氢镍电池研究和生产中,常用的充电或放电方法是哪种?为什么密封电池要严格禁止过放电?锂电池有哪些种类?锂离子电池在使用注意过程中有哪些注意事项? ...… 查看全部问答> |
|
TI MSP430系列单片机,usart模块的波特率值设定是通过以下三个寄存器决定的:UxBR0,UxBR1,UxMCTL 波特率=BRCLK/N ,主要是计算出N。 BRCLK:时钟源,可以通过寄存器设定何为时钟源; 通过寄存器UCAxCTL1的SSEL两位选择,01:ACLK,02:SMCLKN:波特率 ...… 查看全部问答> |




