arm力天电子 lpc2148 基于DS18b20的温度采集实验程序详解

2019-05-20来源: eefocus关键字:arm  lpc2148  DS18b20  温度采集

1#include

2#include

3#include "uart.h"


//系统时钟

4#define Fosc        12000000UL        //晶振时钟 【Hz】

5#define Fcclk       (Fosc * 5)        //系统频率,必须为Fosc的整数倍(1~32),且<=60MHZ

6#define Fcco     (Fcclk * 4)     //CCO频率,必须为Fcclk的2、4、8、16倍,范围为156MHz~320MHz

7#define Fpclk       (Fcclk / 4) * 4   // VPB时钟频率,只能为(Fcclk / 4)的1 ~ 4倍


//接口声明

8#define DS_OUT() IO0DIR_bit.P0_19 = 1   //设置为输出

9#define DS_IN() IO0DIR_bit.P0_19 = 0    //设置为输入

10#define DS_L() IO0CLR_bit.P0_19 = 1     //端口底电平

11#define DS_H() IO0SET_bit.P0_19 = 1     //端口高电平

12#define DS_R() IO0PIN_bit.P0_19         //读入端口数据


//函数声明

13void PLL_Init(void);

14void Tmp_Change(void);

15void Delayn(unsigned long n);

16void DelaynUs(unsigned int n);

17float tmp(void);

18void DS_Reset(void);


//主函数

19void main(void)

20{

21  char buf[100];

22  float a;

 23 PLL_Init();   //初始化系统时钟

24  InitUart0();  //初始化串口

  

25  PINSEL1_bit.P0_19 = 0;//初始化端口 

 26 DS_IN();

  

  //定时器1初始化,产生定时基准

27  T1IR = 0xFF;                 // reset match and capture event interrupts

28  T1TC = 0;                      // Clear timer counter

29  T1PR = 0;                      // 0 Prescalar

30  T1TCR=0x00000003; //T0PC和T0TC复位(有误,跟T0啥关系呢)

31  T1TCR=0x00000001; //使能

  

32  while(1){

33    Tmp_Change();       //数据开始转换     

34    DelaynUs(1000);     //延时等待1000微秒,即1ms

35    a=tmp();                    //读取数据

    

    //输出转换结果

36    sprintf(buf,"The current temperature is %.1f.n",a);

37    sendStr(buf);

    

38    DelaynUs(1000000);     //等待1s 

39  }

40}



//PLL初始化

41void PLL_Init(void)

42{

    /* 设置系统各部分时钟 */

43       PLLCON = 1;

 44   #if ((Fcclk / 4) / Fpclk) == 1

45            VPBDIV = 0;

46    #endif

47    #if ((Fcclk / 4) / Fpclk) == 2

48            VPBDIV = 2;

49    #endif

50    #if ((Fcclk / 4) / Fpclk) == 4

51            VPBDIV = 1;

52    #endif

53    #if (Fcco / Fcclk) == 2

 54           PLLCFG = ((Fcclk / Fosc) - 1) | (0 << 5);

 55   #endif

 56   #if (Fcco / Fcclk) == 4

57            PLLCFG = ((Fcclk / Fosc) - 1) | (1 << 5);

58    #endif

59    #if (Fcco / Fcclk) == 8

60            PLLCFG = ((Fcclk / Fosc) - 1) | (2 << 5);

61    #endif

62    #if (Fcco / Fcclk) == 16

63            PLLCFG = ((Fcclk / Fosc) - 1) | (3 << 5);

64    #endif

65            PLLFEED = 0xaa;                                   //发送PLL馈送序列,执行设定PLL的动作

 66           PLLFEED = 0x55;

67            while((PLLSTAT & (1 << 10)) == 0);   //等待PLL锁定

68            PLLCON = 3;                                          //设置激活并连接PLL

69            PLLFEED = 0xaa;                                 //发送PLL馈送序列,执行激活和连接动作

70            PLLFEED = 0x55; 



// Memory map init flash memory is maped on 0 address

71  MEMMAP_bit.MAP = 1;

72}



//复位(参考资料见DS18B20中文资料P7-10及DS18B20幻灯片)

