一、逻辑运算
分逻辑运算和按位运算
二、定时器原理
每一个单片机都含有晶振,比如本次学习的51单片机,他的晶振频率为11.0592MHZ。
时钟周期:1/频率S
机器周期:单片机完成一个操作的最小时间,该单片机为12个时钟周期
定时器:打开定时器后,定时器的存储寄存器每经过一个机器周期数值自动加一
三、定时器使用方法
1、模式选择
GATE:常用于检测脉冲宽度,当TR0为1时,INT1为1时,此时,定时器的控制只与GATE有关,当其为1时,定时器关闭,为0时,定时器打开。
2、设置TH0和TL0
设置TH0和TL0,主要用于自动重装模式,用于精确计时。
3、使能定时器
4、判断溢出标志位
三、数码管
四、实例
/*实现LED小灯1S闪烁
数码管计数
*/
#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;
unsigned char code LedChar[]={
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};
void led()
{
unsigned char cnt = 0; //用于计算溢出个数,每一次溢出为20ms
ENLED = 0;
ADDR3 = 1;
ADDR2 = 1;
ADDR1 = 1;
ADDR0 = 0;
TMOD = 0x01; //十六位定时器
TH0 = 0xB8;
TL0 = 0x00;
TR0 = 1; //打开定时器1
while(1)
{
if(TF0 == 1)
{
TF0 = 0;
TH0 = 0xB8;
TL0 = 0x00;
cnt++;
if(cnt >= 5)
{
cnt = 0;
LED = ~LED;
}
}
}
}
void shuma()
{
ENLED = 0;
ADDR3 = 1;
ADDR2 = 0;
ADDR1 = 0;
ADDR0 = 0;
P0 = 0xF9;
while(1);
}
void jishu()
{
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];
if(sec >= 15)
{
sec = 0;
}
else
{
sec++;
}
}
}
}
}
void main()
{
jishu();
}