⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 text1.c

📁 用外部中断测频率:从P3.7端口引入频率
💻 C
字号:
/*
若晶振频率为12MHZ,如何用T0来测量20ms-1s之间的方波周期?
又如何测量频率为0.5MHZ左右的脉冲频率?
*/
/*
实现方法:
用外部中断,选择下降沿触发,程序响应中断后马上开启定时器,
在下个下降沿来临的时候关掉定时器。
*/
#include<regX51.h>
#include<intrins.h>

#define uchar unsigned char
#define uint  unsigned int


 
uint  time0_tick=0;
uchar tick=0;
uchar count[4]={0,0,0,0};


bit flag = 1;

code seven_seg[10]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90};
code scan[4]={0X08,0X04,0X02,0X01};//直接用P3驱动共阳七段显示器;


static void time0_isr(void)interrupt TF0_VECTOR using 2
{
   TH0  = (65536-10000)/256;
   TL0  = (65536-10000)%256;
   P0_7 = ~ P0_7; //波动形象化。
   if(flag)
   {
   		count[0]++;
   			if(count[0]==10)
   			{
   				count[0]=0;
   				count[1]++;
   				if(count[1]==10)
   				{
   					count[1]=0;
   					count[2]++;
   					if(count[2]==10)
   					{
   						count[2]=0;
   						count[3]++;
   						if(count[3]==10)count[3]=0;
   					}
   				}
   			}   		
	}
}

static void xint0_isr(void)interrupt IE0_VECTOR using 1//外部中断
{
	tick++;
	if(tick == 1)
	{	
		count[0]=0;
		count[1]=0;
		count[2]=0;
		count[3]=0;
		flag = 1;
		TR0  = 1;
	}
	if(tick == 2)
	{
		tick = 0;//置零重新开始读取波段
		flag = 0;
		TR0  = 0;
	//	EX0  = 0;    //不允许int0中断;
	}
}

void delay(uchar ms)
{
	uchar i,j;
	for(i=0;i<ms;i++)
		for(j=0;j<250;j++)
		{
			_nop_();
			_nop_();
			_nop_();
			_nop_();
		}
}

static void timer0_initialize(void)
{	
    EA=0;	// 所有中断关
	TR0=0;  
	TMOD = 0x01; // T0 模式1 16位计数器
	TH0  = (65536-10000)/256; //直接二进制取位赋值
	TL0  = (65536-10000)%256;
	PT0=1;
	ET0=1;
	//TR0=1;
	EA=1;	
}

static void xint0_initialize(void)
{
	EA=0;
	IT0=1;
	EX0=1;
	EA=1;	
}
void main()
{

	uchar i;	
	xint0_initialize();

	timer0_initialize();

	while(1)
	{
		for(i=0;i<4;i++)
		{
			P2=seven_seg[count[i]];
   			P1=scan[i];
			delay(5);
			P1 = 0x00;
		}
	} 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -