飞行者
发表于 5 天前
15。定时器做计数器
tim.c
#include "tim.h"
u32 Count_T1 = 0;
//void TIM1_Count_Init(void)
//{
// T1_CT = 1; //设置外部计数
// T1_M1 = 0; //设置模式为16位自动重载
// T1_M0 = 0;
// T1_GATE = 0;
//
// TH1 = (65536-Count_num)>>8; //65526
// TL1 = (65536-Count_num);
//
// P3PU |= 0x20;
//
// TR1 = 1;
// ET1 = 1; //定时器/计数器T1的中断允许位
//}
//void Timer1_Isr(void) interrupt 3
//{
// Count_T1++; //T1引脚检测到10个脉冲就会溢出一次
//}
////定时器1计数
//void T1_RunTask(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);
//}
/*
任务2:编写INT1测量低电平时间
由按键模拟信号,100us的计数周期计数
*/
void Timer1_Isr(void) interrupt 3
{
static u32 count_p33 = 0; //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中断
}
//数码管输出Count_T1值
void T1_RunTask(void)
{
//SEG7_ShowLong(Count_T1 , 10); //整数输出
SEG7_ShowString("%07.01f",((float)Count_T1)/10);
}
930931
飞行者
发表于 5 天前
15.定时器做计数器 课后小练
借鉴坛友乐高的课后作业
课后小练
编译器一直有一个警告,消不掉。
CT计数器:
在设备的出料端口有一个感应器,每次有成品出来就会有一个低电平出来,计算相邻的两个产品出来的时间差来计算CT时间。
1.计算P33引脚的相邻两次按下的时间,精确到100ms(即单个时间)
2.计算按下P33的次数(即总产量)
3.数码管前四位显示单个时间 ,后四位显示次数
tim.c
#include "tim.h"
#include "io.h"
extern u32 Count_INT1; // 从io.c外部引用,用于存储总产量计数
u32Count_T1 = 0; // 定时器1计数值(每10ms加1)
u32Count1 = 0; // 暂存的时间计数值
extern u32 Count; // 从io.c外部引用,用于存储CT时间(100ms单位)
void INT1_Isr(void) interrupt 2
{
Count1 = Count_T1;
if(Count1 >5)
{
Count = Count1/10;
Count_INT1++;
}
Count_T1 = 0;
}
void Ext_Init(void)
{
IT1 = 1; //INT1(P3.3)下降沿中断
EX1 = 1; //使能INT1中断
}
void Timer1_Isr(void) interrupt 3
{
Count_T1++;
}
void Timer1_Init(void) //100微秒@24.000MHz
{
AUXR |= 0x40; //定时器时钟1T模式
TMOD &= 0x0F; //设置定时器模式
TL1 = 0xA0; //设置定时初始值
TH1 = 0xF6; //设置定时初始值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
ET1 = 1; //使能定时器1中断
}
932