zoukankan      html  css  js  c++  java
  • Keil C51学习 入门

    语法关键字:

    转义字符

     

    字节寄存器
    /*------------------------------------------------
    Byte Registers
    ------------------------------------------------*/
    sfr P0= 0x80;
    sfr PCON= 0x87;
    sfr TCON= 0x88;
    sfr TMOD= 0x89;
    sfr TL0= 0x8A;
    sfr TL1= 0x8B;
    sfr TH0= 0x8C;
    sfr TH1= 0x8D;
     
    位寄存器
    /*------------------------------------------------
    P0 Bit Registers
    ------------------------------------------------*/
    sbit P0_0 = 0x80;
    sbit P0_1 = 0x81;
    sbit P0_2 = 0x82;
    sbit P0_3 = 0x83;
    sbit P0_4 = 0x84;
    sbit P0_5 = 0x85;
    sbit P0_6 = 0x86;
    sbit P0_7 = 0x87;

    sbit三种用法

    第一种方法:sbit 位变量名=地址值
    第二种方法:sbit 位变量名=SFR 名称^变量位地址值
    第三种方法:sbit 位变量名=SFR 地址值^变量位地址值

    定时器\计数器(摘自CSDN 旭日初扬

          51 系列单片机至少有两个 16 位内部定时器/计数器(T/C,Timer/Counter),提供了 3 个定时
    器,其中两个基本定时器/计数器分别是定时器/计数器 0(T/C0)和定时器/计数器 1(T/C1)。它们既
    可以编程为定时器使用,也可以编程为计数器使用。若是计数内部晶振驱动时钟,则它是定时器;若是计
    数输入引脚的脉冲信号,则它是计数器。
      T/C常用于计数、延时、测量周期、频率、脉宽、提供定时脉冲信号等。
      在实际应用中,对于转速,位移、速度、流量等物理量的测量,通常也是由传感器转换成脉冲电信号,通过使用 T/C 来测量其周期或频率,再经过计算处理获得
      
    定时器的定义与配置
      ①计数寄存器TH 和TL
    T/C 是 16 位的计数寄存器 TH 高 8 位和 TL 低 8 位构成。在特殊功能寄存器(SFR)中,对应 T/C0为 TH0 和 TL0;对应 T/C1 为 TH1 和 TL1。定时器/计数器的初始值通过 TH1/TH0 和 TL1/TL0 设置。
            ②定时器/计数器控制寄存器TCON
    D7  D6  D5   D4 D3   D2  D1 D0
    TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
    TR0、TR1:T/C0、T/C1 启动控制位
    TR0、TR1=1:启动计数
    TR0、TR1=0:停止计数
      ③T/C 的方式控制寄存器TMOD
    D7      D6     D5   D4    D3    D2    D1   D0
    GATE   C/--T   M1   M0   GATE  C/--T  M1   M0
             T/C1          |          T/C0
    C/--T:计数器或定时器选择位
    1->设置为计数器
    0->设置为定时器
     
    GATE:门控信号
    1->T/C 的启动受到双重控制,即要求 TR0/TR1 和 INT0/INT1 同时为高
    0->T/C 的启动仅受 TR0 或者 TR1 控制
     
    定时器/计数器的初始化
    在使用 8051 系列单片机的定时器/计数器前,首先要对 TMOD 和 TCON 寄存器进行初始化,同时还必
    须计算定时的时间(重点)。
    (1)确定 T/C 的工作方式:配置 TMOD 寄存器。
    (2)计算 T/C 的计数初值,并赋值给 TH 和 TL。
    (3)若 T/C 中断方式工作时,必须配置 IE 寄存器内 ET0 与 ET1 的值。
    (4)启动定时器/计数器。
     
    定时器/计数器工作方式
    定时器/计数器 0 和定时器/计数器 1 都可以在方式 0、方式 1、方式 2 工作,而方式 3 只有前者才能工作。
     

    一、CPU 时序的有关知识

    振荡周期 =1/2状态周期=1\12机器周期
     
    例如:外接晶振为 12MHz 时,51 单片机相关周期的具体值为:
      振荡周期=1/12us;
    • 1(微秒)us=0.000001s(秒)
    • 1秒(s)=1000毫秒(ms)
    • 1秒(s)=1000000 微秒(μs)
    状态周期=1/6us;
    机器周期=1us;
    指令周期=1~4us;

    二、学习定时器前需要明白的几点

    ①51 单片机有两组定时器/计数器,因为既可以定时,又可以计数,故称之 为定时器/计数器
    ②定时器/计数器和单片机的 CPU 是相互独立的。定时器/计数器工作的过程 是自动完成的, 不需要 CPU 的参与。
    ③51 单片机中的定时器/计数器是根据机器内部的时钟或者是外部的脉冲信 号对寄存器中的数据加 1。
    有了定时器/计数器之后,可以增加单片机的效率,一些简单的重复加 1 的 工作可以交给定时器/计数器处理。CPU 转而处理一些复杂的事情。同时可以 实 现精确定时 作用。
    三、单片机定时器原理
      STC89C5X 单片机内有 两个可编程的定时/计数器 T0、T1 和一个 特殊功能定 时器 T2 。定时/计数器的实质是加 1 计数器(16 位),由高 8 位和低 8 位两 个寄存器 THxTLx 组成。它随着计数器的 输入脉冲 进行自加 1,也就是每来一 个脉冲,计数器就自动加 1,当加到计数器为全 1 时, 再输入一个脉冲就使计数 器回零,且计数器的溢出使相应的中断标志位置 1 ,向 CPU 发出中断请求(定时
    /计数器中断允许时)。如果定时/计数器工作于定时模式,则表示定时时间已到; 如果工作于计数模式,则表示 计数值已满 。可见,由溢出时计数器的值减去计数 初值才是加 1 计数器的 计数值 。
    四、定时器\计数器实现步骤
    ①对 TMOD 赋值,以确定 T0 和 T1 的工作方式,如果使用定时器 0 即对 T0 配 置,如果使用定时器 1 即对 T1 配置。
    ②根据所要定时的时间计算初值,并将其写入 TH0、TL0 或 TH1、TL1。
    ③如果使用中断,则对 EA 赋值,开放定时器中断。
    ④使 TR0 或 TR1 置位,启动定时/计数器定时或计数。
     
       机器周期=1/单片机的时钟频率。51 单片机内部时钟频率是外部 时钟的 12 分频,也就是说当外部晶振的频率输入到单片机里面的时候要进行 12 分频。比如说你用的是 12MHZ 晶振,那么单片机内部的时钟频率就是 12/12MHZ, 当你使用 12MHZ 的外部晶振的时候,机器周期=1/1M=1us。如果我们想定时 1ms 的初值是多少呢?1ms/1us=1000。也就是要计数 1000 个,初值=65535-1000+1 (因为实际上计数器计数到 66636(2 的 16 次方)才溢出,所以后面要加 1) =64536=FC18H,所以初值即为 THx=0XFC,TLx=0X18。
     
       知道了如何计算定时/计数器初值,那么想定时多长时间都可以计算出,当 然由于定时计数器位数有限,我们不可能直接通过初值定时很长时间,如果要实 现很长时间的定时,比如定时 1 秒钟。可以通过初值设置定时 1ms,每当定时 1ms 结束后又重新赋初值,并且设定一个全局变量累计定时 1ms 的次数,当累计到 1000 次,表示已经定时 1 秒了。需要其他定时时间类似操作,这样我们就可以 使用定时器来实现精确延时来替代之前的 delay 函数。 这里以定时器 0 为例介绍配置定时器工作方式 1、设定 1ms 初值,开启定时 器计数功能以及总中断.
     
    程序存储区
    程序存储区是只读的。最多可以有 64K 字节的程序存储区,程序代码包括所有的函数和库保存在程序
    存储区,常数变量也是保存在程序存储区。
    Keil C51 编译器中可用
    code 关键字标识符来访问程序存储区。
    例如: 
    //共阳数码管
    uchar code smg[]={
    0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, //0-9
    0x88,0x83,0xc6,0xa1,0x86,0x8e,//A-F
    0x7f//
    };
     中断
    单片机的主程序是从 0x0000 开始运行的,单片机服务程序从哪里开始运行呢?在 51
    里,有多个中断服务程序入口,0 号入口是外中断 0,地址在 0x0003;1 号入口是定时器 0,
    在 0x000B;2 号入口是外中断 1;地址在 0x0013,3 号入口是定时器 2;地址在 0x001B,
    等等。当中断发生时,程序就记下当前运行的位置,跳到对应的中断入口去运行中断服务程
    序,运行完之后,又跳回到原来的位置继续运行。
    在 C51 中,你不用理会中断服务程序放在哪里,会怎么跳转。你只要把某个函数标识
    为几号中断服务函数就可以了。在发生了对应的中断时,就会自动的运行这个函数。
  • 相关阅读:
    最短路回顾
    树链剖分【模板】
    grep 、find 、tree 新发现
    网口划VLAN
    JDK安装
    网口做trunk
    PXE搭建
    C# 生成DLL文件
    在form窗体里面 寻找当前焦点的控件
    在屏幕右下方显示提示信息(winform窗体)(借鉴)
  • 原文地址:https://www.cnblogs.com/bymeet/p/14348546.html
Copyright © 2011-2022 走看看