第十五集 定时器做计数器 摘要 1.计数器的作用 2.定时器做为计数器的用法 3.定时器1测量INT1引脚低电平脉冲宽度
作用 用法 任务1:编写定时器1计数的的程序(为了方便计数,10个脉冲中断一次) 代码 main.c #include "config.h"
#include "io.h"
#include "task.h"
#include "tim.h"
void usb_callback();
void main(void)
{
Sys_init();
usb_init(); //USB CDC 接口配置
set_usb_OUT_callback(usb_callback); //设置中断回调回调函数
Timer0_Init();
TIM1_Count_Init();
EA = 1;
while(1)
{
Task_Pro_Handler_Callback(); //执行功能函数
}
}
void Timer0_Isr(void) interrupt 1
{
Task_Marks_Handler_Callback();
}
void usb_callback()
{
USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
}
time.c #include "tim.h"
u32 Count_T1 = 0;
void TIM1_Count_Init(void)
{
T1_CT = 1;
T1_M1 = 0;
T1_M0 = 0;
T1_GATE = 0;
TH1 = (65536 - count_num) >> 8;
TL1 = (65536 - count_num);
P3PU |= 0x20;
ET1 = 1;
TR1 = 1;
}
void Timer1_Isr(void) interrupt 3
{
Count_T1 ++;
}
void T1_Task(void)
{
u32 count_th_tl = 0;
count_th_tl = (((u16)TH1 << 8) + ((u16)TL1));
count_th_tl -= 65526;
SEG7_ShowLong(Count_T1 * count_num + count_th_tl,10);
}
定时器1测量INT1引脚低电平脉冲宽度 任务2:编写INT1测量低电平时间(由按键模拟信号,100us的计数周期计数!) 代码:
#include "tim.h"
u32 Count_T1 = 0;
//void TIM1_Count_Init(void)
//{
// T1_CT = 1;
// T1_M1 = 0;
// T1_M0 = 0;
// T1_GATE = 0;
//
// TH1 = (65536 - count_num) >> 8;
// TL1 = (65536 - count_num);
//
// P3PU |= 0x20;
// ET1 = 1;
// TR1 = 1;
//}
//void Timer1_Isr(void) interrupt 3
//{
// Count_T1 ++;
//}
void T1_Task(void)
{
// u32 count_th_tl = 0;
// count_th_tl = (((u16)TH1 << 8) + ((u16)TL1));
// count_th_tl -= 65526;
// SEG7_ShowLong(Count_T1 * count_num + count_th_tl,10);
SEG7_ShowString("%07.01f",((float)Count_T1)/10);
}
void Timer1_Isr(void) interrupt 3
{
static u32 count_p33 = 0;
if( P33 == 0 )
{
count_p33 ++ ;
}
else
{
if( count_p33>0 )
{
Count_T1 = count_p33;
}
count_p33 =0;
}
}
void Timer1_Init(void) //100微秒@24.000MHz
{
AUXR &= 0xBF; //定时器时钟12T模式
TMOD &= 0x0F; //设置定时器模式
TL1 = 0x38; //设置定时初始值
TH1 = 0xFF; //设置定时初始值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
ET1 = 1; //使能定时器1中断
}
课后练习 练习代码:
AI8051_10_15.zip
(208.94 KB, 下载次数: 2)
--哪怕梦想让我们拼的遍体鳞伤,这一次我们也要勇往直前
|