1.首先是特殊功能寄存器。 认为指的是P0,P1,P2,P3,P4. 在头文件<reg52.h>有对特殊功能寄存器的地址分配。
另一个是sbit,是对P0等的8个口的定义。例sbit LED = P0^0,就相当于用LED表示 P0^0. 可以理解成别名。
2.电磁干扰,冬天毛衣静电,静电放电ESD,手机收音机有杂音,快速瞬间群脉冲EFT,热插拔产生的浪涌,Surge。
3.电容有两个作用,作用1,缓冲作用,当刚上电 的时候,电流从电源处流下来,不稳定,容易冲击电子元器件,加个电容可以缓冲。作用2,稳定作用,比如,后面有个电子元器件没有工作时,电流时100mA,当它工作时,电流突然变成150mA,这个时候没有电容,电压就是直接下降。而电子元器件必须高于一定的电压才能工作,所以这个时候电容就派上用场了。电源处的去耦高频电容,基本可以直接用0.1uF。
4.三极管。箭头朝内PNP,导通电压顺箭头通过,电压导通,电流控制。就是箭头的始端比箭头末端高0.7V,就可以导通ec之间。
5.unsigned char 0~255,signed char -128~127,unsigned int 0~65535,signed int -32768~32767
6.定时器。时钟周期就是晶振周期分之一。机器周期是12个时钟周期。
TCON定时器控制寄存器的位描述,可位寻址。TF1是定时器1溢出标志,发生溢出时硬件置1,清零的方式有软件清零或进入定时器中断时硬件清零。
TR1定时器1运行控制位,软件置位/清零来进行启动/停止。
TMOD定时器模式寄存器,不可位寻址。M1,M0.
7.中断。IE中断使能寄存器的位分配。可位寻址。EA =1 总开关。ET2 定时器2中断使能,ES串口中断使能。ET1 定时器1中断使能,EX1,外部中断1使能,ET0定时器0中断使能,EX0外部中断使能。
中断查询序列
中断函数编号 | 中断名称 | 中断标志位 | 中断使能位 | 中断向量地址 | 默认优先级 |
0 | 外部中断0 | IE0 | EX0 | 0x0003 | 1 |
1 | T0中断 | TF0 | ET0 | 0x000B | 2 |
2 | 外部中断1 | IE1 | EX1 | 0x0013 | 3 |
3 | T1中断 | TF1 | ET1 | 0x001B | 4 |
4 | URAT中断 | TI/RI | ES | 0x0023 | 5 |
5 | T2中断 | TF2/EXF2 | ET2 | 0x002B | 6 |
中断函数编号 = x*8 +3 = 向量地址
IP 中断优先级寄存器位分配,可位寻址。
PT2 定时器2 中断优先级控制位
PS 串口中断优先级控制位
PT1 定时器1中断优先级控制位
PX1 外部中断1中断优先级控制位
PT0 定时器0中断优先级控制位
PX0 外部中断0 中断优先级控制位
为什么要取反,二进制在左移或者是右移,都是要补0.所以为了避免麻烦,还是取反来的方便。
下面的程序是流水灯,没有用定时器,然后,后面会对程序进行优化,使用定时器和中断。
#include <reg52.h>
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
void main()
{
unsigned int i;
unsigned char flag = 0;
unsigned char ChuZhi = 0x80;
ADDR0=0;
ADDR1=1;
ADDR2=1;
ADDR3=1;
ENLED=0;
while(1)
{
P0=~ChuZhi;
for(i=0;i<20000;i++);
if(flag == 0)
{
ChuZhi = ChuZhi >>1;
if(ChuZhi == 0x01)
{
flag = 1;
}
}
else
{
ChuZhi = ChuZhi<<1;
if(ChuZhi == 0x80)
{
flag = 0;
}
}
}
}
使用定时器 实现流水灯
#include <reg52.h>
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
void main()
{
unsigned char flag = 0;
unsigned char ChuZhi = 0x80;
unsigned char cnt = 0;
ADDR0=0;
ADDR1=1;
ADDR2=1;
ADDR3=1;
ENLED=0;
TMOD = 0x01;
TH0 = 0x4C;
TL0 = 0x00;
TR0= 1;
while(1)
{
if(TF0 == 1)
{
TF0 = 0;
TH0 = 0x4C;
TL0 = 0x00;
cnt++;
if(cnt >= 20)
{
cnt = 0;
P0=~ChuZhi;
if(flag == 0)
{
ChuZhi = ChuZhi >>1;
if(ChuZhi == 0x01)
{
flag = 1;
}
}
else
{
ChuZhi = ChuZhi<<1;
if(ChuZhi == 0x80)
{
flag = 0;
}
}
}
}
}
}