2017.12.9 前几章的总结

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;
          }
        }
      }
  }
}
}

  

原文地址:https://www.cnblogs.com/wongsh/p/8012594.html