本次学习NE555方波发生器, 先贴上原理图:
我们可以发现,板载的NE555已经被接好了, 可控制的端口只留下了NET_SIG, 也就是方波输出端, 观察CT107D开发板, 我们可以在最右边发现方波输出端口的排针.
我们使用跳线帽将SIGNAL与P34相连, 则信号输出端与定时器0的计数端口相连接了.
基本思路:
NE555的方波发生端和定时器0P3^4的接口在一起, 我们需要先开启定时器1,再将定时器0变为计数器, 在定时器1的规定时间内
去统计方波下降沿的次数,根据求频率的公式便可以得出频率.
下面贴上代码:
/*
NE555定时器实验, CT107D已经为我们准备好了NE555方波发生器的电路,我们只需要旋转Rb3电位器就可以
调节其输出频率, 我们需要用定时器和计数器去算出其频率即可;
基本思路: NE555的方波发生端和定时器0P3^4的接口在一起, 我们需要先开启定时器1,再将定时器0变为计数器, 在定时器1的规定时间内
去统计方波下降沿的次数,便可以得出频率.
*/
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f};
uchar DisplayData[]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
uint NE555_Falling,NE555_Time,NE555_Frequency; //下降沿个数 /555的时间 /频率
uchar DisplaySite;
void ChooseNixie(uchar site,uchar num);
void Delay(uint i);
void Display();
void main()
{
TMOD=0x16; //定时器0使用计数模式,8位自动初值重装的计数器 0110; 启用定时器1作为定时器,统计NE555发生脉冲之间的时间
TH0=0xFF; TL0=0xFF; //计数器初值为满值, 这样当检测到一次下降沿时就可以触发中断
TH1=(65536-5000)/256; TL1=(65536-5000)%256; //定时器1定时中端一次为5ms
ET0=1; ET1=1; EA=1;
TR0=1; TR1=1;
while (1)
{
Display();
}
}
void Timer0() interrupt 1 //定时器0作为计数器,当检测到下降沿时触发中断
{
NE555_Falling++;
}
void Timer1() interrupt 3 //定时器1作为定时器,计算周期
{
TH1=(65536-5000)/256; TL1=(65536-5000)%256; //定时器1定时中端一次为5ms
NE555_Time++;
if (NE555_Time==20) //100ms //计算100ms内NE555发生下降沿的个数,由此求得频率
{
NE555_Frequency = NE555_Falling*10; //频率为1s内发生下降沿的个数,定时为0.1s,则需要*10
NE555_Falling=0;
NE555_Time=0;
}
}
void ChooseNixie(uchar site,uchar num)
{
P2=(P2&0x1F)|0xE0; P0=0xFF; P2&=0x1F;
P2=(P2&0x1F)|0xC0; P0=1<<site; P2&=0x1F;
P2=(P2&0x1F)|0xE0; P0=num; P2&=0x1F;
}
void Delay(uint i)
{
while (i--);
}
void Display()
{
DisplayData[7] = table[NE555_Frequency%10];
DisplayData[6] = table[NE555_Frequency%100/10];
DisplayData[5] = NE555_Frequency >100 ? table[NE555_Frequency%1000/100] : 0xFF;
DisplayData[4] = NE555_Frequency >= 1000 ? table[NE555_Frequency%10000/1000] : 0xFF;
DisplayData[3] = NE555_Frequency >= 10000 ? table[NE555_Frequency/10000] : 0xFF;
for (DisplaySite=3;DisplaySite<8;DisplaySite++)
{
ChooseNixie(DisplaySite,DisplayData[DisplaySite]);
Delay(60);
}
}
烧录到单片机后旋转电位器Rb3则可以在板子上看到NE555的频率.