一、逻辑电路与逻辑运算
逻辑运算符:(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;
}
}
}
}
}