STC89C51基础及项目第4天:感应开关盖垃圾桶、定时器、晶振周期、寄存器

1. 感应开关盖垃圾桶需求概述(178.23)

  • 传感器
  • SJ90舵机
  • *pwm开发(脉冲波)
  • 波长
  • *定时器(单片机鼻血)

2. 定时计数器的概念引入(179.24)

  • 定时器和计数器的电路一样
  • 定时或者计数的本质就是让单片机某个部件数数
  • 当定时器用的时候,靠内部震荡电路数数
  • 当计数器用的时候,数外面的信号,读取针脚的数据

3. 晶振时钟周期机器周期(180.25)

  • 定时器的本质原理: 每经过一个机器周期,就加1 :寄存器
  • 晶振(晶体震荡器):数字电路的“心脏”,其好坏会影响到整个系统的稳定性
  • 时钟周期:振荡周期,为时钟频率的倒数(11.0592Mhz的倒数),是计算机中最基本的、最小的时间单位,在一个时钟周期内,CPU仅完成一个最基本的动作
  • 机器周期:CPU周期,包含若干个(12/6个)时钟周期,包含时钟周期的个数称之为机器周期的时间宽度

4. 定时器加一经过多久(181.26)

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

5. 什么是寄存器(182.27)

  • 特殊功能寄存器(SFR)是用来对片内各功能模块进行管理、控制、监视的控制寄存器(类似神经)和状态寄存器(类似存储功能),是一个特殊功能的RAM区。

6. 定时器如何定时10毫秒(183.28)(*多看多理解)

STC89C51基础及项目第4天:感应开关盖垃圾桶、定时器、晶振周期、寄存器_第1张图片

  • 在哪里加1,最大计数时间,也就是爆表了能计算多长?
    • 在TH0/1和TL0/1寄存器中加1,默认是从0开始数数,最多能数65536下,累计计时71ms
  • 如何算出10ms定时器的初值?
    • 不让他从0开始数数,10ms需要数(10000/1.085)9216下,让他从65536-9126=56320(16进制表示为0xDC00)开始数数
    • 这样TH0=0xDC;TL0=0x00
  • DEC:十进制
  • HEX:十六进制
    STC89C51基础及项目第4天:感应开关盖垃圾桶、定时器、晶振周期、寄存器_第2张图片

7. 定时器编程前寄存器配置计划(184.29)

在这里插入图片描述

  • 怎么知道爆表?
    • TCON(定时器控制寄存器)寄存器的bit5(TF0)能表示爆表:当爆表的时候,硬件会修改bit5(TF0)位上面的数据,改成1(置1);如果不用中断,我们用代码来清零
  • 怎么开始计时?
    • TCON寄存器的bit4(TR0),通过编程让这个位为1的时候,开始计时,相当于按下了闹钟
  • 定时器使用是有很多种模式的:
    • 定时器模式寄存器(TMOD):TMOD来选择定时器模式,选择工作方式1,TMOD的bit0 bit1配置成0 1 即16位的定时器功能

8. 定时器控制LED每隔一秒亮灭(185.30)

  • 代码(08. 定时器01)
#include "reg52.h"

sbit led=P3^7;

void main()
{
	int cnt=0;
	led=1;
	
	//1.配置定时器0工作模式为16位计时
	TMOD=0x01;
	//2.给初值,定一个10ms出来
	TH0=0xDC;
	TL0=0x00;
	//3.开始计时
	TR0=1;
	//TF0=0;
	
	while(1)
	{
		//当爆表的时候,硬件会修改bit5(TF0)位上面的数据,改成1(置1)
		if(TF0==1)
		{
			TF0=0;//没有用中断,必须软件清零
			cnt++;//统计爆表的次数
			//重新给初值
			TH0=0xDC;
			TL0=0x00;
			//爆表n次,才让led翻转状态
			if(cnt==50)//爆表n次,经过了10n的ms
			{
				led=!led;//爆表了50次,就是经过了500ms,那么翻转led的状态
				cnt=0;//重新让cnt从0开始,计算下一次的10nms
			}
		}
	}
}

9. 按位操作(186.31)(*多听多理解)

  • 清0用与&(清的位置用0,不清的用F)
    • 任何数&上0都会清为0,任何数&上F还是不变
  • 置1用或|(不置1的位置用0,要置的用1)
    • 任何数 | 上0还是不变,任何数 | 上1会置1
  • 四个二进制数表示一位的16进制数
  • 8421法进制的转换(方便人类来看,对计算机底层来说,不关心进制,计算机都是010101010)
  • 配寄存器推荐用按位操作,清零的时候,对应的需要清零的位与上0,不需要清零的位与上F
  • 置1的时候,需要置1的位置或1,不需要置一的位置或0
  • 代码(09. 定时器02)
#include "reg52.h"

sbit led=P3^7;

/*void Timer0Init(void)		//10毫秒@11.0592MHz
{
	AUXR &= 0x7F;		//定时器时钟12T模式//禁止ALE信号输出
	TMOD &= 0xF0;		//设置定时器模式//TMOD的高四位不变,低四位给清0
	TMOD |= 0x01;		//设置定时器模式//TMOD的高四位不变,低四位置1
	TL0 = 0x00;		//设置定时初值
	TH0 = 0xDC;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
}*/

void delay10ms()
{
//1.配置定时器0工作模式为16位计时
	TMOD=0x01;
	//2.给初值,定一个10ms出来
	TH0=0xDC;
	TL0=0x00;
	//3.开始计时
	TR0=1;//定时器0开始计时
	//TF0=0;//软件清零
}
void main()
{
	int cnt=0;
	led=1;
	
	delay10ms();
	
	while(1)
	{
		//当爆表的时候,硬件会修改bit5(TF0)位上面的数据,改成1(置1)
		if(TF0==1)
		{
			TF0=0;//没有用中断,必须软件清零
			cnt++;//统计爆表的次数
			//重新给初值
			TH0=0xDC;
			TL0=0x00;
			//爆表n次,才让led翻转状态
			if(cnt==50)//爆表n次,经过了10n的ms
			{
				led=!led;//爆表了50次,就是经过了500ms,那么翻转led的状态
				cnt=0;//重新让cnt从0开始,计算下一次的10nms
			}
		}
	}
}

10. AUXR特殊功能寄存器时钟的电磁辐射(187.32)

STC89C51基础及项目第4天:感应开关盖垃圾桶、定时器、晶振周期、寄存器_第3张图片

你可能感兴趣的:(单片机)