zoukankan      html  css  js  c++  java
  • 51单片机学习笔记(郭天祥版)(1)——单片机基础和点亮LED灯

    关于单片机型号的介绍:

    STC89C52RC40C-PDIP 0721CV4336.....

    • STC:STC公司
    • 89:89系列
    • C:COMS
    • 52(还有51,54,55,58,516,):2表示存储空间的大小,2*4K=8K
    • 40:晶振最高频率40MHZ,单片机工作的速度
    • C(commercial):商业级。(还有I(industry):工业级)区别在于温度可用范围,商业级:0~85℃,工业级:-40~125℃,还有军品级:-55~160℃(这个不确定)。
    • PDIP:封装形式,双列直插式
    • 0721:07年第21周

    AT89C51,S51,LV51

    • S:支持串口下载
    • C:必须要专门的编程器才能写程序
    • LV:低电压,工作电压3V即可

    STC89E,LE,C52AD

    • E:低电压
    • AD:芯片自带模拟电压到数字电压的转换器

    总线型:有4组IO口,P0-P3,每组都是8位

    非总线型:不能构成一组,例如P3。

    单片机内部总线是8位为一个总线。


    此处不会也没事,后面用到会单独讲


    程序存储器、数据存储器都有总线(3条,送数据的时候,数据是在总线跑)与之相连,暂时不会没事


     单片机由这几部分组成:(作为了解)

     


    C-51(C语言),ASM-51(汇编语言),了解即可


     需要知道,否则浪费空间等

    char是8位,而bit就是一位

    单片机每个寄存器都有一个固定的地址,这里sfr不常用

    sbit常用,PSW是寄存器,^2是寄存器的第二位,定义后,以后想要使用直接使用OV即可


    头文件之后会说

    逻辑与、逻辑或、逻辑非和数字电路中相同:0&&1=0    1&&1=1    0||1=1     !0=1     !1=0

    左移右移:原1110 1111 左移后1101 1110,左移后最低位补0,右移后最高位补0

    按位与可以是变量之间:5&2 -> 0101&0010(5和2的二进制) ->  0000(一位一位的与)  所以5&2=0

    按位异或不常用

    单片机需要掌握以下几点:

    • 最小系统运行的必要条件:
    1. 电源
    2. 晶振
    3. 复位电路
    • 对单片机任意IO口(4组,32个)的随意操作
    1. 输出控制电平高低
    2. 输出检测电平高低
    • 定时器:重点掌握最常用方式2
    • 中断:
    1. 外部中断
    2. 定时器中断
    3. 串口中断
    • 串口通信:
    1. 单片机之间
    2. 单片机与计算机之间

     发光二极管电阻的值怎么选取:

    发光二极管是内部电流点亮,3mA~10mA左右,有锗管、硅管,常用硅管,点亮后发光二极管两端1.7V左右,得到电阻上电压(5-1.7=3.3V),电流为3mA,求得到电阻为1kΩ,用300Ω也行(更亮,电流就变为了10mA,再高容易烧坏)。

    电源(USB接口数据线D1和D2下面的线就是电源线):

    USB可用于做MP3或U盘开发

    电源上有限流电阻1k(有三种,下拉电阻,上拉电阻,限流电阻:限制这条道线上通过电流大小),去耦电容(稳压,去除杂波,并滤波,起缓冲作用)两个,USB供电的时候,计算机USB使用的是开关电源(像是内部有个开关控制电流大小,电流一大自动关闭,一小就自动打开,是电流平均,最后转换成5V电压,示波器观察发现电压不稳定)


    74HC573锁存器

          

    OE非(out enable使能,低电平有效),D输入,Q输出,当OE为H,输出为Z高阻态(介于高电平与低电平之间,总线与其他元器件相连接,其他元器件输出高电平,高阻态就变为高电平,其他元器件输出低电平,就变为低电平),所以OE接地,D0-D7为输入,与DB1-DB8连接,这里DB1-DB8为单片机P1口,用单片机控制发光二极管亮灭,10、20接地和电源,11为LE(锁存器锁存端),LE为H时,输出为输入变化,LE为L时,输出都保持上一次的值。这里LE为H(51单片机上电后,默认所有IO口都是高电平),相当于不存在锁存器,其用于后面拓展使用AD转换。


    编程正式开始

    main,任何一个C程序都有且仅有一个main函数,它是程序开始执行的入口

    花括号{}成对出现,所以先打出来以免忘了

    注意下面C语言的格式(注意用Tab,一般设置为Tab为4个空格),严格遵循,方便阅读修改

    再一次重复,51单片机上电后(接通电源开机)所有IO口都为高电平(即1)

    (原理图)电路图:

    发光二极管阳极分别连接了排阻(电阻)和电源,阴极连接了锁存器的输出Q0-Q7,,锁存器的DB0-DB7连接了单片机的P1.0-P1.7口,锁存器这里11引脚上电为1,相当于输入直接给输出(不会了再回去看锁存器,会常用到),要想让发光二极管(LED灯)点亮,需要让阴极为负(低电平0),阳极为正(高电平1)),由于LED灯阳极接了电源所以为高电平,因此要想让LED亮,只需要让单片机对应的IO口为低电平,进而输出给对应的Q0-Q7的某一个即可。

    使用单片机必须要会看电路图!因为电路图不同,编程就不同(例如P1口不再是连接灯而是连接键盘灯),而且以后需要自己画电路图设计单片机,或者学习新的单片机也需要会看。

    位操作方法点亮一个二极管

    1 #include<reg52.h>
    2 sbit D1=P1^0;
    3 void main()
    4 {
    5     D1=0;
    6 }

    程序最后进行讲解,总线方法也先等到点亮观看到结果后再尝试。

    总线操作方法点亮一个二极管(点亮第二个,DB8-DB1:1111 1101,4个一组换为16进制fd)

    #include<reg52.h>
    void main() 
    { 
        P1=0xfd;//0x表示16进制
    }
    

     第一个不知道,第二个编译当前文件,第三个编译所有工程文件

    无错误

    下载到单片机,有两种,hex文件(16进制),bin文件(2进制),keil只能生成hex文件,weifu生成hex和bin文件。

    找到生成hex的方法:

    Xtal晶振频率,此处不用管,这里不需要计算单片机运行速度

    Memory Model内存形式,Code..编码内存程序空间大小64K,你可以直接生成64K大小的程序,89c52支持片外存储器,如果片内不够,会存于片内。

    选中Output,勾选Create HEX,再重新编译即可。

    下载程序:

    先选择型号,STC89C52RC,选择Open File打开文件,选择生成的HEX,选择COM串口(右键我的电脑,选择管理,设备管理器,打开端口,其中rs232对应的COM,若为COM10+,双击rs232,选择设置Setting,高级Advanced就可以修改了),波特率默认。单片机下载时需要冷启动(单片机不知道你要下载,所以先在软件点击下载,然后打开实验板电源,就会给单片机发送指令,单片机刚上电会通过串口接收数据,检测是否下载数据,如果检测到下载命令,就和这个上位机(电脑)接通开始下载程序,若之前已开启则重新开启单片机)上述只需设置(型号,选择COM,波特率)一次,以后默认。


    程序讲解:

    
    
    1 #include<reg52.h>//头文件
    2 sbit D1=P1^0;//特殊寄存器的位定义
    3 void main()
    4 {
    5     D1=0;//D1=0即为P1^0=0,即IO口为低电平,即二极管阴极为低电平
    6 }


    头文件里有许多写好的程序,include后相当于把程序直接放入c文件内。
    在reg52.h上右键,点击open document...就能打开这个头文件,看到里面的内容(或者在keil文件夹下的C51文件夹里,点开INC文件夹(include),里面很多头文件,就能看到REG52.H)。

      

    52兼容51,52比51多一个寄存器(T2CON),如果不用那个定时器,那么写51和52都行。

     

    P0是特殊功能寄存器,单片机有21个特殊功能寄存器,不同的特殊功能寄存器位于单片机内不同地址,单片机P0口的地址是0x80。

    头文件是把编译器和单片机硬件连接器来的东西,编译器不知道你操作的是单片机还是什么,所以需要把地址都定义一下。

    例如sfr P0=0x80;这里就和我们c文件里定义sbit D1=P1^0一样。sfr是定义一个特殊功能寄存器也就是8位,而sbit是一位。

    正如上面提到的,include头文件相当于把头文件的内容放入c文件,所以我们才能用P1这种方式,不能用P1^0是因为没有位定义,而这里的AC等就可以直接使用,因为头文件里定义了。头文件也可以自己写。

    例如这里我们头文件里位定义了D1,然后c文件里直接使用没有定义也不会出错了。

    最后再说一下注释,有两种

    • 单行注释    //这里是注释内容,只在本行内有效
    • 多行注释    /*这里是注释内容,可以换行*/

     P1^2:单片机四组IO口,P1就是P1口,每组IO口有8位,用^2可以选择P1口的第2位,使用某一位以前必须定义,记住,除非头文件里有写好的。而P1这些IO口就是在头文件写好的。

    完整的程序应该有始有终,点亮后应该停在那里

    while(1),死循环,当满足while括号内的内容时(即括号内为真时)就进入while循环,而1就是真,所以一直进入这个循环。


    作业:

  • 相关阅读:
    python note 30 断点续传
    python note 29 线程创建
    python note 28 socketserver
    python note 27 粘包
    python note 26 socket
    python note 25 约束
    Sed 用法
    python note 24 反射
    python note 23 组合
    python note 22 面向对象成员
  • 原文地址:https://www.cnblogs.com/IceHowe/p/10554510.html
Copyright © 2011-2022 走看看