智能垃圾桶

143 阅读3分钟

一、定时器与计数器

定时器和计数器的区别是致使他们背后的计数存储器加1的信号不同。

当配置为定时器使用时,

每经过1个机器周期,计数存储器的值就加1。

而当配置为计数器时,

每来一个负跳变信号(信号从P3.4 或者P3.5引脚输入),就加1,以此达到计数的目的。

image.png

  • 加1经过了多少时间?

当晶振频率是11.0592MHz的时候,等于11059.2KHz = 11059200Hz 机器周期 = 12 x 时钟周期 =12 x (1/时钟频率) 秒 = 12 / 时钟频率 秒 = 12 / 11059200 秒 = 12 000 000 / 11059200 微秒 = 1.085 微秒

  • 在哪里加1,最大计数时间,也就是爆表了能计算多长

在TH和TL寄存器中加1,默认是从0开始数数,最多能数65536下,累计计时71ms

  • 如何算出10ms定时器的初值

就不让他从0开始数数,10ms需要数9216下,让它从65536-9126=56320 (16进制表示为0XDC00) 开始数数

这样TLO=0x00;THO=0xDC

  • 怎么知道爆表

TCON寄存器的bit5能表示爆表: 当爆表的时候,硬件会修改bit5位(TF0)上面的数据,改成1(置1),如果不用中断,则代码清零

  • 怎么开始计时

TCCN寄存器的bit4,通过编程让这个位为1的时候,开始计时,相当于按下了闹钟

  • 定时器使用是有很多种模式的

定时器模式寄存器: TMOD来选择定时器模式,选择工作方式1,TMOD的bit bit1配置成01:16的定时器功能

TH:high 高位

TL:low 低位

定时器编程

/*通过定时器0,控制LED亮一秒,灭一秒,晶振11059200Hz*/
#include "reg52.h"
sbit led = P3^6;
void main()
{
    int cnt = 0;
    led = 1;
//1. 配置定时器0工作模式位16位计时
TMOD = 0x01;
//2. 给初值,定一个10ms出来
    TL0=0x00;
    TH0=0xDC;
//3. 开始计时
    TR0 = 1;
    TF0 = 0;
    while(1){
    if(TF0 == 1)//当爆表的时候,硬件会修改bit5(TF0)位上面的数据,改成1
    {
        TF0 = 0;//不用中断,必须软件清零
        cnt++;  //统计爆表的次数
        //重新给初值
        TL0=0x00;
        TH0=0xDC;
        if(cnt == 100){//爆表100次,经过了1s
            cnt = 0;  //当100次表示1s,重新让cnt从0开始,计算下一次的1s
            led = !led;//每经过1s,翻转led的状态
            }
        }
    }
}

PWM开发SG90

  • 怎么控制舵机 向黄色信号线“灌入”PWM信号。 PWM波的频率不能太高,大约50HZ,即周期=1/频率=1/50=0.02s,20ms左右

数据:

0.5ms-------------0度; 2.5% 对应函数中占空比为250

1.0ms------------45度; 5.0% 对应函数中占空比为500

1.5ms------------90度; 7.5% 对应函数中占空比为750

2.0ms-----------135度; 10.0% 对应函数中占空比为1000

2.5ms-----------180度; 12.5% 对应函数中占空比为1250

定时器需要定时20ms, 关心的单位0.5ms, 40个的0.5ms,初值0.5m cnt++ 1s = 10ms * 100 20ms = 0.5ms * 40