找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机定时控制ds18b20温度程序

[复制链接]
ID:477589 发表于 2019-2-18 14:34 | 显示全部楼层 |阅读模式
51单片机定时温度控制,数码管显示。时间和温度。

单片机源程序如下:
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. sbit DQ=P2^2;//温度采集
  4. sbit latch1=P2^6;//段锁存
  5. sbit latch2=P2^7;//位锁存
  6. unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示0~9
  7. unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//点亮数码管
  8. unsigned char TempData[8];//存储显示的度数
  9. bit Readtime;//读取时间的标志








  10. //定义延时函数delayus,delayms
  11. void delayus(unsigned char t)
  12. {
  13. while(--t);
  14. }
  15. void delayms(unsigned char t)
  16. {
  17. while(t--)
  18. {
  19. delayus(245);
  20. delayus(245);
  21. }
  22. }




  23. //18b20初始化
  24. bit ds18b20()
  25. {
  26. bit test=0;
  27. DQ=1;//复位DQ
  28. delayus(5);//稍作延时
  29. DQ=0;//将DQ拉低
  30. delayus(200);//精确 >480us <960us
  31. delayus(200);
  32. DQ=1;//将DQ拉高
  33. delayus(50);//延时15~60us后,接收脉冲
  34. test=DQ;//判断是否初始化成功
  35. delayus(25);//延时后返回值
  36. return test;
  37. }




  38. //显示程序函数
  39. void Display(unsigned char FirstBit,unsigned char Num)
  40. {
  41. static unsigned char i=0;
  42. P0=0;//防止有重影
  43. latch1=1;//段锁存
  44. latch1=0;


  45. P0=dofly_WeiMa[i+FirstBit];//取位码
  46. latch2=1;//位锁存
  47. latch2=0;


  48. P0=TempData[i];//取显示数据,取断码
  49. latch1=1;//段锁存
  50. latch2=0;


  51. i++;
  52. if(i==Num)
  53. i=0;
  54. }




  55. //读数据函数
  56. unsigned char Readchar()
  57. {
  58. unsigned char i=0;
  59. unsigned char test=0;
  60. for(i=8;i>0;i--)
  61. {
  62. DQ=0;
  63. test>>=1;//右移一位
  64. DQ=1;
  65. if(DQ)
  66. test|=0x80;
  67. delayus(25);

  68. }
  69. return(test);
  70. }


  71. //写入数据函数
  72. void Writechar(unsigned char test)
  73. {
  74. unsigned char i=0;
  75. for(i=8;i>0;i--)
  76. {
  77. DQ=0;
  78. DQ=test&0x01;
  79. delayus(25);
  80. DQ=1;
  81. test>>=1;
  82. }
  83. delayus(25);
  84. }


  85. //读取温度函数
  86. unsigned int ReadTempture()
  87. {
  88. unsigned char a=0;
  89. unsigned int b=0;
  90. unsigned int t=0;
  91. ds18b20();
  92. Writechar(0xCC);//跳过读序列号
  93. Writechar(0x44);//启动温度转换
  94. delayms(10);
  95. ds18b20();
  96. Writechar(0xCC);//跳过读序列号
  97. Writechar(0xBE);//读取温度
  98. a=Readchar();//高8位
  99. b=Readchar();//低8位


  100. b<<=8;
  101. t=a+b;
  102. return(t);
  103. }






  104. //主函数main
  105. void main()
  106. {
  107. unsigned int TempH,TempL,Temp;
  108. TMOD |= 0x01;//确定使用哪个定时器,确定工作模式
  109.   EA=1;    //打开中断允许
  110.   ET0=1;       //定时器T0允许
  111.   TR0=1;  //启动T0
  112. while(1)
  113. {
  114. if(Readtime==1)
  115. {
  116. Readtime=0;
  117. Temp=ReadTempture();
  118. if(Temp&0x8000)
  119. {
  120. TempData[0]=0x40;//表示为负数
  121. Temp=~Temp;//取反码
  122. Temp+=1;//取补码
  123. }
  124. }
  125. else
  126. TempData[0]=0;//表示为正数


  127. TempH=Temp>>4;
  128. TempL=Temp&0x0F;
  129. TempL=TempL*6/10;//小数近似处理


  130. if(TempH/100==0)
  131. TempData[1]=0;//百位
  132. else
  133. TempData[1]=dofly_DuanMa[TempH/100];//十位


  134. if((TempH/100==0)&&((TempH%100)/10==0))//消影
  135. TempData[2]=0;
  136. else
  137. TempData[2]=dofly_DuanMa[(TempH%100)/10];//十位


  138. TempData[3]=dofly_DuanMa[(TempH%100)%10]|0x80;//个位温度,带小数点
  139. TempData[4]=dofly_DuanMa[TempL];//小数位温度
  140. TempData[6]=0x39;//显示温度C


  141. }
  142. }




  143. //定时中断函数
  144. void Timer0_isr() interrupt 1
  145. {
  146. static unsigned int num;
  147. TH0=(65536-2000)/256;
  148. TL0=(65536-2000)%256;

  149. Display(0,8);//调用函数
  150. num++;
  151. if(num==300)
  152.    {
  153.     num=0;
  154.     Readtime=1; //读标志位1
  155. }
  156. }
复制代码

所有资料51hei提供下载:
5.rar (30.19 KB, 下载次数: 16)
回复

使用道具 举报

ID:1 发表于 2019-2-18 15:46 | 显示全部楼层
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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