(学习笔记)手把手教你学51单片机:定时器与数码管

一、逻辑电路与逻辑运算

逻辑运算符:(1)按变量整体值进行运算 :逻辑与(&&)   逻辑或(||) 逻辑非(!)

                      (2)按变量的每一位进行运算: 按位与(&) 按位或(|) 按位取反(~)

                      

 

二、定时器学习

2.1定时器的初步认识

(1)时钟周期:时序中最小的时间单位。

时钟周期(T)=1/时钟源频率

(2)机器周期:单片机完成一个操作的最短时间。

51单片机系列,机器周期是12个时钟周期。

定时器和计数器是单片机内部的同一个模块,通过配置SFR(特殊功能寄存器)可以实现两种不同的功能。主要用于定时。定时器内部有一个寄存器,让他开始计数后,这个寄存器的值没经过一个机器周期就会自动加1,因此可以把机器周期理解为定时器的计数周期。16位的定时器,最大值为65536,加到65536后,再加1,溢出,变为0。

2.2定时器的寄存器

单片机每一个功能模块都由他的SFR(特殊功能寄存器)来控制。51单片机内部有T0和T1两个定时器。其中寄存器TH0/TL0用于T0, TH1/TL1用于T1。

            

TCON(可位寻址)——定时器控制寄存器的位分配。

           

            

TMOD(不可位寻址)——定时器模式寄存器。

           

位寻址:可对某一位单独进行操作。

不可位寻址:必须一次性对TMOD整体操作。

/*实现LED小灯亮灭交替*/
#include<reg52.h>

sbit LED=P0^0;
sbit ADDR0=P1^0;
sbit ADDR1=P1^1;
sbit ADDR2=P1^2;
sbit ADDR3=P1^3;
sbit ENLED=P1^4;

void main()
{
	unsigned char cnt=0;    //定义计数变量,记录T0溢出次数

	ENLED=0;                //使能,选中独立LED
	ADDR3=1;                
	ADDR2=1;
	ADDR1=1;
	ADDR0=0;

	TMOD=0x01;              //设置T0为模式1 step1
	TH0=0xB8;               //为T0赋初值0xB800 step2
	TL0=0x00;
	TR0=1;                  //启动T0    step3

	while(1)
	{
		if(TF0==1)                //判断是否溢出
		{
			TF0=0;            //T0溢出后清零中断标志
			TH0=0xB8;         //重新赋值
			TL0=0x00;         
			cnt++;
			if(cnt>=50)       //溢出次数判断
			{
				cnt=0;
				LED=~LED; //LED取反,实现交替亮灭
			}
		}
	}
}

三、数码管的学习

3.1数码管的基本介绍

共阴数码管:公共端为阴极。

共阳数码管:公关端为阳极。

有两个com口,分摊电流,降低单挑线路所承受的电流。

段指的是数码管内部的8个LED灯。

3.2数码管的真值表

             

3.3数码管的静态显示

利用关键字code,使数据存储到程序空间Flash中,节省单片机的RAM的使用量。

/*显示数码管,并让数码管依次显示字符*/
#include<reg52.h>

sbit ADDR0=P1^0;
sbit ADDR1=P1^1;
sbit ADDR2=P1^2;
sbit ADDR3=P1^3;
sbit ENLED=P1^4;
unsigned char code LedChar[]=
{
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E
};

void main()
{
	unsigned char cnt=0; 
	unsigned char sec=0; 

	ENLED=0;			 
	ADDR3=1;
	ADDR2=0;
	ADDR1=0;
	ADDR0=0;

	TMOD=0x01;		
	TH0=0xB8;			
	TL0=0x00;
	TR0=1;			

	while(1)
	{
		if(TF0==1)		
		{
			TF0=0;		
			TH0=0xB8;
			TL0=0x00;
			cnt++;
			if(cnt>=50)
			{
				cnt=0;
				P0=LedChar[sec]; 
				sec++;
				if(sec>=16)
				{
					sec=0;
				}
			}
		}
	}
}

 

猜你喜欢

转载自blog.csdn.net/Wapiti_y/article/details/83314949