14-NE555脉冲发生器

NE555脉冲发生器

原理图

在这里插入图片描述

代码
/**************************************************************************************
*		              NE555脉冲发生器实验												  *
实验现象:下载程序后,数码管接2-2、2-3、2-4,NE555接法如图
注意事项:将NE555的短接片J11短接起来
***************************************************************************************/

#include "reg52.h"			 //此文件中定义了单片机的一些特殊功能寄存器

typedef unsigned int u16;	  //对数据类型进行定义
typedef unsigned char u8;



//--定义使用的IO--//
#define GPIO_DIG P0

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;


u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
					0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//ÏÔʾ0~FµÄÖµ

u8 DisplayData[8];

//--定义全局变量--//
unsigned long   Freq;        //用来存放要显示的频率值
unsigned long	TimeCount;   //用于计算1s钟的


/*******************************************************************************
* 函数名        : delay
* 函数功能		   : 延时函数
*******************************************************************************/
void delay(u16 i)
{
	while(i--);	
}

/*******************************************************************************
* 函数名         : DigDisplay
* 函数功能		   : 数码管动态扫描函数,循环扫描8个数码管显示
*******************************************************************************/
void DigDisplay()
{
	u8 i;
	for(i=0;i<8;i++)
	{
		switch(i)	 //位选,选择点亮的数码管
		{
			case(0):
				LSA=0;LSB=0;LSC=0; break;//显示第0位
			case(1):
				LSA=1;LSB=0;LSC=0; break;//显示第1位
			case(2):
				LSA=0;LSB=1;LSC=0; break;//显示第2位
			case(3):
				LSA=1;LSB=1;LSC=0; break;//显示第3位
			case(4):
				LSA=0;LSB=0;LSC=1; break;//显示第4位
			case(5):
				LSA=1;LSB=0;LSC=1; break;//显示第5位
			case(6):
				LSA=0;LSB=1;LSC=1; break;//显示第6位
			case(7):
				LSA=1;LSB=1;LSC=1; break;//显示第7位
		}
		GPIO_DIG=DisplayData[i];//发送段码
		delay(100); //间隔一段时间扫描
		GPIO_DIG=0x00;//消隐
	}
}


/*******************************************
*函数名		:TIMER_Configuration
*功能 	     :配置定时/计数器T0和T1

*******************************************/

void Timer_Config()
{
	//--定时器T1做计数器,工作方式1(16位定时器),只由TRx打开计数器--//
	//--定时器T0做计数器,工作方式1(16位定时器),只由TRx打开计数器--//	
	TMOD=0x51;

	//--设置定时器晶振为12MHZ时定时50ms--//
	TH0=0x3C;
	TL0=0xB0;

	//--打开中断-//
	ET0=1;
	ET1=1;
	EA=1;

	//--打开定时器*/
	TR0=1;
	TR1=1;
}

/*******************************************************************************
* 函数名      : main
* 函数功能		 : 主函数

*******************************************************************************/
void main()
{	
	Timer_Config();
	
	while(1)
	{
		if(TR1 == 0)         //当计数器停下的时候,表示计数完毕
		{
			Freq = Freq + TL1;         //读取TL的值
			Freq = Freq + (TH1 * 256); //读取TH的值

			//--求频率的个十百千万十万位--//
			DisplayData[0] = smgduan[Freq%1000000/100000];	
			DisplayData[1] = smgduan[Freq%100000/10000];	
			DisplayData[2] = smgduan[Freq%10000/1000];	
			DisplayData[3] = smgduan[Freq%1000/100];	
			DisplayData[4] = smgduan[Freq%100/10];	
			DisplayData[5] = smgduan[Freq%10];
			
			//--显示完,重新计算下一次频率--//	
			Freq = 0;//将计算的频率清零
			TH1 = 0; //将计数器的值清零
			TL1 = 0;
			TR0 = 1; //开启定时器
			TR1 = 1; //开启计数器	
		}

		//--显示求得的数值--//
		DigDisplay();
	}				
}


/*******************************************
*函数名		:Timer0
*功能 	:定时器0的中断函数

*******************************************/

void Timer0() interrupt 1
{
	//--12MHZ设置定时50ms的初值--//
	TH0=0x3C;
	TL0=0xB0;
	
	TimeCount++;
	if(TimeCount==20)//计时到1S
	{
		TR0=0;
		TR1=0;
		TimeCount=0;		
	}		
}
/*******************************************
*函数名	:Timer1
*功能 	:定时器1的中断函数

*******************************************/

void Timer1() interrupt 3
{	
	//--进入一次中断,表明计数到了65536--//
	Freq=Freq+65536;		
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星空永存

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值