飞行者 发表于 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


页: 1 2 3 [4]
查看完整版本: Ai8051u擎天柱学习冲哥《8051U深度入门到32位51大型实战视频》记录贴