#NE555方波发生器#

①认识NE555方波发生器

纯硬件设计,不需底层操控

计算一秒钟之内有多少个频率响应(计数器计数时溢出的个数)

在开发板上,时信号发生电器,通过滑动变阻器Rb3可以改变输出信号的频率不受程序控制

②注意点

1.用到NE555,跳线帽将J3的SIGNAL与P34短接,将NE555发生的信号输入到单片机P34引脚

2.NE555电路是信号发生电路,信号输入接到单片机P34引脚,即单片机T0引脚

3.该信号的频率大小可以通过Rb3可调电位器改变

③NE555频率测量方波原理

1.测量原理:计算一秒钟信号有多少个上升沿

eg.若一秒内只有一个上升沿,则周期为一秒,频率为1hz

同理:一秒内有x个上升沿,则周期为1/x秒,频率xhz

如何实现?

2.定时器中断不仅有定时功能,还有计数功能(功能二选一)

用俩个中断,一个计时(定时器1),一个计数(定时器0)

④NE555程序设计

1.原理设计

定时器0模式:计数器

C/T=1(计数)

GAME=0

M1M2选择八位自动重装模式10,TL0初值255(最大值为255),检测到一个上升沿,就会溢出标志位触发中断服务函数(八位自动归0),count++,自动将TH0值重新装入TL0(TH0初值位255)

定时器1模式:计时器

C/T=0(计时)

GAME=0

M1M2选择十六位自动重装模式,初值为50ms(有加减法)

2.题目要求

单片机测量信号频率,并显示在数码管中,频率数据显示用5位数码管,单位hz,当显示长度不足5位数,未使用到的数码管熄灭

若数字23456

个位:23456%10=6

十位:23456%100/10=5

百位:23456/100%10=4

千位:23456/1000%10=3

万位:23456/10000=2

3.程序编程

#include <reg52.h>

//初定义
sbit LSA=P2^5;
sbit LSB=P2^6;
sbit LSC=P2^7;
sfr AUXR=0x8e;//记住
//后定义
code unsigned int smg_num[]={0xc0 , 0xf9 , 0xa4 , 0xb0 , 0x99 , 0x92 , 0x82 , 0xf8 , 0x80 , 0x90 , 0x88 , 0x80 , 0xc6 , 0xc0 , 0x86 , 0x8e ,0xbf , 0x7f };
//unsigned int count1;//记录频率
unsigned int count2;//记录定时器中断服务函数1秒钟
unsigned int frequent ;//在数码管上显示频率
//hc573定义
void hc573(unsigned int channel)
{
	switch(channel)
	{
		case 4:LSA=0;LSB=1;LSC=1;break;
		case 5:LSA=1;LSB=0;LSC=1;break;
		case 6:LSA=0;LSB=1;LSC=1;break;
		case 7:LSA=1;LSB=1;LSC=1;break;
	}
}
//初始化
void init_sys()
{
	hc573(4);
	P0=0XFF;
	hc573(5);
	P0=0X00;
}
//方法一
//定时器初始化
void init_timer()
{
	TMOD=0X05;//TMOD=0X06;
	TH0=0x00;//TH0=0xff
	TL0=0x00;//定时器0为计数器//TL0=0xff
	TH1=(65536-50000)/256;
	TL1=(65536-50000)%256;//定时器1为计时器
	EA=1;
	ET0=1;
	ET1=1;
	TR0=1;
	TR1=1;
}
定时器0中断服务函数//定时器0为计数器
void timer0() interrupt 1
{
	count1++;//上升沿记录
	
}
//定时器中断服务函数//定时器1为计时器
void timer1() interrupt 3
{
	count2++;
	if(count2==20)//计时1秒钟
	{
		//上升沿个数在数码管上显示出来
		frequent=TL0+TH0*256;//frequent=count1 ;
		//count1=0;
		TL0=0x00;
		TH0=0X00;
		count2=0;
	}
}
//延时函数
void delay_ms(unsigned int xms)
{
	for( ;xms>0;xms--)
	{
		unsigned char data i, j;

		i = 12;
		j = 169;
		do
		{
			while (--j);
		} while (--i);
	}
}

//数码管显示与消隐
void smg(unsigned int pos,unsigned int num)
{
	hc573(7);
	P0=0Xff;
	hc573(6);
	P0= 0x01<<(pos-1);
	hc573(7);
	P0=smg_num[num];
	delay_ms(1);
}
//数码管显示
void display()
{
	if(frequent>9999)//五位数
		smg(4,frequent/10000);
	if(frequent>999)//四位数
		smg(5,frequent/1000%10);
	if(frequent >99)//三位数
		smg(6,frequent/1000%10);
	if(frequent>9)//俩位数
		smg(7,frequent%100/10);
	smg(8,frequent%10);
}
//主函数
void main()
{
	init_sys();
	init_timer();
	while(1)
	{
		display();
	}
}
3.1方法二编写

原理设计

TH0和TL0初始化为0x00,检测到一个上升沿就加一

void TimerInit()
{
    TMOD=0x05;
    TL0=0x00;
    TH0=0x00;
    TL1=(65536-50000)%256;
    TH1=(65536-50000)/256;
    EA=1;
    ET0=ET1=1;
    TR0=TR1=1;
}

void timer1() interrupt 3
{
    count2++;
    if(count2==20)
    {
        Fre=TL0+TH0*256;
        TL0=0;
        TH0=0;
        count2=0;
    }
}

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