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;
}