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

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

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

  1. dig_hc595_sh_dr=0; //SH引脚的上升沿把数据送入寄存器
  2. delay_short(1);
  3. dig_hc595_sh_dr=1;
  4. delay_short(1);
  5. ucTempData=ucTempData<1;
  6. }
  7. dig_hc595_st_dr=0;//ST引脚把两个寄存器的数据更新输出到74HC595的输出引脚上并且锁存起来
  8. delay_short(1);
  9. dig_hc595_st_dr=1;
  10. delay_short(1);
  11. dig_hc595_sh_dr=0; //拉低,抗干扰就增强
  12. dig_hc595_st_dr=0;
  13. dig_hc595_ds_dr=0;
  14. }
  15. //LED灯的74HC595驱动函数
  16. void hc595_drive(unsigned char ucLedStatusTemp16_09,unsigned char ucLedStatusTemp08_01)
  17. {
  18. unsigned char i;
  19. unsigned char ucTempData;
  20. hc595_sh_dr=0;
  21. hc595_st_dr=0;
  22. ucTempData=ucLedStatusTemp16_09;//先送高8位
  23. for(i=0;i<8;i++)
  24. {
  25. if(ucTempData>=0x80)hc595_ds_dr=1;
  26. else hc595_ds_dr=0;
  27. hc595_sh_dr=0; //SH引脚的上升沿把数据送入寄存器
  28. delay_short(1);
  29. hc595_sh_dr=1;
  30. delay_short(1);
  31. ucTempData=ucTempData<1;
  32. }
  33. ucTempData=ucLedStatusTemp08_01;//再先送低8位
  34. for(i=0;i<8;i++)
  35. {
  36. if(ucTempData>=0x80)hc595_ds_dr=1;
  37. else hc595_ds_dr=0;
  38. hc595_sh_dr=0; //SH引脚的上升沿把数据送入寄存器
  39. delay_short(1);
  40. hc595_sh_dr=1;
  41. delay_short(1);
  42. ucTempData=ucTempData<1;
  43. }
  44. hc595_st_dr=0;//ST引脚把两个寄存器的数据更新输出到74HC595的输出引脚上并且锁存起来
  45. delay_short(1);
  46. hc595_st_dr=1;
  47. delay_short(1);
  48. hc595_sh_dr=0; //拉低,抗干扰就增强
  49. hc595_st_dr=0;
  50. hc595_ds_dr=0;
  51. }
  52. void T0_time(void) interrupt 1 //定时中断
  53. {
  54. TF0=0;//清除中断标志
  55. TR0=0; //关中断
  56. if(ucVoiceLock==0) //原子锁判断
  57. {
  58. if(uiVoiceCnt!=0)
  59. {
  60. uiVoiceCnt--; //每次进入定时中断都自减1,直到等于零为止。才停止鸣叫
  61. beep_dr=0;//蜂鸣器是PNP三极管控制,低电平就开始鸣叫。
  62. }
  63. else
  64. {
  65. ; //此处多加一个空指令,想维持跟if括号语句的数量对称,都是两条指令。不加也可以。
  66. beep_dr=1;//蜂鸣器是PNP三极管控制,高电平就停止鸣叫。
  67. }
  68. }
  69. key_scan(); //按键扫描函数
  70. display_drive();//数码管字模的驱动函数
  71. TH0=0xfe; //重装初始值(65535-500)=65035=0xfe0b
  72. TL0=0x0b;
  73. TR0=1;//开中断
  74. }
  75. void delay_short(unsigned int uiDelayShort)
  76. {
  77. unsigned int i;
  78. for(i=0;i
  79. {
  80. ; //一个分号相当于执行一条空语句
  81. }
  82. }
  83. void delay_long(unsigned int uiDelayLong)
  84. {
  85. unsigned int i;
  86. unsigned int j;
  87. for(i=0;i
  88. {
  89. for(j=0;j<500;j++)//内嵌循环的空指令数量
  90. {
  91. ; //一个分号相当于执行一条空语句
  92. }
  93. }
  94. }
  95. void initial_myself(void)//第一区 初始化单片机
  96. {
  97. led_dr=0;//此处的LED灯模拟工控中的继电器
  98. key_gnd_dr=0; //模拟独立按键的地GND,因此必须一直输出低电平
  99. beep_dr=1; //用PNP三极管控制蜂鸣器,输出高电平时不叫。
  100. hc595_drive(0x00,0x00);//关闭所有经过另外两个74HC595驱动的LED灯
  101. TMOD=0x01;//设置定时器0为工作方式1
  102. TH0=0xfe; //重装初始值(65535-500)=65035=0xfe0b
  103. TL0=0x0b;
  104. }
  105. void initial_peripheral(void) //第二区 初始化外围
  106. {
  107. ucDigDot8=0; //小数点全部不显示
  108. ucDigDot7=0;
  109. ucDigDot6=0;
  110. ucDigDot5=0;
  111. ucDigDot4=0;
  112. ucDigDot3=0;
  113. ucDigDot2=0;
  114. ucDigDot1=0;
  115. EA=1; //开总中断
  116. ET0=1; //允许定时中断
  117. TR0=1; //启动定时中断
  118. }


总结陈词:
下一节开始讲单片机采集模拟信号的内容,欲知详情,请听下回分解-----利用ADC0832采集电压的模拟信号。

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

网站地图

Top