一、定时器与计数器
定时器和计数器的区别是致使他们背后的计数存储器加1的信号不同。
当配置为定时器使用时,
每经过1个机器周期,计数存储器的值就加1。
而当配置为计数器时,
每来一个负跳变信号(信号从P3.4 或者P3.5引脚输入),就加1,以此达到计数的目的。
- 加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