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

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

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

  1. if(ulSetTemper>125)
  2. {
  3. ulSetTemper=125;
  4. }
  5. ucWd1Part1Update=1; //更新显示设定温度
  6. break;
  7. }
  8. ucVoiceLock=1;//原子锁加锁,保护主函数与中断函数的共享变量uiVoiceCnt
  9. uiVoiceCnt=const_voice_short; //按键声音触发,滴一声就停。
  10. ucVoiceLock=0;//原子锁解锁,保护主函数与中断函数的共享变量uiVoiceCnt
  11. ucKeySec=0;//响应按键服务处理程序后,按键编号清零,避免一致触发
  12. break;
  13. case 2:// 减按键 对应朱兆祺学习板的S5键
  14. switch(ucWd) //因为本程序只有1个窗口,在实际项目中,此处的ucWd也可以省略不要
  15. {
  16. case 1: //在窗口1下设置设定温度
  17. if(ulSetTemper>2)//由于缓冲温差是2度,所以我人为规定最小允许设定的温度不能低于2度
  18. {
  19. ulSetTemper--;
  20. }
  21. ucWd1Part1Update=1; //更新显示设定温度
  22. break;
  23. }
  24. ucVoiceLock=1;//原子锁加锁,保护主函数与中断函数的共享变量uiVoiceCnt
  25. uiVoiceCnt=const_voice_short; //按键声音触发,滴一声就停。
  26. ucVoiceLock=0;//原子锁解锁,保护主函数与中断函数的共享变量uiVoiceCnt
  27. ucKeySec=0;//响应按键服务处理程序后,按键编号清零,避免一致触发
  28. break;
  29. }
  30. }
  31. void display_drive(void)
  32. {
  33. //以下程序,如果加一些数组和移位的元素,还可以压缩容量。但是鸿哥追求的不是容量,而是清晰的讲解思路
  34. switch(ucDisplayDriveStep)
  35. {
  36. case 1://显示第1位
  37. ucDigShowTemp=dig_table[ucDigShow1];
  38. if(ucDigDot1==1)
  39. {
  40. ucDigShowTemp=ucDigShowTemp|0x80;//显示小数点
  41. }
  42. dig_hc595_drive(ucDigShowTemp,0xfe);
  43. break;
  44. case 2://显示第2位
  45. ucDigShowTemp=dig_table[ucDigShow2];
  46. if(ucDigDot2==1)
  47. {
  48. ucDigShowTemp=ucDigShowTemp|0x80;//显示小数点
  49. }
  50. dig_hc595_drive(ucDigShowTemp,0xfd);
  51. break;
  52. case 3://显示第3位
  53. ucDigShowTemp=dig_table[ucDigShow3];
  54. if(ucDigDot3==1)
  55. {
  56. ucDigShowTemp=ucDigShowTemp|0x80;//显示小数点
  57. }
  58. dig_hc595_drive(ucDigShowTemp,0xfb);
  59. break;
  60. case 4://显示第4位
  61. ucDigShowTemp=dig_table[ucDigShow4];
  62. if(ucDigDot4==1)
  63. {
  64. ucDigShowTemp=ucDigShowTemp|0x80;//显示小数点
  65. }
  66. dig_hc595_drive(ucDigShowTemp,0xf7);
  67. break;
  68. case 5://显示第5位
  69. ucDigShowTemp=dig_table[ucDigShow5];
  70. if(ucDigDot5==1)
  71. {
  72. ucDigShowTemp=ucDigShowTemp|0x80;//显示小数点
  73. }
  74. dig_hc595_drive(ucDigShowTemp,0xef);
  75. break;
  76. case 6://显示第6位
  77. ucDigShowTemp=dig_table[ucDigShow6];
  78. if(ucDigDot6==1)
  79. {
  80. ucDigShowTemp=ucDigShowTemp|0x80;//显示小数点
  81. }
  82. dig_hc595_drive(ucDigShowTemp,0xdf);
  83. break;
  84. case 7://显示第7位
  85. ucDigShowTemp=dig_table[ucDigShow7];
  86. if(ucDigDot7==1)
  87. {
  88. ucDigShowTemp=ucDigShowTemp|0x80;//显示小数点
  89. }
  90. dig_hc595_drive(ucDigShowTemp,0xbf);
  91. break;
  92. case 8://显示第8位
  93. ucDigShowTemp=dig_table[ucDigShow8];
  94. if(ucDigDot8==1)
  95. {
  96. ucDigShowTemp=ucDigShowTemp|0x80;//显示小数点
  97. }
  98. dig_hc595_drive(ucDigShowTemp,0x7f);
  99. break;
  100. }
  101. ucDisplayDriveStep++;
  102. if(ucDisplayDriveStep>8)//扫描完8个数码管后,重新从第一个开始扫描
  103. {
  104. ucDisplayDriveStep=1;
  105. }
  106. }
  107. //数码管的74HC595驱动函数
  108. void dig_hc595_drive(unsigned char ucDigStatusTemp16_09,unsigned char ucDigStatusTemp08_01)
  109. {
  110. unsigned char i;
  111. unsigned char ucTempData;
  112. dig_hc595_sh_dr=0;
  113. dig_hc595_st_dr=0;
  114. ucTempData=ucDigStatusTemp16_09;//先送高8位
  115. for(i=0;i<8;i++)
  116. {
  117. if(ucTempData>=0x80)dig_hc595_ds_dr=1;
  118. else dig_hc595_ds_dr=0;
  119. dig_hc595_sh_dr=0; //SH引脚的上升沿把数据送入寄存器
  120. delay_short(1);
  121. dig_hc595_sh_dr=1;
  122. delay_short(1);
  123. ucTempData=ucTempData<1;
  124. }
  125. ucTempData=ucDigStatusTemp08_01;//再先送低8位
  126. for(i=0;i<8;i++)
  127. {
  128. if(ucTempData>=0x80)dig_hc595_ds_dr=1;
  129. else dig_hc595_ds_dr=0;

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

网站地图

Top