51学习记录

去耦:防止突然很大的电压,稳定电流电压;并联电容。耐压选电路1.5~2倍数

三极管:NPN型号:箭头朝外,电流顺箭头流过,通电导通

B控制极  base基极       e 带有箭头   发射极 emitter       c啥也没有的竖的 集电极 collector

限流电阻:串联电阻,防止电流过大烧坏电路

分压电阻:通过比例分压:并联电阻两端取的适合的电压

sfr 寄存器命名 sfr P1=0x90; 将地址赋予寄存器名字(头文件里)

sbit        定于寄存器                sbit LED=P1^2;           将端口命名便于使用记忆

#define    定于字符                      #define  ON  1;               1就代表ON

typedef     定义类型                    typedef  unsigned char uchar;   省略数据类型;

寄存器:一个芯片里有cpu,硬件控制器【GPIO,I^2C.ADC......】cpu不能直接控制硬件,但每个硬件都有一个寄存器SFR,写入二进制数值可以控制输出模式或高低电平,SFR寄存器在RAM里一块区域和ROM共同组成一块连续储存地址,地址用十六进制表示,而头文件是对地址进行宏定义,或用结构体对一个硬件进行封装。

data RAM     xdata =123B保存在片外ram,小于1024B

code ROM

强制类型转换

(unsigned char)a;使用时间前面括号里面加入要转换的类型;

       

   

unsigned char 数据类型位8位,最大255,在端口赋值时使用可节省空间  

unsigned int  数据类型位16位,在延时函数中使用较多

运算       

左移                P1=0xa<<n;        将二进制数向左n位,即十六进制a转换为二进制左边舍弃n位,右边补充n个0;再将值赋给P1;       

延时

fro(i=1; i<100;i++);

i=1000;

while(i--);

点流水灯

1.利用左移 将一个1左移,再取反,即顺序点亮

2.利用数组循环

#include"reg51.h"
sbit LE=P1^0;                                         //sbit 定义引脚    s小写,P大写
void delay(unsigned int t)
{
    unsigned char i;
    for(;t>0;t--){
        for(i=100;i>0;i--);
    }
}

unsigned char LED[]={0XFE,0XFD,0XFB,0XF7,0XEF,0XDF,0XBF,0X7F};

void main(void)
{
    P1=0x55;            //010  1010  1 ¿ª¹Ø¿ª¹Ø¿ª¹Ø¿ª¹Ø
    
    LE=0;
    
    //P1=0xFE;            //111  1111  0 ¹Ø¹Ø¹Ø¹Ø¹Ø¹Ø¹Ø¿ª
    
    //P1&=0x55;        //010  1010  0   

/*  &两个是1才为1,| 有一个1就是1, ^ x相同为0,不同为1, ~取反*/
    
    while(1)
    {
            unsigned char i;
            for(i=0;i<8;i++){
                P2=LED[i];                                //利用数组循环赋值
                //P2 = ~(0x01<<i);                    //利用取反移动
            delay(400);
            }
    }
}

按键防抖

#include"reg51.h"
#include "intrins.h" 
sbit key1=P1^6;
sbit key2=P1^7;
sbit LED=P1^0;
void Delay10us()        //@12.000MHz
{
    unsigned char i;

    _nop_();
    i = 1;
    while (--i);
}
void main(void)
{
    while(1)
    {

//   unsigned char i;

//  i=P0;  i读取到P0端口八个端口的十六进制数值,当接口在右侧为读取模式

//   P2=i;     
                    if(key2==0)                  //         当按键第一次检测到电平下降  (初抖)   
                    {            
                        Delay10us();              //等待按键抖动过程
                        if(key2==0)                //检测真正电平下降
                            {LED=~LED;}                //灯的状态取反
                        while(key2==0);               //等待灯完全跳出低电平
                    }
        
            }
    
}

定时器/计数器

不同于 delay函数,

Hz   赫兹        一秒完成多少次完整周期,其倒数为时钟周期,为CPU最小时间单位,越小越好

1千赫 (kHz 10^3 Hz) =1 000 Hz

1兆赫 (MHz 10^6 Hz) =1 000 000 Hz

1吉赫 (GHz 10^9 Hz) =1 000 000 000 Hz

 时间    1s = 10^-3 ms = 10^-6 us

指令周期:一则指令周期包含 取指令 转译指令 执行指令 其中每个动作包含4个时钟周期

时钟周期=1/(12M) (s)= 1/12/1000/1000 (s) = 1/12 us
51单片机一个器周期是12个时钟周期,即机器(指令)周期=12*1/12 us = 1us

计时器为2字节:

最大65535,分高位和地位 THn  TLn,TLn先加到255后归零,再THn再加到255就溢出,每次加一为一个机器周期。

超过定时器用循环和倍数

计时器有两个T0和T1;

即TH0 TL0和TH1 TL0;                        总共存65535

TR1=1;计时器启动   TR1=0:计时器停止

TF1  当溢出时TF1自动变成1

T0(P3.4)   T1(P3.5)                       每来一个脉冲加一

TMOD为八位工作模式选择器,前四位为T0的,后四位为T1的

GATE       1为开始计时  测量外部信号脉冲

C/T            1 为计数    0定时

M1 M0       01     THn和TLn组成16位计时器     10 THn溢出TLn        11 定时器1禁用 定时器0变成两个8位定时器

例如使用定时器控制灯闪烁

unsigend  char can=0;                //记录多少次溢出 

TMOD=0x01  ;                        //计时器模式选择

THO=0x     ;                        //高位设定

TL0=0x       ;                        //低位设定

TRO=1;                                //启动记时

while(1)                

{

        if(TF0=1)                //判断是否到达溢出        

        {

        TF0=0;                       //清零后再次记时

        THO=0x     ;                        //高位设定

        TL0=0x       ;                        //低位设定

        cot++;

     else if (cot>=50)                   //当到记时位定时器的50倍时

        {

       cot=0;                                //进入下一个50X计时器即使

        LED=~LED;                        //LED灯状态取反

        }

}

当10ms以内,100Hz以上的闪烁人眼无法看出

中断

unsigned char code LedChar[15];                //存储在

unsigned char  LedChar[15];                        //变量存储再RAM里供给cpu更改

1.中断有两个八位寄存器,中断使能寄存器和中断优先寄存器

2.中断为一种运行机制

3.中断使能寄存器

 7.EA =1中断总开关               5.ET2 定时器2         4.ES 串口中断             3.ET1 定时器1                 2.EX1 外部中断                1.ET0  定时器0          0.EX0.外部中断

   

1.外部中断两个0和1    INT0(P.2)    INT1(P3.3)     

2.片内两个定时器        T0         T1

3.串口中断         TXD    RXD

中断优先级:INT0 —— T0  —— INT1 —— T1  —— TXD  / RXD

     下降沿触发和低电平触发,

主要代码:

IT=0;        //或IT=1;设置外部中断的触发方式

EX0=1;               //打开外部中断0

EA=1;                //打开中断总开关

中断服务函数

viod int0() interrupt 0                        //0为中断号

{

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值