微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 第49节:利用DS18B20做一个温控器

第49节:利用DS18B20做一个温控器

时间:11-22 来源:互联网 点击:

  1. 鸣器鸣叫的原子锁
  2. unsigned char ucDigShow8;//第8位数码管要显示的内容
  3. unsigned char ucDigShow7;//第7位数码管要显示的内容
  4. unsigned char ucDigShow6;//第6位数码管要显示的内容
  5. unsigned char ucDigShow5;//第5位数码管要显示的内容
  6. unsigned char ucDigShow4;//第4位数码管要显示的内容
  7. unsigned char ucDigShow3;//第3位数码管要显示的内容
  8. unsigned char ucDigShow2;//第2位数码管要显示的内容
  9. unsigned char ucDigShow1;//第1位数码管要显示的内容
  10. unsigned char ucDigDot8;//数码管8的小数点是否显示的标志
  11. unsigned char ucDigDot7;//数码管7的小数点是否显示的标志
  12. unsigned char ucDigDot6;//数码管6的小数点是否显示的标志
  13. unsigned char ucDigDot5;//数码管5的小数点是否显示的标志
  14. unsigned char ucDigDot4;//数码管4的小数点是否显示的标志
  15. unsigned char ucDigDot3;//数码管3的小数点是否显示的标志
  16. unsigned char ucDigDot2;//数码管2的小数点是否显示的标志
  17. unsigned char ucDigDot1;//数码管1的小数点是否显示的标志
  18. unsigned char ucDigShowTemp=0; //临时中间变量
  19. unsigned char ucDisplayDriveStep=1;//动态扫描数码管的步骤变量
  20. unsigned char ucWd=1;//因为本程序只有1个窗口,在实际项目中,此处的ucWd也可以省略不要
  21. unsigned char ucWd1Part1Update=1;//在窗口1中,局部1的更新显示标志
  22. unsigned char ucWd1Part2Update=1; //在窗口1中,局部2的更新显示标志
  23. unsigned char ucTemp1=0;//中间过渡变量
  24. unsigned char ucTemp2=0;//中间过渡变量
  25. unsigned char ucTemp3=0;//中间过渡变量
  26. unsigned char ucTemp4=0;//中间过渡变量
  27. unsigned char ucTemp5=0;//中间过渡变量
  28. unsigned char ucTemp6=0;//中间过渡变量
  29. unsigned char ucTemp7=0;//中间过渡变量
  30. unsigned char ucTemp8=0;//中间过渡变量
  31. //根据原理图得出的共阴数码管字模表
  32. code unsigned char dig_table[]=
  33. {
  34. 0x3f,//0 序号0
  35. 0x06,//1 序号1
  36. 0x5b,//2 序号2
  37. 0x4f,//3 序号3
  38. 0x66,//4 序号4
  39. 0x6d,//5 序号5
  40. 0x7d,//6 序号6
  41. 0x07,//7 序号7
  42. 0x7f,//8 序号8
  43. 0x6f,//9 序号9
  44. 0x00,//无 序号10
  45. 0x40,//- 序号11
  46. 0x73,//P 序号12
  47. };
  48. void main()
  49. {
  50. initial_myself();
  51. delay_long(100);
  52. initial_peripheral();
  53. while(1)
  54. {
  55. key_service(); //按键服务的应用程序
  56. ds18b20_sampling(); //ds18b20采样程序
  57. temper_control_service(); //温控程序
  58. display_service(); //显示的窗口菜单服务程序
  59. }
  60. }
  61. /* 注释一:
  62. * 做温控设备的时候,为了避免继电器在临界温度附近频繁跳动切换,应该设置一个
  63. * 缓冲温差。本程序的缓冲温差是2度。
  64. */
  65. void temper_control_service(void) //温控程序
  66. {
  67. if(ucSignFlag==0) //是正数的前提下
  68. {
  69. if(ulCurrentTemper>=ulSetTemper)//当实际温度大于等于设定温度时
  70. {
  71. led_dr=0; //模拟继电器的LED灯熄灭
  72. }
  73. else if(ulCurrentTemper<=(ulSetTemper-2))//当实际温度小于等于设定温度2读以下时,这里的2是缓冲温差2度
  74. {
  75. led_dr=1; //模拟继电器的LED灯点亮
  76. }
  77. }
  78. else//是负数,说明是零下多少度的情况下
  79. {
  80. led_dr=1; //模拟继电器的LED灯点亮
  81. }
  82. }
  83. void ds18b20_sampling(void) //ds18b20采样程序
  84. {
  85. ++uiSampingCnt;//累计主循环次数的时间
  86. if(uiSampingCnt>const_ds18b20_sampling_time)//每隔一段时间就更新采集一次Ds18b20数据
  87. {
  88. uiSampingCnt=0;
  89. ET0=0;//禁止定时中断
  90. uiTemperTemp=get_temper();//读取一次没有经过换算的温度数值
  91. ET0=1; //开启定时中断
  92. if((uiTemperTemp&0xf800)==0xf800) //是负号
  93. {
  94. ucSignFlag=1;
  95. uiTemperTemp=~uiTemperTemp;//求补码
  96. uiTemperTemp=uiTemperTemp+1;
  97. }
  98. else //是正号
  99. {
  100. ucSignFlag=0;
  101. }
  102. ulCurrentTemper=0; //把int数据类型赋给long类型之前要先清零
  103. ulCurrentTemper=uiTemperTemp;
  104. ulCurrentTemper=ulCurrentTemper*10; //为了先保留一位小数点,所以放大10倍,
  105. ulCurrentTemper=ulCurrentTemper>>4;//往右边移动4位,相当于乘以0.0625. 此时保留了1位小数点,
  106. ulCurrentTemper=ulCurrentTemper+5;//四舍五入
  107. ulCurrentTemper=ulCurrentTemper/10; //四舍五入后,去掉小数点
  108. ucWd1Part2Update=1; //局部2更新显示实时温度
  109. }
  110. }
  111. //ds18b20驱动程序
  112. unsigned int get_temper()//读取一次没有经过换算的温度数值
  113. {
  114. unsigned char temper_H;
  115. unsigned char temper_L;
  116. unsigned int ds18b20_data=0;
  117. ds18b20_reset(); //复位ds18b20的时序
  118. ds_write_byte

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top