73void DS_Reset(void)       //send reset and initialization command

74{

75  DS_OUT();                                     //(端口设置为输出)

76  DS_L();                                           //DS=0,主机发送一个端口低电平

77  DelaynUs(800);                             //800us,           

 78 DS_IN();                                         //input,(端口设置为输入)

79  DelaynUs(100);                            //100us

80  /*if(DS_R()!=0)

81    sendStr("There are no 18B20 !n");

82  else

83    sendStr("Init 18B20 succeed!n");*/

84  while(DS_R()==0);                        //等待低电平过去

85}


//读一位数据

86unsigned char tmpreadbit(void)       //read a bit

87{

 88  unsigned char dat; 

89   DS_OUT();                              //端口设置为输出

90   DS_L();                                   //DS=0

 91  //Delayn(1);                            //2uS

92   DS_IN();                                 //input

 93  //Delayn(1);

 94  if(DS_R()!=0)

 95     dat=1;

 96  else 

 97     dat=0;

98   DelaynUs(50);    

99   return (dat);


100}



//读一个字节数据

101unsigned char tmpread(void)   //read a byte date

102{

103  unsigned char i,j,dat;  

104  dat=0;                    //什么意思,见下面

105  for(i=1;i<=8;i++)

106  {

107    j=tmpreadbit();

108    dat=(j<<7)|(dat>>1);   //读出的数据最低位在最前面,这样刚好一个字节在DAT里

109  }

110  return(dat);

111}

//86-111这段程序在另外一篇文章里有介绍 (http://blog.csdn.net/yueniaoshi/article/details/7835790)

//写数据

112void tmpwritebyte(unsigned char dat)   //write a byte to ds18b20

113{

 114 unsigned char j;

 115 unsigned char testb;

116  for(j=1;j<=8;j++)

 117 {

 118   testb=dat&0x01;  //(利用与运算取出要写的第0位二进制数据)

119    dat=dat>>1;      //将此位右移1位,为的是使dat中将要取出的位始终位于第0位

 120   if(testb)     //write 1

 121   {

 122     DS_OUT();

123       DS_L();     //DS=0,写周期一开始做为主机先把总线拉低1微秒表示写周期开始

124      //Delayn(1);

125      DS_IN();     //input

126      DelaynUs(50);

127    }

128    else          //write 0

 129   {

 130     DS_OUT();

 131     DS_L();     //DS=0;

132      DelaynUs(45); 

 133     DS_IN();    //input

134      DelaynUs(2);

135    }

136  }

137}


//DS18B20 begin change,转换数据

138void Tmp_Change(void)

139{

140  DS_Reset();

141  DelaynUs(1000);       

142  tmpwritebyte(0xcc);   // address all drivers on bus(跳过ROM,忽略64位ROM地址,直接向 


                                                  // DS18B20发温度变换命令)


143  tmpwritebyte(0x44);   //  initiates a single temperature conversion,启动DS18B20进


                                          //行温度转换,转换时间最长为500ms(典型为200ms)结果存入内部9字节RAM中


144}




//get the temperature ,读取温度值

145float tmp(void)               

