历史上的今天
返回首页

历史上的今天

今天是:2025年03月03日(星期一)

正在发生

2020年03月03日 | arm力天电子 lpc2148 基于DS18b20的温度采集实验程序详解

2020-03-03 来源:eefocus

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);    //跳过ROM,忽略64位ROM地址,直接向DS18B20发温度变换命令

153  tmpwritebyte(0xbe);    //读暂存器,读内部RAM中9字节的内容(即读温度),如果只想读取温//度数据,


                                          //那在读完第0和第1个数据后就不在理会后面DS18B20发出的数据即可,读取的数据是低位//在前的


154  a=tmpread();           //连续两次调用tmpread(),把最先发出的两个字节读回

155  b=tmpread();           //这两个字节分别是温度的高字节和低字节

156  temp=b;

157  temp<<=8;             //two byte  compose a int variable

158  temp=temp|a;          //组合成完整数据

159  tt=temp*0.0625;       //将测到的数值乘以0.0625即可得到实际温度(原因自己也搞不懂,但在最后附一张图片,上面有一些介绍)

160  temp=tt*10+0.5;         //0.5是干嘛的呢?应该是精度差

161  return temp;         //具体是哪个地方呢?应该是返回到 tt=tt*10+0.5这个地方

推荐阅读

史海拾趣

DATATRONICS公司的发展小趣事

DATATRONICS深知产品质量是企业生存和发展的基石。因此,公司投入大量资源用于建立和完善质量管理体系,确保每一款产品都符合国际标准和客户要求。同时,DATATRONICS还注重品牌形象的塑造,通过一系列营销活动和公益活动,提高了品牌知名度和美誉度。

ELEMENT14公司的发展小趣事

ELEMENT14一直注重创新产品的引入和推广。公司紧跟电子行业的最新技术趋势,及时引入高性能、高可靠性的电子元器件产品。同时,ELEMENT14还积极推广这些创新产品,通过举办技术研讨会、发布技术白皮书等方式,帮助客户了解产品的特点和优势。这些努力不仅提升了公司的技术水平,也为客户提供了更多的选择。

Goldentech Discrete Semiconductor Inc公司的发展小趣事

在快速发展的同时,Goldentech始终关注环境保护和社会责任。公司积极推行绿色制造理念,采用环保材料和节能技术,减少生产过程中的碳排放和资源消耗。此外,Goldentech还投入大量资金研发可回收和可降解的半导体产品,旨在为全球电子行业的可持续发展贡献力量。这一环保理念不仅提升了公司的社会形象,还吸引了更多注重可持续发展的客户和合作伙伴。

Embedded Planet公司的发展小趣事

Embedded Planet公司自成立之初就注重技术创新和与业界领导者的合作。通过持续研发,公司成功开发出一款革命性的嵌入式系统解决方案,这一解决方案能够显著提升设备的性能和效率。同时,Embedded Planet积极与卓联半导体公司合作,共同推出了一款伪线模块,该模块能够大幅度降低通过分组网络传送TDM业务的网络设备的复杂性,并缩短开发时间。这一创新产品得到了市场的广泛认可,也为公司赢得了更多的合作机会。

Franz Binder GmbH & Co公司的发展小趣事

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

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

Bytesonic Corporation公司的发展小趣事

进入新世纪,Bytesonic Corporation面临着新的挑战和机遇。为了更好地适应市场变化和提升竞争力,公司在1999年11月进行了改制,资本增加至5700万新台币。这一改制不仅增强了公司的财务实力,也为其在未来的发展中注入了新的活力。

以上是基于已知信息对Bytesonic Corporation公司发展故事的概述。如需更详细、具体的故事内容,建议查阅公司官方资料、新闻报道或行业分析报告,以获取更全面、准确的信息。

问答坊 | AI 解惑

单片机的应用领域

单片机广泛应用于仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制等领域,大致可分如下几个范畴:   1.在智能仪器仪表上的应用   单片机具有体积小、功耗低、控制功能强、扩展灵活、微型化和使用方便等优点,广泛应用 ...…

查看全部问答>

tinyos能不能移植到CC2430上

我现在做毕业设计,准备将tinyos移植到CC2430上,请问能不能做到,难度有多大?…

查看全部问答>

哪位好心人帮帮我发一个keil软件给我

我的keil 老是出错, 比如: void main(void) { unsigned int w; w=10; } 程序执行到‘}’结束符就出错。 ***   error   65:   access   violation   at   C:0x0A00  &nb ...…

查看全部问答>

vs2005 编写 wince6.0程序问题

小弟这两天碰到一个很诡异的问题。 我在以前写的工程中加入代码调试运行时,新写的代码不运行。具体如下: 假如先前函数代码: [code]OnBnClickedBtnPrint1() {         int a=0;         a++; &nb ...…

查看全部问答>

pxa310开发板

Marvell? PXA310?开发板简要介绍 产品图片 Product Photo PXA310 简介 PXA310 处理器专门为手持设备、GPS 定位系统、无线手持和其他消费类电子设备而设计。基于第三代Intel XScale 技术的这一Marvell PXA3XX 应用处理器系列产品(内部称为Mon ...…

查看全部问答>

请问多个不同的硬件中断号(IRQ)能否关联到同一个逻辑中断(SYSINT)?

还有就是一个硬件中断号是否可以关联多个逻辑中断号? 希望大家讨论讨论!!…

查看全部问答>

纹波电压

  最近在看一本外国的书籍 电子电路分析与设计   刚开始看不久   看到一个纹波电路 纹波电压   好像以前没看过呢   这个纹波电压是做什么呢??   请问   (本人系菜鸟,如果问的问题比较弱智, ...…

查看全部问答>

STM8I2C是400K?4M?

今天看了一下ST的datasheet: RM0016 Reference manual December 2009 I2C  是400K? 4M? 400k.JPG (80.43 KB) 下载次数:2 2010-9-15 22:01 4M.JPG (75. ...…

查看全部问答>

请教STM32的MCO输出给5V器件CLKIN的方案?

打算用MAX7456,需要个27M的晶振。想把晶振省掉,用STM32的MCO来输出给它。 该CLKIN输入datasheet如下,VDVCC是5V供电。 下载 (31.48 KB) 2011-1-28 09:37 打算STM32用9M的晶振,PLL用6倍频到主时钟54M,然后MCO用PLL ...…

查看全部问答>