聪明文档网

聪明文档网

最新最全的文档下载
当前位置: 首页> 基于51单片机555定时器试验- - 频率计

基于51单片机555定时器试验- - 频率计

时间:2015-07-31 01:03:08    下载该word文档

555定时器及其应用

  【摘 要】555定时器是一种模拟和数字功能相结合的中规模集成器件。本文介绍555定时器以及由555定时器的应用。

  【关键词】555定时器 应用

  555定时器是一种模拟和数字功能相结合的中规模集成器件。一般用双极性工艺制作的称为555,CMOS工艺制作的称为7555,除单定时器外,还有对应的双定时器556 /7556555定时器的电源电压范围宽,可在4. 5V16V工作, 7555可在318V工作,输出驱动电流约为200mA,因而其输出可与TTLCMOS或者模拟电路电平兼容。

555定时器成本低,性能可靠,只需要外接几个电阻、电容,就可以实现多谐振荡器、单稳态触发器及施密特触发器等脉冲产生与变换电路。它也常作为定时器广泛应用于仪器仪表、家用电器、电子测量及自动控制等方面。555定时器的部电路框图和外引脚排列图分别如图2. 9. 1和图2. 9. 2所示。它内部包括两个电压比较器,三个等值串联电阻,一个RS触发器,一个放电管T及功率输出级。提供两个基准电压VCC /3 2VCC /3555定时器的功能主要由两个比较器决定。两个比较器的输出电压控制RS触发器和放电管的状态。在电源与地之间加上电压,5脚悬空时,则电压比较器A1的反相输入端的电压为2VCC /3,A2的同相输入端的电压为VCC /3。若触发输入端TR 的电压小于VCC /3,则比较器A2 的输出为1可使RS触发器置1,使输出端OUT = 1。如果阈值输入端TH的电压大于2VCC /3,同时TR端的电压大于VCC /3,A1的输出为1,A2的输出为0,可将RS触发器置0,使输出为0电平。

  555定时器的应用举例

1. 555触摸定时开关。集成电路IC1是一片555定时电路,在这里接成单稳态电路。平时由于触摸片P端无感应电压,电容C1通过5557脚放电完毕,3脚输出为低电平,继电器KS释放,电灯不亮。

  当需要开灯时,用手触碰一下金属片P,人体感应的杂波信号电压由C2加至555的触发端,使555的输出由低变成高电平,继电器KS吸合,电灯点亮。同时, 5557脚内部截止,电源便通过R1C1充电,这就是定时的开始。当电容C1上电压上升至电源电压的2 /3, 5557脚道通使C1放电,使第3脚输出由高电平变回到低电平,继电器释放,电灯熄灭,定时结束。定时长短由R1C1 决定: T1 = 1. 1R1 3 C1。按图中所标数值,定时时间约为4分钟。D1可选用1N41481N4001

2. 简易催眠器。时基电路555构成一个极低频振荡器,输出一个个短的脉冲,使扬声器发出类似雨滴的声音(见附图) 。扬声器采用2英寸、8欧姆小型动圈式雨滴声的速度可以通过100K电位器来调节到合适的程度。如果在电源端增加一简单的定时开关,则可以在使用者进入梦乡后及时切断电源。

  3. 555制作的D类放大器。由IC 555 R1R2C1等组成100KHz可控多谐振荡器,占空比为50%,控制端5 脚输入音频信号, 3脚便得到脉宽与输入信幅值成正比的脉冲信号,LC3接调、滤波后推动扬声器。

  4. 相片曝光定时器。附图电路是用555单稳电路制成的相片曝光定时器人工启动式单稳电路。工作原理: 电源接通后,定时器进入稳态。此时定时电容CT的电压为: VCT =VCC = 6V。对555这个等效触发器来讲,两个输入都是高电平,VS = 0。继电器KA不吸合,常开点是打开的,曝光照明灯HL不亮。按一下按钮开关SB之后,定时电容CT立即放到电压为零。于是此时555电路等效触发的输入成为: R = 0S = 0,它的输出就成高电平:V0 = 1。继电器KA吸动,常开接点闭合,曝光照明灯点亮。按钮开关按一下后立即放开,于是电源电压就通过RT向电容CT充电,暂稳态开始。当电容CT上的电压升到2 /3VCC4 伏时,定时时间已到, 555等效电路触发器的输入为: R = 1S = 1,于是输出又翻转成低电平: V0 = 0。继电器KA释放,曝光灯HL 熄灭。暂稳态结束,有恢复到稳态。曝光时间计算公式为: T = 1. 1RT3 CT。本电路提供参数的延时时间约为1秒~2分钟,可由电位器RP调整和设置。电路中的继电器必需选用吸合电流不应大于30mA的产品,应根据负载(HL)的容量大小选择继电器触点容量。

/*******************************************************************

* *

* 555定时器试验 -—— 频率计 *

* *

* *

* LCD1602显示 *

*改变VR1电位器的电阻值,观察液晶屏频率发生变化 *

* *

*******************************************************************/

#include

#include

unsigned char code cdis1[] =

{

" CYMOMETER " //频率计

};

unsigned char code cdis2[] =

{

"FREQ: Hz "

};

sbit LCD_RS = P2 ^ 6;

sbit LCD_RW = P2 ^ 5;

sbit LCD_EN = P2 ^ 7;

bit sec = 0;

unsigned char msec = 0, Hdata = 0, Ldata = 0, Count = 0;

unsigned long temp = 0;

unsigned char data display[] =

