概述
步骤及现象:下载程序前,选择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; // 开总中断
}
最后
以上就是简单缘分为你收集整理的STC8A8K64S4使用定时器0(测量脉宽-INT0高电平宽度)的全部内容,希望文章能够帮你解决STC8A8K64S4使用定时器0(测量脉宽-INT0高电平宽度)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复