蓝桥杯突击10-NE555方波发生器

本次学习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的频率.

  • 13
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值