NE555 (Timer IC)为8脚时基集成电路,NE555是属于555系列的计时IC的其中的一种型号,555系列IC的接脚功能及运用都是相容的,只是型号不同的因其价格不同其稳定度、省电、可产生的振荡频率也不大相同;而555是一个用途很广且相当普遍的计时IC,只需少数的电阻和电容,便可产生数位电路所需的各种不同频率之脉波讯号。
主要特点:
1.只需简单的电阻器、电容器,即可完成特定的振荡延时作用。其延时范围极广,可由几微秒至几小时之久。
2.它的操作电源范围极大,可与TTL,CMOS等逻辑电路配合,也就是它的输出电平及输入触发电平,均能与这些系列逻辑电路的高、低电平匹配。
3.其输出端的供给电流大,可直接推动多种自动控制的负载。
4.它的计时精确度高、温度稳定度佳,且价格便宜。
引脚位:
Pin 1 (接地) -地线(或共同接地) ,通常被连接到电路共同接地。
Pin 2 (触发点) -这个脚位是触发NE555使其启动它的时间周期。触发信号上缘电压须大于2/3 VCC,下缘须低于1/3 VCC 。
Pin 3 (输出) -当时间周期开始555的输出脚位,移至比电源电压少1.7伏的高电位。周期的结束输出回到O伏左右的低电位。于高电位时的最大输出电流大约200 mA 。
Pin 4 (重置) -一个低逻辑电位送至这个脚位时会重置定时器和使输出回到一个低电位。它通常被接到正电源或忽略不用。
Pin 5 (控制) -这个接脚准许由外部电压改变触发和闸限电压。当计时器经营在稳定或振荡的运作方式下,这输入能用来改变或调整输出频率。
Pin 6 (重置锁定) - Pin 6重置锁定并使输出呈低态。当这个接脚的电压从1/3 VCC电压以下移至2/3 VCC以上时启动这个动作。
Pin 7 (放电) -这个接脚和主要的输出接脚有相同的电流输出能力,当Pin3为低电平时,Pin7对地为低阻态(对地导通),当Pin3为高电平时,Pin7对于为高阻态
Pin 8 (V +) -这是555计时器IC的正电源电压端。供应电压的范围是+4.5伏特(最小值)至+16伏特(最大值)。
NE555在蓝桥杯单片机省赛中只考过一次,是在第十届省赛中,要求使用NE555完成对Pinlv的测量和显示。如下图所示:
接下来我们要做的就是对第十届蓝桥杯省赛里关于频率测量这部分做一个单独的简单程序设计。
设计内容:
1.按照上图显示格式显示采集到的频率值显示在数码管上;
2.频率数据显示使用 6 位数码管,当显示的数据长度不足 6 位时,未使用到的数码管位应熄灭。
说明:频率测量功能需将竞赛板 J3-SIGNAL 引脚与 P34 引脚短接。频率大小调节通过板子上的RB3来实现。
#include
#define uchar unsigned char //定义无符号字符类型uchar
#define uint unsigned int //定义无符号整型类型uint
uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff,0x8e};//数字0~9,“-”,“关”,“F”
uchar yi,er,san,si,wu,liu,qi,ba; //定义字符型变量yi,er,san,si,wu,liu,qi,ba,当作数码管显示控制变量
uint fan,fan_send,zheng,zheng_send,trie,pinlv,time;
bit flag=0;
void delayms(int ms); //延时函数
void allinit(); //初始化函数
void display1(uchar yi,uchar er); //第一、二段数码管函数
void display2(uchar san,uchar si); //第三、四段数码管函数
void display3(uchar wu,uchar liu); //第五、六段数码管函数
void display4(uchar qi,uchar ba); //第七、八段数码管函数
void Timer0Init(void); //5微秒@12.000MHz
void Timer1Init(void); //1毫秒@12.000MHz
void Frequency(); //频率测量显示函数
void main()//主函数
{
allinit(); //初始化函数
Timer0Init();
Timer1Init();
yi=1;er=2;san=3;si=4;wu=5;liu=6;qi=7;ba=8;//让数码管依次显示1~8,用来检验数码管显示函数程序是否有误
while(1)
{
Frequency(); //频率测量显示函数
display1(yi,er); //第一、二段数码管函数
display2(san,si); //第三、四段数码管函数
display3(wu,liu); //第五、六段数码管函数
display4(qi,ba); //第七、八段数码管函数
}
}
void Frequency() //频率测量显示函数
{
yi=12;er=11;san=11;
if(pinlv>=10000){si=pinlv/10000;wu=pinlv%10000/1000;liu=pinlv%1000/100;qi=pinlv%100/10;ba=pinlv%10;}
else if(pinlv>=1000){si=11;wu=pinlv/1000;liu=pinlv%1000/100;qi=pinlv%100/10;ba=pinlv%10;}
else if(pinlv>=100){si=11;wu=11;liu=pinlv/100;qi=pinlv%100/10;ba=pinlv%10;}
else if(pinlv>=10){si=11;wu=11;liu=11;qi=pinlv/10;ba=pinlv%10;}
}
void Timer0Init(void) //5微秒@12.000MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xC4; //设置定时初值
TH0 = 0xFF; //设置定时初值
TF0 = 0; //清除TF0标志
// TR0 = 1; //定时器0开始计时
}
void time0() interrupt 1
{
if(P34==0)
{
fan++;
if(flag==0)
{
flag=1;
zheng_send=zheng;
zheng=0;
}
}
else if(P34==1)
{
zheng++;
if(flag==1)
{
flag=0;
fan_send=fan;
fan=0;
}
}
}
void Timer1Init(void) //1毫秒@12.000MHz
{
AUXR |= 0x40; //定时器时钟1T模式
TMOD &= 0x0F; //设置定时器模式
TL1 = 0x20; //设置定时初值
TH1 = 0xD1; //设置定时初值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
EA=1;ET1=1;
}
void time1() interrupt 3
{
trie++;
if(trie==969)
{
TR0 = 1;ET0=1;
}
else if(trie==999)
{
TR0 = 0;ET0=0;
trie=0;
time=(zheng_send+fan_send)*5;
pinlv=1000000/time;
}
}
void delayms(int ms)//延时函数
{
uint i,j;
for(i=ms;i>0;i--)
for(j=845;j>0;j--);
}
void allinit()//初始化函数
{
P2=0XA0;P0=0X00; //关闭蜂鸣器继电器
P2=0X80;P0=0XFF; //关闭所有LED灯
P2=0XC0;P0=0XFF; //选中所有数码管段选
P2=0XFF;P0=0XFF; //关闭所有数码管
}
void display1(uchar yi,uchar er)//第一、二段数码管函数
{
P2=0XC0;P0=0X01; //选中第一个数码管位选
P2=0XFF;P0=tab[yi]; //让第一个数码管显示yi指向的值
delayms(1); //延时1ms
P2=0XC0;P0=0X02; //选中第二个数码管位选
P2=0XFF;P0=tab[er]; //让第一个数码管显示er指向的值
delayms(1); //延时1ms
}
void display2(uchar san,uchar si)//第三、四段数码管函数
{
P2=0XC0;P0=0X04; //选中第s三个数码管位选
P2=0XFF;P0=tab[san]; //让第一个数码管显示san指向的值
delayms(1); //延时1ms
P2=0XC0;P0=0X08; //选中第四个数码管位选
P2=0XFF;P0=tab[si]; //让第一个数码管显示si指向的值
delayms(1); //延时1ms
}
void display3(uchar wu,uchar liu)//第五、六段数码管函数
{
P2=0XC0;P0=0X10; //选中第五个数码管位选
P2=0XFF;P0=tab[wu]; //让第一个数码管显示wu指向的值
delayms(1); //延时1ms
P2=0XC0;P0=0X20; //选中第六个数码管位选
P2=0XFF;P0=tab[liu]; //让第一个数码管显示liu指向的值
delayms(1); //延时1ms
}
void display4(uchar qi,uchar ba)//第七、八段数码管函数
{
P2=0XC0;P0=0X40; //选中第七个数码管位选
P2=0XFF;P0=tab[qi]; //让第一个数码管显示qi指向的值
delayms(1); //延时1ms
P2=0XC0;P0=0X80; //选中第八个数码管位选
P2=0XFF;P0=tab[ba]; //让第一个数码管显示ba指向的值
delayms(1); //延时1ms
}