找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4387|回复: 1
收起左侧

DS18B20高精度温度测量C程序

[复制链接]
ID:76127 发表于 2015-4-5 01:07 | 显示全部楼层 |阅读模式

显示现在的室内温度是:26度(在这里要感谢"科美图--黄工,印制板做得很好!)
很高兴经过7天的调试,我的温度测量程序终于成功了,经过本次温度测量硬件的设计和软件的设计,我有一点心得和大家一同分享!
1、              作为单片机智能电子产品的开发,首先要撑握电子硬件的设计,在硬件设计中要对所使用的单片机特点进行综合了解,怎么良好地去配合传感器工作是设计的重点;
2、              当我们确认好硬件正确后就进入到软件开发设计,在软件开发过程中会出现非常多的问题,如晶振的偏差在时序上的影响,用软件延时和定时器延时的效果在C语言上有着相当大的计算偏差;对于时序性很强的单总线I2C器件,最好采用定时器进行最小1微秒的精确时间延时,从而提高了时间的较强的可控性也提高了成功的概率。如果你一定要用软件延时的话,那你手上最好要有台“示波器”,C语言编译后的时间误差让我在这个温度测量程序上走了很多的弯路,用软件进行时间防真时,延时时间是15微秒,然而当一用示波器来测量时却可能达到了30微秒或者10微秒,对于“I2C协议”则是非常大的误差了,注定不能成功。
3、              硬件设计确认了调试仍不成功的,不要一味的怀疑是硬件有问题,或者说花大量时间去找硬件问题;因为问题根本不是在硬件上。当我调这款程序时怎么调都没有反映,就连CPU不能识别有传感器存在,让我郁闷了几天!结果灵机一动,想到试验室有一台RIGOL/100MHZ的示波器,然后将程序分解成若干个功能段分批调试,终于发现是延时不准确造成的。
4、              尽信书等于没书;这个程序让我真正的体会到了这一点!我在做这个项目的时间最初是参考书上的程序来写,但是怎么也调不成功,百思不得其解啊!晕!!!!程序写得没有任何的语法错误啊!Keil软件也通过了编译没有错误!但还是不行??最终当我将程序分段进行防真时发现书上的程序还是写错了,他错在语句的时序上有问题,当然Keil软件是不能发现这个错误的,因为Keil软件只能发现语法上的错误,而不能发现语句时序安排上的错误。
5、              在写程序调试中,软件编写者应该对硬件电路结构了解,不要你做你的硬件,我做我的软件大家互不相干!一个智能电子产品,是硬件和软件的结晶,少了谁都不能统一!在设计软件的功能时,应尽量将程序简单化,需要观察的变量或输出观察的变量,最好先用8LED指示灯来显示,这样不仅可能看到有没有数据的变化,而且还可以通过LED位显示来自己计算数据是不是自己想要的东东!如果是的话,恭喜你,你的程序调试好一段了哟!
6、              我认为单片机学习者还是要先学习汇编语言,然后再升华到C语言!对于这两种语言我是深有体会的,当你学会C语言那再学VB语言就轻松得很。初学时应该要了解单片机内部的结构,如ROM是什么意思,有什么作用;RAM是什么意思,有什么作用等等;然后用汇编指令时行一步步的编写程序;汇编语言的特点是必须对单片机内部结构很了解才能针对性的开发程序,而且精度是很高的,因为汇编语言的编程方式用一个小例子来说明:如平时我们计算2*10=20,我们一下就心算出来了;但用汇编语言呢它是这样算的:2+2+2一直加102等于20,也就是用了10步才完成计算的,这样你就要写10步程序;而C语言的算法就和我们人一样,一步搞定;但C语言时却不如汇编来的精确,因而对于一个程序高手来说采用混编的办法来设计程序,又用C又用汇编用到极致!
             最后!通过大量的设计和编程,我的第一块单片机开发板终于问世了!!!我的开发板上面的功能如下:
1)、在线ISP下载程序;
2)、USB接口下载和电源二合一功能;
3)、LCD1602液晶显示(漂亮的蓝色底白色字哟!)
4)、32I/O口全部扩展,让您想怎么用就怎么用;
5)、三位红字数码管显示同时带小数点;
6)、电磁式蜂呜器,可以用来作提示音或放音乐哟!
7)、6位带位选的LED显示功能,让你的设计调试不再寂寞;
8)、5个独立按键,在电路板上还标有箭头呢,让你做电子钟,或调光程序更直接明了;
9)、一个EEPROM非易失存储器,让你学会用I2C协议;这个协议很有用哟!什么照相机、打印机、U盘、MP3、数字收间机都用这个协议呢!你说用处大不大?
10)、一体化红外接收头,可以用这个实现红外控制,让控制电器变得更简单;
11)、都用了高品质的电子元件,还配了光盘,里面有安装软件、教学程序,一条USB数据线,还有送二个高品质的STC单片机哟!
下面是我写的室温测量程序:
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. sbit DQ=P3^7;
  5. sbit D1=P0^1;
  6. sbit D2=P0^2;
  7. sbit D3=P0^3;
  8. uchar code table[]={0x03,0xf3,0x25,0x0d,//0,1,2,3
  9.           0x99,0x49,0x41,0x1b,//4,5,6,7
  10.           0x01,0x09};//8,9,.,段码表
  11.          
  12. /////////////////////////////////////////////////////////////
  13. void delay(unsigned int us)
  14. {
  15. while(us--);
  16. }
  17. ////////////////////////////////////////////
  18. void reset()// DS18B20复位OK
  19. {
  20. uchar x=0;
  21. DQ=1;
  22. delay(8);
  23. DQ=0;
  24. delay(330);
  25. DQ=1;
  26. delay(100);
  27. x=DQ;
  28. delay(20);
  29. }
  30. ////////////////////////////////////////////从DS18B20读一字节
  31. uchar readbyte()
  32. {
  33. uchar i=0;
  34. uchar dat=0;
  35. for(i=8;i>0;i--)
  36. {
  37.   DQ=0;
  38.   dat>>=1;
  39.   DQ=1;
  40.   if(DQ)
  41.   dat|=0x80;
  42.   delay(28);//41us
  43. }
  44.   return(dat);
  45. }
  46. /////////////////////////////////////////////向DS18B20写一字节
  47. void writebyte(unsigned char dat)
  48. {
  49. uchar i=0;
  50. for(i=8;i>0;i--)
  51. {
  52.   DQ=0;
  53.   DQ=dat&0x01;
  54.   delay(8);
  55.   if(DQ==0)
  56.      {
  57.      delay(28);//41us
  58.      DQ=1;
  59.    }
  60.   else
  61.    {
  62.     DQ=1;
  63.     delay(28);//41us
  64.      }
  65.         dat>>=1;
  66. }
  67. }
  68. ////////////////////////////////////////////MCU读取温度值
  69. uchar readtemp()
  70. {
  71. uchar a=0;
  72. uchar b=0;
  73. reset();
  74. writebyte(0xcc);
  75. writebyte(0x44);
  76. reset();
  77. writebyte(0xcc);
  78. writebyte(0xbe);
  79. a=readbyte();
  80. b=readbyte();
  81. ////////////////////////
  82. b<<=4;
  83. b+=(a&0xf0)>>4;
  84. return(b);
  85. }
  86. //////////////////////////////////////////显示程序
  87. void shanshi(uchar dat)
  88. {
  89. uchar a,b;
  90. a=dat/10;
  91. b=dat%10;
  92. D1=0;
  93. P1=table[a];
  94. delay(60);
  95.   D1=1;
  96. /////////////////
  97. D2=0;
  98.   P1=table[b];
  99. delay(60);
  100. D2=1;
  101. }
  102. ////////////////////////////////////////////主函数
  103. void main()
  104. {
  105. uchar temp;

  106. while(1)
  107. {
  108.   temp=readtemp();
  109.   shanshi(temp);
  110.    delay(100);
  111. }
  112. }
复制代码








回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表