STC8A8K64S4使用定时器0(测量脉宽-INT0高电平宽度)

步骤及现象:下载程序前,选择STC-ISP的IRC频率:12MHz,同时用杜邦线短接P3.2与P1.6引脚(测量的脉宽是我们借助定时器1,使P1.6引脚先产生10ms低电平,接着产生5ms高电平)。下载完成后,这时数码管会显示【10000】,这个数字表示INT0处于高电平的次数,每次是1us,总共为10ms。到这,大家会疑问我们测得是INTO高电平宽度,为啥数码管上的数字计算出的是脉冲的低电平时间呢?我们通过逻辑分析仪,测P1.6引脚。最后得到的会是10ms高电平和5ms低电平。可见我们测的结果和逻辑分析仪的结果是相同的。

#include <stc8.h>
#include "timer1.h"
#include "hc595.h"

sbit INT0 = P3^2;        // 外部中断引脚
sbit wave = P1^6;        // wave表示引脚P1.6
bit flag1 = 0;  // flag1决定P1.6输出高低电平
unsigned long count=0;   // 存放INT0为高电平的次数,一次为1us
unsigned char xdata table[8] = {0x00};  // 用于数码管显示

/*********************************
 * @函数名:T0Init
 * @描  述:配置定时器0模式1,晶振:12MHz,12T
 * @参  数:无
 * @返回值:无
 *********************************/
void T0Init()
{
	TMOD &= 0xF0;     // 不改变T1配置的前提下,清空T0的配置
	TMOD |= 0x09;     // 使能 GATE,INT0 为 1 时使能计时
	TL0 = 0x00;
	TH0 = 0x00;
	TR0 = 1;          // 开启定时器
	EA = 1;
}

/*********************************
 * @函数名:Int0Init
 * @描  述:配置外部中断0
 * @参  数:无
 * @返回值:无
 *********************************/
void Int0Init()
{
	IT0 = 1;          // 使能 INT0 下降沿中断
	EX0 = 1;
	EA = 1;
}

/*********************************
 * @函数名:TkPart
 * @描  述:把INT0高电平次数分隔成一位一位,
 *          用于数码管显示
 * @参  数:次数
 * @返回值:次数有几位组成
 *********************************/
unsigned char TkPart(unsigned long n)
{
	unsigned char i=7;
	while(n)
	{
		table[i] = n%10;
		n = n/10;
		if(i>0)
			i--;
	}
	return (8-i);
}

/*********************************
 * @函数名:main
 * @描  述:T0测量测量脉宽
 * @参  数:无
 * @返回值:无
 *********************************/
void main()
{
	unsigned char i=0,k;
	T0Init();
	Timer1Init();
	Int0Init();
	while (1)
	{
		while (INT0);     // 等待 INT0 为低
		TL0 = 0x00;       // 清空无用数据
		TH0 = 0x00;
		while (!INT0);    // 在这两个while之间测量
		while (INT0);
		k = TkPart(count);
		for(i=7;i>8-k;i--)
		{
			display(i,table[i]);
		}
	}
}

/*********************************
 * @函数名:INT0_Isr
 * @描  述:定时器0中断,用于获取INT0处于高电平次数
 *********************************/
void INT0_Isr() interrupt 0
{
	count = TH0<<8 | TL0;   
	TL0 = 0x00;
	TH0 = 0x00;
}

/*********************************
 * @函数名:TM1_Isr
 * @描  述:定时器1模式0中断  每进一次中断,
 *          引脚P1.6电平反转一次(即10ms低电
 *          平与5ms高电平交替)
 *********************************/
void TM1_Isr() interrupt 3 using 1
{
	static unsigned int n1=0;
	n1++;
	if(flag1 == 0)     // 10ms低电平
	{
		if(n1 == 2)
		{
			n1 = 0;
			flag1 = 1;
			wave = 0;      
		}
	}
	else               // 5ms高电平
	{
		if(n1 == 1)
		{
			n1 = 0;
			flag1 = 0;
			wave = 1;
		}
	}
}

定时器1部分代码:


void Timer1Init(void)
{
	TMOD &= 0x0F;// 设置定时器模式(了解并掌握工作方式寄存器TMOD)
	TL1 = 0x78;	 // 设置定时初值
	TH1 = 0xEC; 
	TF1 = 0;	 // 清除TF1标志(了解并掌握定时器/计数器控制寄存器TCON)
	TR1 = 1;     // 定时器1开始计时
	ET1 = 1;     // 使能定时器1中断(了解并掌握中断允许寄存器IE)
	EA = 1;      // 开总中断
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值