找回密码
 立即注册

QQ登录

只需一步,快速开始

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

案例讲解:555定时器和基于51单片机的频率计

[复制链接]
ID:218580 发表于 2017-7-11 13:59 | 显示全部楼层 |阅读模式
今天,生活君给大家带来555芯片的讲解,并制作一个基于51单片机的频率计设计。希望大家有所收获!
生活君先给小伙伴提一个问题,大家认为史上最成功的芯片是什么?或者可以更简单的说,哪个芯片出货量最多?Intel的酷睿?高通的骁龙?还是...?NO!别猜了,而是它,堪称电工的神器——555芯片

2c42000329b1cae18bb2.jpg

在我们的日常生活中,很多的电子产品都需要脉冲,比如报警器、电子开关、电子玩具、电子钟表以及电子医疗设备等等。这样就产生了众多的脉冲发生器,其中555定时器就是最常见,使用最广泛的一种。

555定时器,又叫555多谐振荡器、555脉冲发生器、555时基电路,是电子工程领域中广泛使用的中规模集成电路,是将模拟电路和数字电路巧妙结合在一起的电子器件,具有结构简单,定时精度高,驱动能力强等优点,配以外部元器件,可以构成多种应用电路,广泛应用于脉冲振荡器,检测电路,自动控制电路甚至通信领域。可以这样说,555芯片能够驾驭的炉火纯青,那么就可以省下好多芯片的钱了。

555定时器的工作原理:

定时器如果是用双极性工艺制作的成为555,而CMOS工艺制作的成为7555。555芯片的电源电压范围宽,可以在4.5V~16V内正常工作,输出的驱动电流为200mA,它的内部接线图如下图:

2eb9000381d6bbe9a315.jpg

555定时器包括以下部分:三个5K的电阻分压器,两个电压比较器,一个基本的RS触发器,一个缓冲器,一个放电晶闸管等。

555定时器的功能主要由两个比较器决定。两个比较器的输出电压控制RS触发器和放电管的状态,在电源与地之间加上电压,当5脚悬空时,则电压比较器C1 的同相输入端电压为2VCC/3,C2的反相输入端电压为VCC/3,若触发输入端TR的电压小于2VCC/3,则比较器C2输出为0,可使RS触发器置1,则输出端为1。如果阀值输入端TH的电压大于2VCC/3,同时TR端的电压大于VCC/3,则C1的输出为0,可将RS触发器置0,使输出为0.

  • 555引脚功能如下:
    1脚:芯片地脚,一般情况下接地
    2脚:低触发端
    3脚:输出端Vout
    4脚:直接清零端,此脚接地,无论TR和TH处于何电平,电路输出为0,,所以此端应接电源
    5脚:串入一个0.01uF的电容接地
    6脚:TH高触发端
    7脚:放电的引脚,该引脚与放电管的集电极项链,用作电容的放电
    8脚:芯片电源脚,一般用5V
  • 2c3e00036c2c43d15274.jpg
  • 调节电位器可以获得不同频率的脉冲,其中输出脉冲的周期F=0.7*(R1+2Pot)*C2。
  • 好了,555芯片原理以及方波产生电路讲解完毕了,接下来生活君用51单片机来测定输出的频率,并显示在1602上。
    本例中,使用定时器/计数器0作为定时器产生1秒的标志,定时器1作为计数器,对P3^5输入的555脉冲进行计数,1秒所记的脉冲个数就是频率,并将个数显示在1602上。
    根据上述公式:F=0.7/((R1+2Pot)*C2),C2为0.01的电容,当电位器Pot旋转到0Ω时,F=0.7*2000*0.00000001,则频率f=1/F=71428Hz,即1602显示71428左右。
    下面附上程序;
    1. #include<reg52.h>
    2. #include<intrins.h>
    3. #define RS_CLR RS=0
    4. #define RS_SET RS=1
    5. #define RW_CLR RW=0
    6. #define RW_SET RW=1
    7. #define EN_CLR EN=0
    8. #define EN_SET EN=1
    9. sbit RS = P2^5;
    10. sbit RW = P2^6;
    11. sbit EN = P2^7;
    12. unsigned char code LcdLine1[] =
    13. {
    14. "555 Timing Test"
    15. };
    16. unsigned char code LcdLine2[] =
    17. {
    18. "FREQ is: Hz"
    19. };
    20. bit Flag = 0;
    21. unsigned char Counter = 0,Hdata = 0,Ldata = 0,Pulse = 0;
    22. unsigned char data display[] =
    23. {
    24. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    25. };
    26. void DelayUs2x(unsigned char t)
    27. {
    28. while(--t);
    29. }
    30. void DelayMs(unsigned char t)
    31. {
    32. while(t--)
    33. {
    34. DelayUs2x(245);
    35. DelayUs2x(245);
    36. }
    37. }
    38. bit LCD_Check_Busy(void)
    39. {
    40. P0 = 0xFF;
    41. RS_CLR;
    42. RW_SET;
    43. EN_CLR;
    44. _nop_();
    45. EN_SET;
    46. return (bit)(P0 & 0x80);
    47. }
    48. void LCD_Write_Com(unsigned char com)
    49. {
    50. while(LCD_Check_Busy());
    51. RS_CLR;
    52. RW_CLR;
    53. EN_SET;
    54. P0 = com;
    55. _nop_();
    56. EN_CLR;
    57. }
    58. void LCD_Write_Data(unsigned char Data)
    59. {
    60. while(LCD_Check_Busy());
    61. RS_SET;
    62. RW_CLR;
    63. EN_SET;
    64. P0 = Data;
    65. _nop_();
    66. EN_CLR;
    67. }
    68. void LCD_Clear(void)
    69. {
    70. LCD_Write_Com(0x01);
    71. DelayMs(5);
    72. }
    73. void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
    74. {
    75. if (y == 0)
    76. LCD_Write_Com(0x80 + x);
    77. else
    78. LCD_Write_Com(0xC0 + x);
    79. while (*s)
    80. {
    81. LCD_Write_Data( *s);
    82. s ++;
    83. }
    84. }
    85. void LCD_Init(void)
    86. {
    87. LCD_Write_Com(0x38);
    88. DelayMs(5);
    89. LCD_Write_Com(0x38);
    90. DelayMs(5);
    91. LCD_Write_Com(0x38);
    92. DelayMs(5);
    93. LCD_Write_Com(0x38);
    94. LCD_Write_Com(0x08);
    95. LCD_Write_Com(0x01);
    96. LCD_Write_Com(0x06);
    97. DelayMs(5);
    98. LCD_Write_Com(0x0C);
    99. }
    100. void LcdDisplay(unsigned long num)
    101. {
    102. char i;
    103. for (i = 5; i >= 0; i--)
    104. {
    105. display[i] = (num % 10) + 0x30;
    106. num = num / 10;
    107. }
    108. for (i = 0; i < 5; i++)
    109. {
    110. if (display[i] == 0x30)
    111. display[i] = ' ';
    112. else
    113. break;
    114. }
    115. LCD_Write_String(7,1, display);
    116. }
    117. void init()
    118. {
    119. TMOD = 0x51;
    120. TH0 = 0x4c;
    121. TL0 = 0x00;
    122. TH1 = 0x00;
    123. TL1 = 0x00;
    124. ET0 = 1;
    125. ET1 = 1;
    126. EA = 1;
    127. PT1 = 1;
    128. TR0 = 1;
    129. TR1 = 1;
    130. }
    131. void main()
    132. {
    133. unsigned long frequency;
    134. P3 = 0xFF;
    135. init();
    136. LCD_Init();
    137. LCD_Clear();
    138. LCD_Write_String(0,0, LcdLine1);
    139. LCD_Write_String(0,1, LcdLine2);
    140. while (1)
    141. {
    142. if (Flag)
    143. {
    144. Hdata = TH1;
    145. Ldata = TL1;
    146. frequency = ((Pulse*65535)+(Hdata*256)+Ldata);
    147. Flag = 0;
    148. Pulse = 0;
    149. TH1 = 0x00;
    150. TL1 = 0x00;
    151. TH0 = 0x4c;
    152. TL0 = 0x00;
    153. TR1 = 1;
    154. TR0 = 1;
    155. }
    156. LcdDisplay(frequency);
    157. }
    158. }
    159. void Time0() interrupt 1
    160. {
    161. TL0 = 0x00;
    162. TH0 = 0x4c;
    163. Counter++;
    164. if (Counter == 20)
    165. {
    166. TR0 = 0;
    167. TR1 = 0;
    168. Counter = 0;
    169. Flag = 1;
    170. }
    171. }
    172. void Time1() interrupt 3
    173. {
    174. Pulse++;
    175. }
    复制代码


    这是生活君自己所写的程序,然后烧录在自己的开发板上,得到了下面的结果:
  • 2c44000408342625e7b8.jpg
  • 使用12Mhz的晶振,51单片机外部技术最大速率为500Khz,如果想要更大量程的频率计,小伙伴们可以采用分频模块扩大量程,另外还可以在信号输入端接入放大整形模块,便于测量,结果更准确,显示方式可以改成数码管显示,小伙伴们可以自行添加功能。


回复

使用道具 举报

ID:98792 发表于 2017-7-27 14:44 | 显示全部楼层
这是我在头条上面发表的文章
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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