单片机 订阅
单片机(Single-Chip Microcomputer)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。从上世纪80年代,由当时的4位、8位单片机,发展到现在的300M的高速单片机。 展开全文
单片机(Single-Chip Microcomputer)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。从上世纪80年代,由当时的4位、8位单片机,发展到现在的300M的高速单片机。
信息
外文名
Microcontrollers
类    别
电路芯片
中文名
单片机
应    用
工业生产、电子设备等
单片机简介
单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。相当于一个微型的计算机,和计算机相比,单片机只缺少了I/O设备。概括的讲:一块芯片就成了一台计算机。它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。同时,学习使用单片机是了解计算机原理与结构的最佳选择。单片机的使用领域已十分广泛,如智能仪表、实时工控、通讯设备、导航系统、家用电器等。 [1]  从二十世纪九十年代开始,单片机技术就已经发展起来,随着时代的进步与科技的发展,目前该技术的实践应用日渐成熟,单片机被广泛应用于各个领域。现如今,人们越来越重视单片机在智能电子技术方面的开发和应用,单片机的发展进入到新的时期,无论是自动测量还是智能仪表的实践,都能看到单片机技术的身影。当前工业发展进程中,电子行业属于新兴产业,工业生产中人们将电子信息技术成功运用,让电子信息技术与单片机技术相融合,有效提高了单片机应用效果。作为计算机技术中的一个分支,单片机技术在电子产品领域的应用,丰富了电子产品的功能,也为智能化电子设备的开发和应用提供了新的出路,实现了智能化电子设备的创新与发展。 [2]  单片机也被称为单片微控器,属于一种集成式电路芯片。在单片机中主要包含CPU、只读存储器ROM和随机存储器RAM等,多样化数据采集与控制系统能够让单片机完成各项复杂的运算,无论是对运算符号进行控制,还是对系统下达运算指令都能通过单片机完成。 由此可见,单片机凭借着强大的数据处理技术和计算功能可以在智能电子设备中充分应用。简单地说,单片机就是一块芯片,这块芯片组成了一个系统,通过集成电路技术的应用,将数据运算与处理能力集成到芯片中,实现对数据的高速化处理。 [2] 
收起全文
精华内容
下载资源
问答
  • 单片机应用技术(C语言版),王静霞 主 编,51单片机ppt,讲到了80C51单片机内部结构及各个引脚,汇编指令,中断,定时器,串口,总线等等
  • 51单片机的实例集合,淘宝购买。有万年历、12864屏显示、步进电机控制、交通灯、等等真实有效,。百度网盘链接,永久有效
  • 往届蓝桥杯省赛题目答案, 第三届:温度监控器。 第四届:自动售水机。 第五届:模拟智能灌溉系统。 第六届:简易温度采集与控制装置。 第七届:模拟风扇控制系统。... 第八届:基于单片机的电子钟。
  • 51单片机蓝牙小车

    万次阅读 多人点赞 2019-02-25 20:41:23
    51单片机蓝牙小车(是我大二做的一个课程设计,小菜鸟一个,欢迎大家指正和参考。) 摘要 本次设计选择基于蓝牙遥控的多功能智能小车为对象。选用STC98C52RC单片机作为主控芯片,电机驱动采用L293N ,...

     

    51单片机蓝牙小车(是我大二做的一个课程设计,小菜鸟一个,欢迎大家指正和参考。)

     

    摘要   本次设计选择基于蓝牙遥控的多功能智能小车为对象。选用STC98C52RC单片机作为主控芯片,电机驱动采用L293N ,电源部分采用两节3.7V锂电池供电.采用C语言模块化编程,提高开发效率.蓝牙控制功能.用按键或遥控器来控制小车.

     

    关键词  

    51单片机

    L298N_电机驱动

    蓝牙遥控

     

    目录

    1. 前言

    1.1.  系统研究背景

    1.2. 系统研究的意义和目的

    2. 系统概述

    2.1.  系统的结构

    2.2.  系统的功能

    2.3.  开发环境

    3.  系统实现

    3.1. 相关技术技术

    3.2.  硬件实现

    3.3.  软件实现                  ​

    源程序


    1. 前言

    1.1. 系统研究背景

            蓝牙属于短距离内进行无线控制和收发的通信技术,伴随着科技的飞跃性发展,也让蓝牙找到了发展的空间,它可以代替和取代落后的数字化硬件设备之间繁琐的电缆连接。在蓝牙创造的初期,没有人预料到蓝牙会有如此大的潜力和前景,而现在的发展也是完全超出了我们的预期,因为蓝牙的安全性高,制造成本低廉和所消耗的功率也是同类产品中最低的,所以被很多人使用,越来越受到了广大消费者的欢迎,基于蓝牙技术的产品也在不断的更新和投入市场。

           蓝牙技术是近年来出现的新技术是一种短距离无线通信和信息传输的新型通讯科技,它使数据线的硬件设备接收更方便快捷。它可以广泛应用于世界各地,是一个蓝牙设置一个通用的范围,频率调制技术的使用,以防止外部干扰和多一些。低成本,低功耗和小辐射,和加密设置,让蓝牙的安全性更高;应用范围广,这些特点使得蓝牙技术被广泛的应用在我们日常生活中的蓝牙也支持一对一和一对多传输的通信连接,和多个蓝牙成为微网,也有网络的特点。

         在现在的智能时代,小车智能控制,方便了人们的使用。在51单片机的基础下,通过蓝牙来控制小车的驾驶。



    1.2. 系统研究的意义和目的

            因为无线技术的广泛使用,我们在研究无线和有线通信技术的方法中了解到蓝牙系统的小区域性有很大的技术突破,在国际上也得到了广泛的采纳,在市场上也有很大的需求。这也使蓝牙技术的发展成为了趋势之一,蓝牙可以发送和接受语音和数据,满足了大多数人的需求,它也融合了其他相关产品的特点,也是这样技术变得更多样性。然而,蓝牙的安全性不足,而且在小区域范围内的一点对多点的通信受到了很大的限制,这些都是其本身需要改进和完善的

          可以使人们更方便,更简单的控制小车。实现了无线控制小车,摆脱了有线控制的不方便,更智能。


    2. 系统概述

    2.1.  系统的结构

                                                                       系统框图

     

     

    2.2.  系统的功能

    51单片机的基础下,通过蓝牙来控制驱动,此驱动能把5~12V的电压,一部分给小车轮子转动,一部分通过降压,稳压,最终降为5V来供给此驱动,单片机和传感器供电。

     

    2.3.  开发环境

    AT89C5RC单片机:

              AT89C52是一种8位单片机,它是在MCS-51单片机系列上加强了一些功能后升级得到的产物。它的作用基本上就是把外界的数据和命令在中断和时钟的帮助下,在自身内部储存器上把使用者的数据进行处理。AT89C52 由8位的内部处理器,内部数据储存器(RAM,有256个字节)内部储存器有8K的大小,输入和输出双向口有32个,16位的定时器和5个两级中断,全双工串行通信口一个和时钟电路组成。

             AT89C52能够自主地执行给它的指令,也就是你把所需要的指令写在单片机的内部储存器上,它会一步步执行。AT89C52可以在功耗特别低的情况下工作,就是设置成空闲选择和掉电模式两种状态来实现低功耗。

     

                                                                         AT89C52

           单片机与外界的通讯是依靠它自身的I/O 口进行的,对单片机I/O 口的控制就是对单片机的控制。I/O 口的存在不仅可以实现数据的传输,还可以改变电平和信号的性质,最重要的一点就是I/O 口可以实现与外部不同电路的连接来使单片机工作。

             AT89C52单片机上我们通常使用的是4个独立的双向通用I/O 口:P0口、P1口、P2和P3口。由于外部设备的工作速率比较慢或者很快的时候,我们可以采用同步传送的方式,而单片机存在的异步传送是为了更加简练的和硬件连接进行传出。也可以通过中断传送和DMA传送来完成。AT89C52单片机还可以实现外部接口单独的编址和外部端口和存储器的统一编制两种方式。AT89C52单片机上一共有32个I/O 口,不同的I/O 口实线的作用和运行的方式都有其自己的方式,我也要通过这次课程设计,更好地了解,更熟练的运用。


    3.  系统实现

    3.1. 相关技术技术

    蓝牙技术,驱动模块,

     

    3.2.  硬件实现

    HC-06蓝牙模块

    其TX接单片机的RX,RX接单片机的TX,VCC接5V(或3.3V),GND接单片机的地。HC-06蓝牙模块是通过一款手机APP(蓝牙串口助手)作为中间媒介,在蓝牙串口助手发送相关的数据到串口,串口再把相关信息送到蓝牙模块,蓝牙模块再把相关信号送到单片机中。

                                                                                  HC-06蓝牙模块


                                                          HC-06蓝牙模块和51单片机连接



     

    L298N电机驱动模块,

    该该电机可以驱动2路直流电机,使能端ENA,ENB,为高电频有效,

    通过单片机的输入信号给IN1和IN2来控制左轮,输入信号给IN3和IN4来控制右轮

    IN1和IN2,分别给0,1  :正转

     IN1和IN2,分别给1,0  :反转

    IN1和IN2,分别给1,1 :停止

    IN1和IN2,分别给0,0  :停止

    IN3和IN4,分别给0,1  :正转

    IN3和IN4,分别给1,0  :反转

    IN3和IN4,分别给1,1 :停止

    IN3和IN4,分别给0,0  :停止

     

    L298N的主要引脚功能如下:

    +5V:芯片电压5V;

    VCC:电机电压,最大可接50V;

    GND:共地接法;

    Output1—Output2:输出端,接电机1;

    Output3—Output4:输出端,接电机2;

    EN1、EN2:高电平有效,EN1、EN2分别为 IN1和IN2、IN3和IN4的使能端;

    Input1~ Input4:输入端,输入端电平和输出端电平是对应的;

      

                                                                      L298N



    3.3.  软件实现
                     

                                                                         程序流程图

     

                

     

    51单片机,源程序:

    sbit in1 = P1^0;//左电机
    sbit in2 = P1^1;//左电机
    sbit in3 = P1^2;//右电机
    sbit in4 = P1^3;//右电机
    
    char i;
    
    /*前进*/
    void forward()
    {
    
        in1=1;
        in2=0;
        in3=1;
        in4=0;
    }
    
    /*后退*/
    void back()
    {
        in1=0;
        in2=1;
        in3=0;
        in4=1;
    }
    
    
    
    /*左转*/
    void left()
    {
        in1=1;
        in2=1;
        in3=1;
        in4=0;
    }
    
    /*右转*/
    void right()
    {
        in1=1;
        in2=0;
        in3=1;
        in4=1;
    }
    
    /*停止*/
    void stop()
    {
        in1=1;
        in2=1;
        in3=1;
        in4=1;
    }
    
    
    void main (void)
    {
          TMOD=0x20;                         //设置T1为工作方式2
          TH1=0xfd;                        //装入初值,比特率为9600bps
          TL1=0xfd;
    
          TR1=1;                              //开启T1
          REN=1;                             //接收允许
    
          SM0=0;                             //方式1
          SM1=1;
    
          EA=1;                               //开全局中断
          ES=1;                                //开串口中断
    
    while(1)
    
        {
            i=SBUF;//SBUF为单片机接收到的数据,单片机接收到的数据都存放在SBUF里;
    
            RI=0;
    
            if (i==0x02){forward();}     //如果蓝牙助手发送0x02,小车前进
    
            if (i==0x08){back();}        //如果蓝牙助手发送0x08,小车后退
    
            if (i==0x01){left();}         //如果蓝牙助手发送0x01,小车左转
    
            if (i==0x03){right();}        //如果蓝牙助手发送0x03,小车右转
    
            if (i==0x05){stop();}        //如果蓝牙助手发送0x05,小车停止
        }
    
    }

     

    3.4.  系统测试

    小车能实现基本功能,成功地用蓝牙控制小车。测试了一段时间,单片机工作稳定,蓝牙稳定的控制,小车较好的按照控制方向行走。

     


    4.  系统使用说明

    1.      为小车装上两节锂电池,来供电。

    2.     打开总开关,在手机端,打开一个蓝牙通讯助手(在手机应用商店可以找到下载),连接上此小车的蓝牙(HC-06),如图:

     

                                        蓝牙 HC-06模块

     

     



     

    3.     然后就可以在手机端按相应的前进,后退,左转,右转,停止等,如图:

     

                                            APP

     

    解析:前进,后退,左转,右转,停止,都对应着程序中相应的信息,如图;

    当手机端发送 0x02 给蓝牙模块,就会执行 forward()函数; 小车会向前走

    当手机端发送 0x08 给蓝牙模块,就会执行 back();函数;,小车会向后走

    当手机端发送 0x01 给蓝牙模块,就会执行 left();函数;,小车会向左走

    当手机端发送 0x03 给蓝牙模块,就会执行 right()函数;,小车会向右走

    当手机端发送 0x05 给蓝牙模块,就会执行stop()函数;,小车会停止

    具体的编辑如图:

                                              APP2

     

    最后这是小车的整体模型;

     

                                                         整体图

     

      注:上面有个RC522读卡器的,哪个是方便后面的课设,在这里,大家可以忽略哈。

    5.  总结

         本设计采用的是STC89C52RC单片机,这主要是因为该单片机的稳定性比较好和执行指令的速度很快。还可以采用其它系列的单片机。电机驱动采用L293N ,稳定电压,充足地向直流电机供电和稳定控制;电源部分采用两节3.7V锂电池供电,电压稳定,电流充足,还可以循环充电,节能环保。采用C语言模块化编程,提高开发效率.蓝牙控制功能.用按键或遥控器来控制小车,简单方便经过自己不断的搜索努力以及老师的耐心指导和热情帮助,本设计已经基本完成。

            过这次课程设计,使我深刻地认识到学好专业知识的重要性,也理解了理论联系实际的含义,并且检验了大学两年的学习成果。虽然在这次设计中对于知识的运用和衔接还不够熟练。但是我将在以后的工作和学习中继续努力、不断完善。这两个月的设计是对过去所学知识的系统提高和扩充的过程,为今后的发展打下了良好的基础。  由于自身水平有限,设计中一定存在很多不足之处,敬请各位批评指正.


    6.  参考文献

    C语言程序设计 :清华大学出版社作者:谭浩强

    51单片机C语言教程:电子工业出版社 ,作者:郭天祥

     

    希望对你有帮助。

     

    为了大家方便,我上传了手机APP在网盘:https://pan.baidu.com/s/1UNjlUhUQa25K2RNW8hjwOQ

      提取码:wn7k 

     

     

     

    展开全文
  • 单片机与嵌入式系统试题库。包括判断题、简答题、分析题、编程题、选择题等。
  • 郭天祥《新概念51单片机C语言教程》,高清PDF版
  • 适用于微嵌51单片机最小系统板 在AT89S52单片机上测试通过,可以移植到其他51系列单片机
  • 基于51单片机的交通灯控制系统设计

    万次阅读 多人点赞 2018-11-24 13:38:11
    本设计为基于51单片机交通灯系统的设计,采用模块化、层次化设计。运用单片机AT89C51进行数据的分析和处理,为显示提供信号,显示部分采用8位数码管显示倒计时值。系统电路简单、集成度高、工作稳定、调试方便、检测...

    第一章 硬件设计与原理
    以AT89C51单片机为核心,起着控制作用。系统包括数码管显示电路、复位电路、时钟电路、发光二级管电路和按键电路。设计思路分为六个模块:复位电路、晶振电路模块、AT89C51、数码管显示电路、发光二级管电路和按键电路这六个模块。

    在这里插入图片描述

    1.2 硬件设计分析
    1.2.1 电源的设计
    系统电源使用直流5伏。
    由电脑USB接口提供电源。
    USB是通用串行总线(Universal Serial Bus)接口的简称。它是目前使用比较广泛的电脑接口之一,主要版本有1.0、1.1和最新的2.0三种版本。根据USB总线的工业标准,它可以提供额定功率为5V/500mA的电源供USB设备使用。
    1.2.2 单片机最小系统
    51单片机是对目前所有兼容intel 8031指令系统的单片机的统称。该系列单片机的始祖是intel的8031单片机,后来随着技术的发展,成为目前广泛应用的8为单片机之一。单片机是在一块芯片内集成了CPU、RAM、ROM、定时器/计数器和多功能I/O口等计算机所需要的基本功能部件的大规模集成电路,又称为MCU。51系列单片机内包含以下几个部件:
    一个8位CPU;一个片内振荡器及时钟电路;
    4KB的ROM程序存储器;
    一个128B的RAM数据存储器;
    寻址64KB外部数据存储器和64KB外部程序存储空间的控制电路;
    32条可编程的I/O口线;
    两个16位定时/计数器;
    一个可编程全双工串行口;
    5个中断源、两个优先级嵌套中断结构。
    如图1-2-1所示为AT89C51单片机基本构造,其基本性能介绍如下:
    图1-2-1 AT89C51单片机

    AT89C51本身内含40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中端口,3个16位可编程定时计数器,2个全双工串行通信口,STC89C51RC可以按照常规方法进行编程,但不可以在线编程。其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。
    AT89C51的主要特性如下表所示:

    在这里插入图片描述

    AT89C51为40脚双列直插封装的8位通用微处理器,采用工业标准的C51内核,在内部功能及管脚排布上与通用的8xc52相同,其主要用于会聚调整时的功能控制。功能包括对会聚主IC内部寄存器、数据RAM及外部接口等功能部件的初始化,会聚调整控制,会聚测试图控制,红外遥控信号IR的接收解码及与主板CPU通信等。主要管脚有:XTAL1(19脚)和XTAL2(18脚)为振荡器输入输出端口,外接12MHz 晶振。RST/Vpd(9脚)为复位输入端口,外接电阻电容组成的复位电路。VCC(40脚)和VSS(20脚)为供电端口,分别接+5V电源的正负端。P0~P3 为可编程通用I/O脚,其功能用途由软件定义,在本设计中,P0端口(32~39脚)被定义为N1功能控制端口,分别与N1的相应功能管脚相连接,13脚定义为IR输入端,10脚和11脚定义为I2C总线控制端口,分别连接N1的SDAS(18脚)和SCLS(19脚)端口,12脚、27脚及28脚定义为握手信号功能端口,连接主板CPU的相应功能端,用于当前制式的检测及会聚调整状态进入的控制功能。
    P0口:P0口是一组8位漏极开路型双向I/O 口,也即地址/数据总线复用口。作为输出口用时,每位能吸收电流的方式驱动8个TTL逻辑门电路,对端口P0写“1”时,可作为高阻抗输入端用。在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻。在Flash 编程时,P0口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻。
    P1口:P1是一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。与AT89C51不同之处是,P1.0和P1.1还可分别作为定时/计数器2 的外部计数输入(P1.0/T2)和输入(P1.1/T2EX)。Flash编程和程序校验期间,P1接收低8位地址。
    P2口:P2是一个带有内部上拉电阻的8 位双向I/O口,P2的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口P2写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。在访问外部程序存储器或16位地址的外部数据存储器(例如执行MOVX @DPTR指令)时,P2口送出高8位地址数据。在访问8位地址的外部数据存储器(如执行MOVX @RI指令)时,P2口输出P2锁存器的内容。Flash编程或校验时,P2亦接收高位地址和一些控制信号。
    P3口:P3口是一组带有内部上拉电阻的8位双向I/O口。P3口输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对P3口写入“1”时,它们被内部上拉电阻拉高并可作为输入端口。此时,被外部拉低的P3口将用上拉电阻输出电流(IIL)。P3口除了作为一般的I/O口线外,更重要的用途是它的第二功能P3口还接收一些用于Flash 闪速存储器编程和程序校验的控制信号。
    RST:复位输入。当振荡器工作时,RST引脚出现两个机器周期以上高电平将使单片机复位。
    ALE/PROG:当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节。一般情况下,ALE仍以时钟振荡频率的1/6输出固定的脉冲信号,因此它可对外输出时钟或用于定时目的。要注意的是:每当访问外部数据存储器时将跳过一个AL脉冲。对Flash存储器编程期间,该引脚还用于输入编程脉冲(PROG)。如有必要,可通过对特殊功能寄存器(SFR)区中的8EH单元的D0位置位,可禁止ALE操作。该位置位后,只有一条 MOVX 和MOVC指令才能将ALE激活。此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ALE禁止位无效。
    PSEN:程序储存允许(PSEN)输出是外部程序存储器的读选通信号,当AT89C51由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲。在此期间,当访问外部数据存储器,将跳过两次PSEN信号。
    EA/VPP:外部访问允许。欲使CPU仅访问外部程序存储器(地址为0000H—FFFFH),EA端必须保持低电平(接地)。需注意的是:如果加密位LB1被编程,复位时内部会锁存EA端状态。如EA端为高电平(接Vcc端),CPU则执行内部程序存储器中的指令。Flash存储器编程时,该引脚加上+12V的编程允许电源Vpp,当然这必须是该器件是使用12V编程电压Vpp。
    XTAL1:振荡器反相放大器的及内部时钟发生器的输入端。
    XTAL2:振荡器反相放大器的输出端。
    单片机最小原理图如图1-2-2所示。
    图1-2-2 单片机最小系统

    单片机最小系统说明:
    时钟信号的产生:在MCS-51芯片内部有一个高增益反相放大器,其输入端为芯片引脚XTAL1,其输出端为引脚XTAL2。而在芯片的外部,XTAL1和XTAL2之间跨接晶体振荡器和微调电容,从而构成一个稳定的自激振荡器,这就是单片机的时钟振荡电路。
    时钟电路产生的振荡脉冲经过触发器进行二分频之后,才成为单片机的时钟脉冲信号。
    一般地,电容C2和C3取30pF左右,晶体的振荡频率范围是1.2-12MHz。如果晶体振荡频率高,则系统的时钟频率也高,单片机的运行速度也就快。
    单片机复位使CPU和系统中的其他功能部件都处在一个确定的初始状态下,并从这个状态开始工作。单片机复位条件:必须使9脚加上持续两个机器周期(即24个振荡周期)的高电平。
    1.2.3 显示系统
    数码管是一种半导体发光器件,其基本单元是发光二极管。
    数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按能显示多少个“8”可分为1位、2位、4位等等数码管;按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。当某一字段的阴极为高电平时,相应字段就不亮。。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。当某一字段的阳极为低电平时,相应字段就不亮。
    数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出我们要的数字,因此根据数码管的驱动方式的不同,可以分为静态式和动态式两类。
    1) 静态显示驱动:静态驱动也称直流驱动。静态驱动是指每个数码管的每一个段码都由一个单片机的I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O端口多,如驱动5个数码管静态显示则需要5×8=40根I/O端口来驱动(要知道一个89C51单片机可用的I/O端口才32个呢),实际应用时必须增加译码驱动器进行驱动,增加了硬件电路的复杂性。
    2) 动态显示驱动:数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。
    本设计中数码管采用的是动态驱动方式。
    数码管外形如图1-2-3,数码管电路结构如图1-2-4。

    图1-2-3 数码管外形图
    图1-2-4 数码管电路结构示意图

    在这里插入图片描述
    图1-2-5 数码管显示电路
    1.2.4 发光二级管电路

    图1-2-6 发光二级管电路
    1.2.5 按键电路
    图1-2-7 按键电路

    第二章 软件设计与分析
    2.1 软件设计的组成
    该系统由延时子函数、数码管显示子函数、定时器0中断子函数、主函数和数据定义这几部分组成。
    在这里插入图片描述

    在这里插入图片描述

    //----------------------------------------------------------------------//
    上传过程感觉繁琐,里面可能有不全面的地方,请见谅。下面的是实现的目的。以及电路原理图

    **本次设计的主要目的是设计一个城市十字路口的交通灯控制系统,设计中将交通灯控制系统分为东西方向(主干道)和南北方向(次干道)两个方向,且在东西南北四个路口的每个路口设置红、绿、黄三个交通信号灯(用发光二极管模拟)和一个二位的LED数码显示管。设计的要求是规定在每一段时间内东西和南北两个方向中只有一个方向能够通行,另一个方向处于禁行状态,然后在经过一段时间后,禁行的方向和通行的方向互相转换状态,原来通行的状态变禁行状态,原来禁行的状态变为通行状态,如此循环下去。详细过程如下图2-1:
    状态① 状态②
    图 1图2-1 交通灯状态图
    状态①:东西方向的交通灯黄灯闪烁3秒后,红灯熄灭,绿灯点亮(东西方向允许车辆和行人通行),同时南北方向绿灯熄灭,红灯点亮(南北方向禁止车辆和行人通行),LED数码管倒计时显示40秒,在倒计时3秒时进入状态②。
    状态②:南北方向黄灯闪烁3秒后,红灯熄灭绿灯点亮(南北允许车辆和行人通行);同时东西方向绿灯熄灭,红灯点亮
    (东西方向禁止车辆和行人通行),LED数码管倒计时显示40秒,在倒计时3秒时进入状态①。
    接下来在没有人为干涉下将会一直按照上述进行循环。设计中还外设6个按键实现对交通灯控制系统的调控作用。

    电路原理图

    在这里插入图片描述

    在这里插入图片描述

    //——————————————————————————-——————————//
    相应的代码已经上传

    下载地址
    https://download.csdn.net/download/weixin_43442020/12231456

    下载链接里可以下载,解压后里面有压缩文件,压缩文件里面的资料更详细

    展开全文
  • 该系列单片机的始祖是Intel的8004单片机,后来随着Flash rom技术的发展,8004单片机取得了长足的进展,成为应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。
  • 熟练学会这100道51单片机的题,基本的小项目是没啥问题了,要精进,需掌握好电子基础知识.
  • 单片机C语言程序设计实训100例—基于8051+Proteus仿真》案例
  • 51单片机温度报警器设计(c程序及proteus仿真)51单片机温度报警器设计(c程序及proteus仿真)
  • 单片机控制步进电机

    万次阅读 多人点赞 2019-06-06 18:05:40
    单片机控制步进电机正转 反转 加速 减速;由LCD1602实时显示步进电机的状态;F-正转,B-反转;数字越大,转速越大; 仿真原理图如下: MCU和LCD1602显示模块: ULN2803驱动和步进电机模块: C语言代码如下...

    简介:
    用单片机控制步进电机正转 反转 加速 减速;
    由LCD1602实时显示步进电机的状态;F-正转 B-反转;数字越大,转速越大;
    仿真原理图如下:
    MCU和LCD1602显示模块:
    在这里插入图片描述
    ULN2803驱动和步进电机模块:
    在这里插入图片描述
    C语言代码如下:

    /*-----------------------------
    FileName: StepperMotor.h
    Function: 函数头文件
    Author: Zhang Kaizhou
    Date: 2019-6-6 17:59:39
    ------------------------------*/
    #include <reg52.h>
    #include <string.h>
    #define uchar unsigned char
    #define uint unsigned int
    #define Factor 5 // 转速控制常数	
    
    /*LCD1602端口设置*/
    sbit lcdrs = P1^0;
    sbit lcdrw = P1^1;
    sbit lcden = P1^2;
    
    /*步进电机驱动器端口设置*/
    sbit direcChange = P1^3; // 方向翻转
    sbit speedUp = P1^4; // 加速
    sbit slowDown = P1^5; // 减速
    
    /*主函数声明*/
    void keyScan();
    void execute();
    
    /*LCD1602显示相关函数声明*/
    void LCDInit();
    void displayInit();
    void display(uchar oper, uchar dat);
    void writeCommand(uchar command);
    void writeData(uchar dat);
    void delay(uchar xms);
    
    /*-------------------------------------------
    FileName:main.c
    Function: MCU控制步进电机
    Description:控制步进电机正转 反转 加速 减速;
    由LCD1602实时显示步进电机的状态;
    F-正转 B-反转;数字越大,转速越大;
    ---------------------------------------------
    Author: Zhang Kaizhou
    Date: 2019-6-6 17:56:41
    -------------------------------------------*/
    #include "StepperMotor.h"
    
    uchar code pulseTable0[] = {0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x04, 0x08}; // 一相励磁(同一时刻只有一个线圈通电,旋转角1.8度)
    uchar code pulseTable1[] = {0x0c, 0x06, 0x03, 0x09, 0x09, 0x03, 0x06, 0x0c}; // 二相励磁(同一时刻有两个线圈通电,旋转角1.8度)
    uchar code pulseTable2[] = {0x08, 0x0c, 0x04, 0x06, 0x02, 0x03, 0x01, 0x09,
    						    0x09, 0x01, 0x03, 0x02, 0x06, 0x04, 0x0c, 0x08}; // 一-二相励磁场(一二相交替励磁,旋转角0.9度)
    uchar speed = 0, startPos = 0; // 默认正转
    bit oper = 0/*操作数*/, direcFlag = 0; // 初始状态为正向
    
    void main(){
    	LCDInit(); // LCD1602显示初始化
    	displayInit();
    	while(1){
    		keyScan(); // 按键扫描
    		display(0, direcFlag);
    		display(1, speed);
    		execute();
    	}
    }
    
    /*按键扫描*/
    void keyScan(){
    	if(!speedUp){ // 加速
    		delay(5);
    		if(!speedUp){
    			if(speed < 4){
    				while(!speedUp);
    				speed++;
    			}else{
    				while(!speedUp);
    				speed = 3;
    			}
    		}
    	}
    	if(!slowDown){ // 减速
    		delay(5);
    		if(!slowDown){
    			if(speed != 0){
    				speed--;
    			}else{
    				while(!slowDown);
    				speed = 0;
    			}
    		}
    	}
    	if(!direcChange){ // 方向翻转
    		delay(5);
    		if(!direcChange){
    			while(!direcChange);
    			direcFlag = ~direcFlag;
    		}
    	}
    }
    
    /*步进电机控制执行函数*/
    void execute(){
    	uchar i, j;
    	startPos = (direcFlag == 0) ? 0 : 4; // 方向控制
    	for(i = startPos; i <= (startPos + 4); i++){
    		P2 = pulseTable0[i];
    		for(j = 0; j < (speed + 1) * Factor; j++){ // 用延时来控制脉冲输出的频率,从而控制步进电机转速
    			delay(10);
    		} 
    	}
    }
    
    /*-----------------------------
    FileName:display.c
    Function: LCD1602显示函数
    Author: Zhang Kaizhou
    Date: 2019-6-6 17:58:42
    ------------------------------*/
    #include "StepperMotor.h"
    
    uchar code table0[] = {"Direction:"}; // 每行的字符数据
    uchar code table1[] = {"Speed:"};
    uchar code table2[] = {"1234"};
    uchar code table3[] = {"FB"}; // F-正向 B-反向
    
    /*初始化LCD1602的设置*/
    void LCDInit(){
    	lcden = 0; // 拉低使能端,准备产生使能高脉冲信号
    	writeCommand(0x38); // 显示模式设置(16x2, 5x7点阵,8位数据接口)
    	writeCommand(0x0c); // 开显示,不显示光标
    	writeCommand(0x06); // 写一个字符后地址指针自动加1
    	writeCommand(0x01); // 显示清零,数据指针清零
    }
    
    /*LCD上电界面*/
    void displayInit(){
    	uchar i;
    	writeCommand(0x80); // 将数据指针定位到第一行首
    	for(i = 0; i < strlen(table0); i++){
    		writeData(table0[i]);
    		delay(5);
    	}
    	
    	writeCommand(0x80 + 0x40); // 将数据指针定位到第二行首
    	for(i = 0; i < strlen(table1); i++){
    		writeData(table1[i]);
    		delay(5);
    	}
    }
    
    /*LCD显示函数*/
    void display(uchar oper, uchar dat){
    	if(oper == 0){ // 方向显示
    		if(dat == 0){ // 正向
    			writeCommand(0x80 + strlen(table0)); // 数据指针定位到第一行空闲处
    			writeData(table3[0]);
    		}else if(dat == 1){ // 反向
    			writeCommand(0x80 + strlen(table0)); // 数据指针定位到第一行空闲处
    			writeData(table3[1]);
    		}
    	}
    	if(oper == 1){ // 速度显示
    		writeCommand(0x80 + 0x40 + strlen(table1)); // 数据指针定位到第二行空闲处
    		writeData(table2[dat]);
    	}
    }
    
    /*写指令函数*/
    void writeCommand(uchar command){
    	lcdrs = 0; // 命令选择
    	lcdrw = 0;
    	P0 = command;
    	delay(5);
    	
    	lcden = 1; // 产生一个正脉冲使能信号
    	delay(5);
    	lcden = 0;
    }
    
    /*写数据函数*/
    void writeData(uchar dat){
    	lcdrs = 1; // 数据选择
    	lcdrw = 0;
    	P0 = dat;
    	delay(5);
    	
    	lcden = 1;
    	delay(5);
    	lcden = 0;
    }
    
    /*延时函数*/
    void delay(uchar xms){
    	uint i, j;
    	for(i = xms; i > 0; i--)
    		for(j = 110; j > 0; j--);
    }
    
    展开全文
  • STC51单片机使用手册,中文版,对于初学的小伙伴们有很大帮助。
  • 51单片机与上位机串口通讯,通过上位机发送ASCII给51单片机,51单片机数码管显示ASCCII值(包括课程设计文档,上位机和51单片机的源码,可直接使用)
  • 51单片机通过WIFI模块ESP8266控制LED灯

    万次阅读 多人点赞 2018-06-16 18:47:40
    手机APP通过ESP8266 WIFI模块与51单片机通信控制LED灯的开关。下位机由单片机、ESP8266模块和LED灯组成,上位机由Android手机APP承担。我们在APP上发送LED灯的开关控制指令,ESP8266将收到的数据发送给单片机,从而...

    完整源码下载地址:https://download.csdn.net/download/tongxin082/21440621

    一、系统方案

    手机APP通过ESP8266 WIFI模块与51单片机通信控制LED灯的开关。下位机由单片机、ESP8266模块和LED灯组成,上位机由Android手机APP承担。我们在APP上发送LED灯的开关控制指令,ESP8266将收到的数据发送给单片机,从而实现对LED灯进行开关控制。

    设计好的实物是这个样子:

    二、硬件设计

    ESP8266模块作为一个透传模块使用,RXD、TXD分别连接51单片机的TXD和RXD,VCC和CH_PD管脚接3.3V电压,GND接地,只需要连接这些管脚,ESP8266模块就可以正常工作了。在单片机P2口上连接了三个5mm的LED灯,分别是红黄蓝三种颜色,我们的目的是通过手机APP上的开关控制着三个LED灯的亮灭。

    ESP8266实物管脚图

    三、单片机软件设计

    硬件的连接不复杂,接下来主要是单片机和手机APP代码的编写。

    单片机代码主要是串口初始化、串口中断和ESP8266的初始化。首先是串口初始化:

            TMOD=0x20;		//定时器1工作在方式2
    	TH1 = 0xfd;		//波特率9600
    	TL1 = 0xfd;
    	SM0=0;                  //串口工作在方式1
    	SM1=1;
    	EA = 1;			//开总中断
    	REN = 1;		//使能串口
    	TR1 = 1;		//定时器1开始计时

    然后是ESP8266初始化:

            delayms(1000);                        //延时
    	sendString("AT+CWMODE=2\r\n");        //设置ESP8266工作在AP模式下
    	delayms(1000);	
    	sendString("AT+CIPMUX=1\r\n");        //允许多连接
    	delayms(1000);	
    	sendString("AT+CIPSERVER=1\r\n");     //建立服务器
    	delayms(1000);	
    	ES = 1;				      //esp8266初始化之后开串口中断

    贴上51单片机负责串口发送的两个函数:

    //发送一个字节
    void sendChar(uchar a)
    {
    	SBUF = a;
    	while(TI==0);
    	TI=0;
    	
    }
    
    //发送字符串
    void sendString(uchar *s)
    {
    	while(*s!='\0')
    	{
    		sendChar(*s);
    		s++;
    	}
    		
    }

    在串口中断中处理接收到的数据:

    1:打开红色灯    2:关闭红色灯

    3:打开黄色灯    4:关闭黄色灯

    5:打开蓝色灯    6:关闭蓝色灯

    esp8266在收到数据并转发给单片机时的数据格式:+IPD,<client号>,<收到的字符长度>:收到的字符,比如+IPD,0,5:hello,其中+PID是固定的;0代表的是TCP客户端编号,esp8266最多支持5个客户端同时连接,也就是说客户端编号是0到4,在本设计中由于只有一个客户端与esp8266相连,所以客户端编号是0;5代表收到的字符长度;hello是收到的字符。在本例中esp8266发送给单片机的数据是+IPD,0,1:1,我们把接收到的字符串缓存到字符数组中,所以在处理收到的数据逻辑中,首先判断是否是以'+'开始的,否则视作无效数据,然后判断数组中的第十个数据,因为第十个数据才是上位机发送过来的数据。

    void uart() interrupt 4
    {
        if(RI == 1)   
        {
            RI = 0;     //清除串口接收标志位
    	receiveTable[i]=SBUF;
    	if(receiveTable[0]=='+')
    	{
    		i++;
    	}
    	else
    	{
    		i=0;
    	}
    	if(i==10)
    	{
    		i=0;
    		switch(receiveTable[9])
    		{
    			case '1':
    				RedLED=0;
    				break;
    			case '2':
    				RedLED=1;
    				break;
    			case '3':
    				YellowLED=0;
    				break;
    			case '4':
    				YellowLED=1;
    				break;
    			case '5':
    				BlueLED=0;
    				break;
    			case '6':
    				BlueLED=1;
    				break;
    		}
    	}
        
      }
    }

    四、Android APP软件设计

    Android APP是借助Android Studio来开发的,界面比较简单,通过编辑框输入esp8266的IP地址和端口号,esp8266默认的IP地址是192.168.4.1,端口号是333,这些都可以通过AT指令进行修改。布局页面的xml代码我们就不贴了,熟悉Android开发的读者很快就能根据截图编写出来,放上一个APP界面的截图:

    我们主要看一下逻辑代码部分:

    首先是控件的初始化和按钮点击事件回调的绑定

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            mBtnConnect = (Button) findViewById(R.id.btn_connect);
            mEtIP = (EditText) findViewById(R.id.et_ip);
            mEtPort = (EditText) findViewById(R.id.et_port);
            mBtnRedOn = (Button) findViewById(R.id.btn_red_on);
            mBtnRedOff = (Button) findViewById(R.id.btn_red_off);
            mBtnYellowOn = (Button) findViewById(R.id.btn_yellow_on);
            mBtnYellowOff = (Button) findViewById(R.id.btn_yellow_off);
            mBtnBlueOn = (Button) findViewById(R.id.btn_blue_on);
            mBtnBlueOff = (Button) findViewById(R.id.btn_blue_off);
            mBtnConnect.setOnClickListener(this);
            mBtnRedOn.setOnClickListener(this);
            mBtnRedOff.setOnClickListener(this);
            mBtnYellowOn.setOnClickListener(this);
            mBtnYellowOff.setOnClickListener(this);
            mBtnBlueOn.setOnClickListener(this);
            mBtnBlueOff.setOnClickListener(this);
    
        }

    按钮的点击回调方法:

        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.btn_connect:
                    //连接
                    if (mSocket == null || !mSocket.isConnected()) {
                        String ip = mEtIP.getText().toString();
                        int port = Integer.valueOf(mEtPort.getText().toString());
                        mConnectThread = new ConnectThread(ip, port);
                        mConnectThread.start();
                    }
                    if (mSocket != null && mSocket.isConnected()) {
                        try {
                            mSocket.close();
                            mBtnConnect.setText("连接");
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
    
                    break;
                case R.id.btn_red_on:         //开红灯
                    if (out != null) {
                        out.print("1");
                        out.flush();
                    }
                    break;
                case R.id.btn_red_off:        //关红灯
                    if (out != null) {
                        out.print("2");
                        out.flush();
                    }
                    break;
                case R.id.btn_yellow_on:
                    if (out != null) {
                        out.print("3");
                        out.flush();
                    }
                    break;
                case R.id.btn_yellow_off:
                    if (out != null) {
                        out.print("4");
                        out.flush();
                    }
                    break;
                case R.id.btn_blue_on:
                    if (out != null) {
                        out.print("5");
                        out.flush();
                    }
                    break;
                case R.id.btn_blue_off:
                    if (out != null) {
                        out.print("6");
                        out.flush();
                    }
                    break;
            }
        }
     

    负责连接esp8266的线程:

    private class ConnectThread extends Thread {
            private String ip;
            private int port;
    
            public ConnectThread(String ip, int port) {
                this.ip = ip;
                this.port = port;
            }
    
            @Override
            public void run() {
                try {
                    mSocket = new Socket(ip, port);
                    out = new PrintStream(mSocket.getOutputStream());
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            mBtnConnect.setText("断开");
                        }
                    });
                    new HeartBeatThread().start();
                } catch (IOException e) {
                    e.printStackTrace();
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(MainActivity.this, "连接失败", Toast.LENGTH_SHORT).show();
                        }
                    });
                }
            }
        }

    完整源码下载地址:https://download.csdn.net/download/tongxin082/21440621

    本文完!

    展开全文
  • Aurix TC275 书籍,仅供参考,模块:GPIO,GTM,CPU,RAM,FLASH,A/D,DMA,CAN,QSPI/ASCLIN/CCU6/STM
  • 单片机:基础知识

    万次阅读 多人点赞 2019-06-09 09:04:03
    单片机内部结构 单片机是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、...
  • 基于51单片机的RFID智能门禁系统

    万次阅读 多人点赞 2019-04-20 22:47:57
    计算机系统是以单片机或微处理器为数据处理核心,主要是对读取到电子标签进行相关的信息管理。 在阅读器的感应范围之外,电子标签无源无法工作,只有在阅读器感应范围之内,电子标签才是有源的。应答器工作所需...
  • MSP430 单片机中文开发手册,对于初学者很有帮助,对于开发者也可以查询
  • 51单片机串口通信原理讲解

    千次阅读 多人点赞 2019-10-24 23:54:50
    今天研究了一下51单片机的串口通信,使用的单片机是普中科技开发板,但实际上所运用到的硬件和其他品牌单片机都相同,没有区别,总结一下,自己的理解和看法。 通信原理 通信原理大致分为串行和并行两种方法,各有优...
  • 51单片机学习历程(二)快速入门51单片机

    千次阅读 多人点赞 2018-07-19 11:43:59
    有些学生觉得单片机很难学其实掌握入门方法也不难 开发环境搭建,不用多说,看网上教程 拿到51单片机该如何做? 首先打开看51单片机的管脚分布,51单片机是8个引脚一组,为什么是8个一组呢?  因为它是8位...
  • 51单片机串口通讯详解

    千次阅读 多人点赞 2019-11-04 22:10:20
    串口,作为单片机程序开发中最常用、最方便,也是应用最广泛的程序调试方法;无论是作为调试工具,打印出调试信息,还是对功能模块进行通信,串口是每个单片机开发人员最常用的单片机外设。 由于大部分51单片机不...
  • 51单片机入门者必看书籍,本书作者使用宏晶公司最新出的单片机stc15作为教学平台,内容与时俱进,实验丰富有趣,最后以汉藏的无人机项目更是精彩,值得51初学者拥有
  • 单片机读写fat32文件系统的源码工程,keil工程,绝对可用,打开编译即可,亲测通过编译通过, 8051单片机读写sd卡内容的例子,51单片机读写fat问系统范例,单片机文件系统,fat16文件系统,51单片机读写sd卡读写...
  • 单片机C语言程序设计实训100例 基于8051+Proteus仿真+代码(第2版) 彭伟单片机C语言程序设计实训100例 基于8051+Proteus仿真+代码(第2版) 彭伟单片机C语言程序设计实训100例 基于8051+Proteus仿真+代码(第2版) ...
  • 51单片机AD转换、串口蓝牙通讯、labview上位机显示 功能:单片机模拟数字转化,将数字信号通过蓝牙或者串口传输给电脑,电脑上labview显示出一个图表。 我这里实际使用是探测光信号强弱的: 光信号——>光电...
  • 精选单片机设计与制作30例

    热门讨论 2014-05-03 21:06:26
    1.红外感应自动移门 2.基于Propeller手势识别系统设计 3.红外感应开关 ...5.智能家居8路供电中控系统 ...6.单片机控制的无线遥控多用电源 ...14.单片机让数字调频收音化繁为简...30.用CH341A自制单片机程序下载器
  • 《从入门到精通STC8051单片机核心技术》这个是网上出的试读版,正式出版的书名为《51单片机轻松入门-基于STC15W4K系列(C语言版) 》,这个是完整的扫描版,还有书签的。要下的快点。
  • 学习单片机系列(一)单片机选型

    千次阅读 2020-02-16 00:10:22
    单片机选型 单片机选型关系整个项目开发,是一件重要而且费心的事情。如何选择一款合适的单片机型号,需要根据服务行业,行业发展,项目需求,技术积累等原则。单片机型号选择合适,整个系统就会经济,工作可靠;...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 355,333
精华内容 142,133
关键字:

单片机