146{

147  float tt;

148  unsigned int temp;

149  unsigned char a,b;

 150 DS_Reset();            //复位DS18B20(主机发出复位操作并接收DS18B20的应答存在脉冲)

151  DelaynUs(1000);        

152 tmpwritebyte(0xcc); /

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

上一篇:arm力天电子 lpc2148 无字库的12864显示一个汉字(串行)
下一篇:lpc2148基于DS18B20的温度控制系统程序代码之dat=(j1)详解

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

推荐阅读

ARM七种异常源和异常处理流程(四大步三小步)
                                                    ARM异常处理(处理器对特定的异常事件进行的处理)的进入过程(硬件自动完成):四大步(两备份两修改)三小步:(1)拷贝 CPSR (当前程序状态寄存器current program status register)到 SPSR_<mode>(保存当前
发表于 2020-03-08
ARM七种异常源和异常处理流程(四大步三小步)
arm开发板的一些常用命令
这写记录是我经常忘记的东西:做个笔记在这里1、reboot 是重启的意思。2、source 是使那些修改的文件立即生效,避免了重启之后才能生效的问题,例如我们修改了/etc/profiile,修改之后不能立即生效。这时我们输入 source /etc/profile 就可以生效了这些以后还会继续更新。3、chmod -R 777 /home/edu/practice 设置practice文件夹里面的所有的文件权限为7774、压缩单个文件:gzip -v etc.c   生成的压缩名为:etc.c.gz5、压缩多个文件:gzip -v  *     //压缩当前目录下的所有文
发表于 2020-03-08
ARM处理器的未定义指令异常处理过程分析
在前面的两篇文章中已经介绍了ARM处理器的工作模式和ARM异常中断处理流程。这篇文章我们通过代码来详细介绍ARM处理器未定义指令的异常中断处理;当发生未定义指令异常中断时,CPU进入未定义指令模式。可以通过读取CPSR寄存器的值来判定是否真的进入了未定义指令模式。开发板:tiny4412;工具链版本:gcc version 4.5.1 (ctng-1.8.1-FA)主要设置以下几个文件:start.S文件,详细内容如下:.text.global _start_start: b reset /* vector 0x46000000 reset*/ ldr pc, _undefined_instruction
发表于 2020-03-08
【ARM裸板】启动文件与栈的简略分析
unsigned int *)0x56000054; *pGPFCON = 0x100; *pGPFDAT = 0; return 0;}3.问题函数的调用规则ATPCS:ARM-THUMB procedure call standard(ARM-Thumb过程调用标准)参考文章 Arm汇编学习笔记(六)——函数调用栈空间以及fp寄存器3.1 为什么要设置栈?因为C函数所需保存局部变量保存LR等寄存器(返回地址)调用者如何传递参数给被调用者被调用者如何传返回这给调用者怎么从栈中恢复那些寄存器调用者和被调用者通过r0-r3寄存器传递参数和返回值在函数中,r4-r11可能被使用,所以:在入口保存他们,在出口恢复他们高标号寄存器存放在高地
发表于 2020-03-08
【ARM裸板】启动文件与栈的简略分析
【ARM裸板】S3C2440 时钟设置与分析
由时钟树分析,时钟源通过选择器接入给MPLL(Main PLL)与UPLL(USB PLL)经过MPLL得到FCLK提供给CPU[ARM920T]FCLK分别通过HDIVN与PDIVN分频得到HCLK与PCLKHCLK接入给AHB总线,再给各种高速设备(Nand Flash、内存控制器、中断控制器…)PCLK接入给APB总线,再给各种低速设别(I2C、PWM、GPIO、UART…)1.时钟源最大值2.时钟源2.1 两种时钟源1.晶振2.外部引脚时钟输入2.2 选择时钟源通过改变OM[3:2]引脚来选择时钟源JZ2440 OM[3:2]接入GND,则主时钟源与USB时钟源都选择外部晶振3.上电时钟分析复位等待, 等待电源稳定
发表于 2020-03-08
【ARM裸板】S3C2440 时钟设置与分析
【ARM裸板】内存控制器、SDRAM基础与代码重定位
1.CPU如何控制外设?CPU控制相应外设的寄存器,有外设控制器发出特定的波形2.CPU如何选择寄存器?CPU通过内存控制器选择发出地址addr根据地址选择不同的模块CPU内存控制器读写数据3.外设共用地址、数据总线,如何互不干扰?通过片选CS引脚,选择不同的外设4.谁控制片选引脚发出地址addr根据地址发出片选信号CPU内存控制器使能相应的外设由芯片手册得知:当CPU发出地址是0x00000000时 nGCS0为低电平选择(有效)5.CPU如何读写数据的方向?通过外设芯片的读写引脚控制6.CPU不同位宽设备如何连接并读取数据【内存控制器】6.1 连接方式8bit ROM (从A0开始对应连接)16bit ROM (A0不接,从A1
发表于 2020-03-06
【ARM裸板】内存控制器、SDRAM基础与代码重定位
小广播
何立民专栏 单片机及嵌入式宝典

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

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