基于51单片机555定时器试验频率计.docx
《基于51单片机555定时器试验频率计.docx》由会员分享,可在线阅读,更多相关《基于51单片机555定时器试验频率计.docx(13页珍藏版)》请在冰点文库上搜索。
基于51单片机555定时器试验频率计
基于51单片机555定时器试验--——-频率计
555定时器及其应用
【摘 要】555定时器是一种模拟和数字功能相结合的中规模集成器件。
本文介绍555定时器以及由555定时器的应用。
【关键词】555定时器 应用
555定时器是一种模拟和数字功能相结合的中规模集成器件。
一般用双极性工艺制作的称为555,用CMOS工艺制作的称为7555,除单定时器外,还有对应的双定时器556/7556。
555定时器的电源电压范围宽,可在4.5V~16V工作,7555可在3~18V工作,输出驱动电流约为200mA,因而其输出可与TTL、CMOS或者模拟电路电平兼容。
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通过555第7脚放电完毕,第3脚输出为低电平,继电器KS释放,电灯不亮。
当需要开灯时,用手触碰一下金属片P,人体感应的杂波信号电压由C2加至555的触发端,使555的输出由低变成高电平,继电器KS吸合,电灯点亮。
同时,555第7脚内部截止,电源便通过R1给C1充电,这就是定时的开始。
当电容C1上电压上升至电源电压的2/3时,555第7脚道通使C1放电,使第3脚输出由高电平变回到低电平,继电器释放,电灯熄灭,定时结束。
定时长短由R1、C1决定:
T1=1.1R13C1。
按图中所标数值,定时时间约为4分钟。
D1可选用1N41481N4001。
2.简易催眠器。
时基电路555构成一个极低频振荡器,输出一个个短的脉冲,使扬声器发出类似雨滴的声音(见附图)。
扬声器采用2英寸、8欧姆小型动圈式雨滴声的速度可以通过100K电位器来调节到合适的程度。
如果在电源端增加一简单的定时开关,则可以在使用者进入梦乡后及时切断电源。
3.用555制作的D类放大器。
由IC555和R1、R2、C1等组成100KHz可控多谐振荡器,占空比为50%,控制端5脚输入音频信号,3脚便得到脉宽与输入信幅值成正比的脉冲信号,经L、C3接调、滤波后推动扬声器。
4.相片曝光定时器。
附图电路是用555单稳电路制成的相片曝光定时器人工启动式单稳电路。
工作原理:
电源接通后,定时器进入稳态。
此时定时电容CT的电压为:
VCT=VCC=6V。
对555这个等效触发器来讲,两个输入都是高电平,即VS=0。
继电器KA不吸合,常开点是打开的,曝光照明灯HL不亮。
按一下按钮
bitsec=0;
unsignedcharmsec=0,Hdata=0,Ldata=0,Count=0;
unsignedlongtemp=0;
unsignedchardatadisplay[]=
{
0x00,0x00,0x00,0x00,0x00,0x00
};
charcodereserve[3]_at_0x3b;//保留0x3b开始的3个字节
/*********************************************************
us延时函数(4.34us)
*********************************************************/
voiddelayNOP()
{
_nop_();
_nop_();
_nop_();
_nop_();
}
/*********************************************************
ms延时函数
*********************************************************/
voiddelayms(unsignedintms)
{
unsignedcharn;
while(ms--)
{
for(n=0;n<114;n++)
;
}
}
/**********************************************************
**
*检查LCD忙状态*
*lcd_busy为1时,忙,等待。
*
*lcd-busy为0时,闲,可写指令与数据。
*
**
**********************************************************/
bitlcd_busy()
{
bitresult;
LCD_RS=0;
LCD_RW=1;
LCD_EN=1;
delayNOP();
result=(bit)(P0&0x80);
LCD_EN=0;
return(result);
}
/**********************************************************
**
*写指令数据到LCD*
*RS=L,RW=L,E=高脉冲,D0-D7=指令码。
*
**
**********************************************************/
voidlcd_wcmd(unsignedcharcmd)
{
while(lcd_busy())
;
LCD_RS=0;
LCD_RW=0;
LCD_EN=1;
P0=cmd;
delayNOP();
LCD_EN=0;
}
/**********************************************************
**
*写显示数据到LCD*
*RS=H,RW=L,E=高脉冲,D0-D7=数据。
*
**
**********************************************************/
voidlcd_wdat(unsignedchardat)
{
while(lcd_busy())
;
LCD_RS=1;
LCD_RW=0;
LCD_EN=1;
P0=dat;
delayNOP();
LCD_EN=0;
}
/**********************************************************
**
*LCD初始化设定*
**
**********************************************************/
voidlcd_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);
}
/**********************************************************
**
*设定显示位置*
**
**********************************************************/
voidlcd_pos(unsignedcharpos)
{
lcd_wcmd(pos|0x80);//数据指针=80+地址变量
}
/**********************************************************
**
*显示函数*
**
**********************************************************/
voidplay()
{
unsignedcharn;
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]);
}
/*********************************************************
**
*主函数*
**
*********************************************************/
voidmain()
{
unsignedcharm;
unsignedlongfrq_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中断函数*
**
**********************************************************/
voidTime0()interrupt1
{
TH0=0x4c;//50ms定时
TL0=0x00;
msec++;
if(msec==20)
//50*20=1S
{
TR0=0;//关闭TIMER0
TR1=0;//关闭TIMER1
msec=0;
sec=1;//置秒标记位
}
}
/**********************************************************
**
*Time1中断函数*
**
**********************************************************/
voidTime1()interrupt3
{
Count++;
}
/*********************************************************/