{

0x00, 0x00, 0x00, 0x00, 0x00, 0x00

};

char code reserve[3]_at_ 0x3b; //保留0x3b开始的3个字节

/*********************************************************

us延时函数 (4.34us)

*********************************************************/

void delayNOP()

{

_nop_();

_nop_();

_nop_();

_nop_();

}

/*********************************************************

ms延时函数

*********************************************************/

void delayms(unsigned int ms)

{

unsigned char n;

while (ms--)

{

for (n = 0; n < 114; n++)

;

}

}

/**********************************************************

* *

* 检查LCD忙状态 *

* lcd_busy1时,忙,等待。 *

* lcd-busy0,闲,可写指令与数据。 *

* *

**********************************************************/

bit lcd_busy()

{

bit result;

LCD_RS = 0;

LCD_RW = 1;

LCD_EN = 1;

delayNOP();

result = (bit)(P0 &0x80);

LCD_EN = 0;

return (result);

}

/**********************************************************

* *

*写指令数据到LCD *

*RS=LRW=LE=高脉冲,D0-D7=指令码。 *

* *

**********************************************************/

void lcd_wcmd(unsigned char cmd)

{

while (lcd_busy())

;

LCD_RS = 0;

LCD_RW = 0;

LCD_EN = 1;

P0 = cmd;

delayNOP();

LCD_EN = 0;

}

/**********************************************************

* *

*写显示数据到LCD *

*RS=HRW=LE=高脉冲,D0-D7=数据。 *

* *

**********************************************************/

void lcd_wdat(unsigned char dat)

{

while (lcd_busy())

;

LCD_RS = 1;

LCD_RW = 0;

LCD_EN = 1;

P0 = dat;

delayNOP();

LCD_EN = 0;

}

/**********************************************************

* *

* LCD初始化设定 *

* *

**********************************************************/

void lcd_init()

{

delayms(15);

lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据

delayms(5);

lcd_wcmd(0x38);

delayms(5);

lcd_wcmd(0x38);

delayms(5);

lcd_wcmd(0x0c); //开显示,不显示光标

delayms(5);

lcd_wcmd(0x06); //

delayms(5);

lcd_wcmd(0x01); //清除LCD的显示内容

delayms(5);

}

/**********************************************************

* *

* 设定显示位置 *

* *

**********************************************************/

void lcd_pos(unsigned char pos)

{

lcd_wcmd(pos | 0x80); //数据指针=80+地址变量

}

/**********************************************************

* *

* 显示函数 *

* *

**********************************************************/

void play()

{

unsigned char n;

for (n = 0; n <= 4; n++)

//数据转换

{

display[n] = temp % 10+0x30;

temp = temp / 10;

}

display[5] = temp + 0x30;

for (n = 5; n > 0; n--)

//高位为"0"不显示

{

if (display[n] == 0x30)

display[n] = 0x20;

else

break;

}

lcd_pos(0x46); //显示实际频率值

for (n = 5; n != 0xff; n--)

lcd_wdat(display[n]);

}

/*********************************************************

* *

* 主函数 *

* *

*********************************************************/

void main()

{

unsigned char m;

unsigned long frq_num;

P3 = 0xff;

lcd_init();

lcd_pos(0x00); //设置显示位置为第一行

for (m = 0; m < 16; m++)

lcd_wdat(cdis1[m]);

//显示字符

lcd_pos(0x40); //设置显示位置为第二行

for (m = 0; m < 16; m++)

lcd_wdat(cdis2[m]);

//显示字符

TMOD = 0x51; //定时器0工作在定时方式

//定时器1工作在计数方式

TH0 = 0x4c; //50ms定时

TL0 = 0x00;

TH1 = 0x00; //计数初值

TL1 = 0x00;

ET0 = 1; //使能TIMER0中断

ET1 = 1; //使能TIMER1中断

EA = 1; //允许中断

PT1 = 1; //定义TIMER1中断优先

TR0 = 1;

TR1 = 1;

while (1)

{

if (sec)

{

Hdata = TH1; //取计数值

Ldata = TL1;

frq_num = ((Count *65535+Hdata * 256+Ldata) *108 / 100);

TH1 = 0;

TL1 = 0;

sec = 0;

Count = 0;

TR1 = 1;

TR0 = 1;

}

temp = frq_num;

play();

}

}

/**********************************************************

* *

* Time0中断函数 *

* *

**********************************************************/

void Time0()interrupt 1

{

TH0 = 0x4c; //50ms定时

TL0 = 0x00;

msec++;

if (msec == 20)

//50*20=1S

{

TR0 = 0; //关闭TIMER0

TR1 = 0; //关闭TIMER1

msec = 0;

sec = 1; //置秒标记位

}

}

/**********************************************************

* *

* Time1中断函数 *

* *

**********************************************************/

void Time1()interrupt 3

{

Count++;

}

/*********************************************************/

  • 29.8

    ¥45 每天只需1.0元
    1个月 推荐
  • 9.9

    ¥15
    1天
  • 59.8

    ¥90
    3个月

选择支付方式

  • 微信付款
郑重提醒:支付后,系统自动为您完成注册

请使用微信扫码支付(元)

订单号:
支付后,系统自动为您完成注册
遇到问题请联系 在线客服

常用手机号:
用于找回密码
图片验证码:
看不清?点击更换
短信验证码:
新密码:
 
绑定后可用手机号登录
请不要关闭本页面,支付完成后请点击【支付完成】按钮
遇到问题请联系 在线客服