精华内容
下载资源
问答
  • 单片机外设有哪些?单片机内部的外设一般包括:串口控制模块,SPI模块,I2C模块,A/D模块,PWM模块,CAN模块,EEPROM,比较器模块,等等,它们都集成在单片机内部,有相对应的内部控制寄存器,可通过单片机指令直接...

    单片机外设有哪些?

    单片机内部的外设一般包括:串口控制模块,SPI模块,I2C模块,A/D模块,PWM模块,CAN模块,EEPROM,比较器模块,等等,它们都集成在单片机内部,有相对应的内部控制寄存器,可通过单片机指令直接控制。

    外设指的是单片机外部的外围功能模块,比如键盘控制芯片,液晶,A/D转换芯片,等等。外设可通过单片机的I/O,SPI,I2C等总线控制。

    51单片机的外设实验:

    实验1:外部中断0的实验

    实验步骤:将一根杜邦线的一端接到P3^2口上,另一端接电源或者地

    实验程序:

    #include

    sbit led = P1^0;

    void mian(void)

    { while(1){

    if(IE0){

    led = 0;

    }

    else{

    led = 1;

    }

    }

    }

    实验结果:当杜邦线另一端接电源时,led灭;当接地时,led就亮

    结论:无论配置与否,51单片机的外部中断这个外设都在工作着,不可能禁止

    实验2:定时器0的实验

    实验程序:

    #include

    sbit led = P1^0;

    void main(void)

    {

    TR0 =1;

    while(1){

    if(TF0 == 1){

    led = 0;

    }

    }

    }

    实验结果:观察到led被点亮

    结论:51单片机CPU控制定时/计数器0就靠的是TR0,当TR0为1时,工作;为0时,停止。

    当溢出时,就置TF0为1;反之,就为0。

    外设就是CPU之外的一种设备,它帮助CPU充分实现它的功能。

    单片机的外设功能:

    正如过去连载的“单片机入门”系列中所介绍的那样,对电子产品进行控制的单片机是由CPU、内存及外设功能等部分组成的(图1)。CPU根据指令(程序),执行运算、数据的读写以及进行条件判断等,而内存则用来保存该程序(记忆)。

    外设功能是指为了使单片机便于使用的各种功能。例如,CPU为了与外部的传感器及开关等进行信号交换,就需要“输入/输出端口(I/O端口)”这种外设功能。

    而且,将模拟输入信号转换为数字值的“A/D转换器”以及反过来将数字值转换为模拟输出信号的“D/A转换器”则是单片机对各种信号进行处理时不可或缺的外设功能。

    另外,还有为了正确测量时间所用的“定时器”以及提供日期和时计的“实时时钟(RTC)”,用于进行与时间相关的处理,此外还有将并行信号(parallel signal)和串行信号(serial signal)进行互相交换的“UART(Universal Asynchronous Receiver Transmitter,通用异步收发器)”等,以便进行通信。

    了解数字信号的输入/输出端口---“GPIO”

    在“输入/输出端口(I/O端口)”中,数字信号的输入/输出端口即“GPIO(General Purpose Input/Output)”也被称为“通用I/O端口”,是一种用于数字信号输入/输出的非常方便的端口。用于将数字输出的传感器值和开关的ON/OFF值传送到单片机的输入端及通过LED来显示单片机的运算结果,以及输出用于驱动电机运行的信号等等。

    GPIO被称为通用端口是其引脚既可以用于输入也可以用于输出。在早期的单片机中,引脚都被固定用于输入或输出,但是现在很多单片机中都可以自由地将其设定为输入或输出端口。假设GPIO端子有8个引脚,则可以将4个引脚用于输入,另4个引脚用于输出,也可以将1个引脚用于输入,剩下的7个引脚用于输出。

    在GPIO中,为了使CPU和外部设备之间进行数据交换,要相互执行通过程序处理的数字值(0或1)与信号(电压的LOW电平或HIGH电平)的转换。下面是作为RX63N单片机的GPIO端口基础的寄存器(※1)的作用(图2)。

    (※1)寄存器(Register):存在于单片机的CPU和外设功能内部中的记忆回路。用于运算和保持CPU的执行状态。由于是作为CPU及外设功能的内部回路,所以在对内存进行写入和读取时速度很快,但容量却非常小,既有可以用于各种用途的寄存器(通用寄存器),又有用于某些限定的功能和用途的特殊寄存器。

    端口方向寄存器(PDR)

    决定引脚方向的寄存器,也称为“方向寄存器”。

    端口输入数据寄存器(PIDR)

    输入时反映所使用的引脚状态的寄存器。从引脚输入LOW电平或者HIGH电平时会将之转换为0或1的值并读取该转换结果。随着引脚的变化数值也将发生变化。所以不会保持读取时的值。

    端口输出数据寄存器(PODR)

    此寄存器保存用作输出引脚的输出数据。将0或1的值转换为LOW电平或HIGH电平信号并从引脚输出。由于可以与内存一样保持改写前的值,所以在改写前来自引脚的输出电压也将保持不变。

    展开全文
  • 《51单片机外设和项目篇》是《朱有鹏老师单片机完全学习系列课程》的第2部分,本课程是51单片机领域的进阶课程,主要内容是51单片机的外设讲解和小项目,实现了环境温度和实时时间的显示、过温报警、通过按键调整...
  • 标题 单片机外设之一(时钟芯片DS1302) 何为DS1302? DS1302是由美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片。它可以对年、月、日、周、时、分、秒进行计时,且具有闰年补偿等多种功能。工作电压...

    标题 单片机外设之一(时钟芯片DS1302)

    何为DS1302?
    DS1302是由美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片。它可以对年、月、日、周、时、分、秒进行计时,且具有闰年补偿等多种功能。工作电压为2.0V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。
    主要特点是采用串行数据传输,可为掉电保护电源提供可编程的充电功能,并且可以关闭充电功能。采用普通32.768kHz晶振。
    有何用途?
    可以为显示设备,数码管、液晶屏LCD1602和12864等各种显示屏提供系统时间。
    底层头文件是什么?
    1、文件名ds1302.h
    #ifndef _DS1302_H
    #define _DS1302_H
    #define uint unsigned int
    #define uchar unsigned char
    /****************************************************************/
    //定义I/O接口的参数
    sbit DS1302_CLK = P1^7; //定义DS1302的串行时钟引脚
    sbit DS1302_IO = P2^6; //定义DS1302的数据引脚
    sbit DS1302_RST = P1^6; //定义DS1302的复位引脚

    sbit ACC7 = ACC^7; //累加器第7位
    sbit ACC0 = ACC^0; //累加器第0位

    #define AM(X) X
    #define PM(X) (X+12) //转成24小时制
    #define DS1302_SECOND 0x80 //时钟芯片的寄存器位置,存放时间
    #define DS1302_MINUTE 0x82
    #define DS1302_HOUR 0x84
    #define DS1302_WEEK 0x8a
    #define DS1302_DAY 0x86
    #define DS1302_MONTH 0x88
    #define DS1302_YEAR 0x8c

    /DS1302时钟部分子程序*******/
    typedef struct SYSTEMTIME
    {
    uchar Second;
    uchar Minute;
    uchar Hour;
    uchar Day;
    uchar Month;
    uchar Year;
    uchar Week;
    uchar DatToStr[11];
    uchar TimeToStr[9];
    }SYSTEMTIME; //定义的时间类型
    /************************************************************************/
    unsigned char DS1302Write10_16(uchar Date_10);

    /************************************************************************/
    void DS1302InputByte(uchar d);

    /*************************************************************************/
    unsigned char DS1302OutputByte(void);

    /*************************************************************************/
    void Write1302(uchar ucAddr, uchar ucDa);

    //
    unsigned char Read1302(uchar ucAddr);
    /
    /

    void DS1302_GetTime(SYSTEMTIME Time);
    /
    ************************************************************************/

    void DateToStr(SYSTEMTIME Time);
    /
    ************************************************************************/
    //时钟芯片初始化
    void Initial_DS1302(void);
    #endif
    2、头文件名函数的实现文件DS1302.C
    #include <reg51.h>
    #include <ds1302.h>
    //全局变量
    extern SYSTEMTIME CurrentTime;
    extern SYSTEMTIME CurrentTime1;
    uint txbut,hxbut,hbut;
    uchar data_byte;
    uchar ck;

    /*************************************************************************/
    unsigned char DS1302Write10_16(uchar Date_10) //10位转16位
    {
    uchar Write_date,date1;

    Write_date=Date_10/10;
    date1=Date_10%10;
    Write_date=Write_date16+date1;
    return(Write_date);
    }
    /
    ************************************************************************/
    void DS1302InputByte(uchar d) //实时时钟写入一字节(内部函数)
    {
    uchar i;

    ACC = d;
    for(i=8; i>0; i--)
    {
        DS1302_IO = ACC0;               //相当于汇编中的 RRC
        DS1302_CLK = 1;
        DS1302_CLK = 0;
        ACC = ACC >> 1; 
    } 
    

    }
    /*************************************************************************/
    unsigned char DS1302OutputByte(void) //实时时钟读取一字节(内部函数)
    {
    uchar i;

    for(i=8; i>0; i--)
    {
        ACC = ACC >>1;                  //相当于汇编中的 RRC 
     	ACC7 = DS1302_IO;
        DS1302_CLK = 1;
        DS1302_CLK = 0;
    } 
    return(ACC); 
    

    }
    //
    void Write1302(uchar ucAddr, uchar ucDa)//ucAddr: DS1302地址, ucData: 要写的数据
    {
    DS1302_RST = 0;
    DS1302_CLK = 0;
    DS1302_RST = 1;
    DS1302InputByte(ucAddr); // 地址,命令
    DS1302InputByte(ucDa); // 写1Byte数据
    DS1302_CLK = 1;
    DS1302_RST = 0;
    }
    /
    /
    unsigned char Read1302(uchar ucAddr) //读取DS1302某地址的数据
    {
    uchar date1,date2;

    DS1302_RST = 0;
    DS1302_CLK = 0;
    DS1302_RST = 1;
    DS1302InputByte(ucAddr|0x01);       // 地址,命令 
    date1 = DS1302OutputByte();        // 读1Byte数据
    DS1302_CLK = 1;
    DS1302_RST = 0;
    date2=date1/16;
    date1=date1%16;
    date1=date1+date2*10;
    
    return(date1);
    

    }
    /************************************************************************/

    void DS1302_GetTime(SYSTEMTIME *Time)
    //获取时钟芯片的时钟数据到自定义的结构型数组
    {
    uchar ReadValue;

    ReadValue = Read1302(DS1302_SECOND);
    Time->Second = ReadValue;
    ReadValue = Read1302(DS1302_MINUTE);
    Time->Minute = ReadValue;
    ReadValue = Read1302(DS1302_HOUR);
    Time->Hour = ReadValue;
    ReadValue = Read1302(DS1302_DAY);
    
    if(Time->Day>ReadValue)CurrentTime.Week++;
    if(CurrentTime.Week>7)CurrentTime.Week=1;
    Time->Day = ReadValue;    
    ReadValue = Read1302(DS1302_MONTH);
    
    if(Time->Month>ReadValue)CurrentTime.Week++;
    if(CurrentTime.Week>7)CurrentTime.Week=1;
    Time->Month = ReadValue;
    ReadValue = Read1302(DS1302_YEAR);
    Time->Year = ReadValue;;   
    

    }
    /*************************************************************************/

    void DateToStr(SYSTEMTIME *Time) //将时间年,月,日,放到数组里DateString[]
    {
    Time->DatToStr[0] = ‘2’;
    Time->DatToStr[1] = ‘0’;
    Time->DatToStr[2] = Time->Year/10 + ‘0’;
    Time->DatToStr[3] = Time->Year%10 + ‘0’;
    Time->DatToStr[4] = ‘/’;
    Time->DatToStr[5] = Time->Month/10 + ‘0’;
    Time->DatToStr[6] = Time->Month%10 + ‘0’;
    Time->DatToStr[7] = ‘/’;
    Time->DatToStr[8] = Time->Day/10 + ‘0’;
    Time->DatToStr[9] = Time->Day%10 + ‘0’;
    Time->DatToStr[10] = ‘\0’;

    Time->TimeToStr[0] = Time->Hour/10 + '0';
    Time->TimeToStr[1] = Time->Hour%10 + '0';   
    Time->TimeToStr[2] = ':';
    Time->TimeToStr[3] = Time->Minute/10 + '0';
    Time->TimeToStr[4] = Time->Minute%10 + '0';
    Time->TimeToStr[5] = ':';
    Time->TimeToStr[6] = Time->Second/10 + '0';
    Time->TimeToStr[7] = Time->Second%10 + '0';
    Time->TimeToStr[8] = '\0';
    

    }
    /*************************************************************************/
    //时钟芯片初始化
    void Initial_DS1302(void)
    {
    Write1302(0x8e,0x00); //写入允许
    Write1302(0x8c,0x11); //以下写入初始化时间 日期
    Write1302(0x88,0x08); //
    Write1302(0x86,0x23); //
    Write1302(0x8a,0x04); //写入星期
    Write1302(0x84,0x01); //
    Write1302(0x82,0x31); //
    Write1302(0x80,0x20); //
    Write1302(0x8e,0x80); //禁止写入
    }
    应用
    以1602为例,处理器为STC89C52RC单片机,对DS1302的系统时间进行调用。如下所示:
    while(1)
    {
    DS1302_GetTime(&CurrentTime); //获取时钟芯片的时间数据
    DateToStr(&CurrentTime); //日期数据转换液晶字符

    	for(i=0;i<100;i++)
    	{
    		DisplayYear(CurrentTime.Year);
    	}
    
    	for(i=0;i<100;i++)
    	{
    		DisplayMD(CurrentTime.Month,CurrentTime.Day);
    	}
    
    	for(i=0;i<250;i++)
    	{
    		DS1302_GetTime(&CurrentTime);  //获取时钟芯片的时间数据
        	DateToStr(&CurrentTime);       //日期数据转换液晶字符
    		DisplayTime(CurrentTime.Hour ,CurrentTime.Minute ,CurrentTime.Second);
    	}
    }	
    
    展开全文
  • 单片机课程的主要内容包括:《朱有鹏老师单片机系列课程》的规划、课程设计、学习路线介绍,单片机学习的意义、单片机与物联网的关系,51单片机工作原理、电路原理图识别、C语言基础知识等学习单片机软件开发必备的...

    《朱有鹏老师单片机学习系列课程》针对有志于物联网技术开发行业的学员设计,共分5季,总200余小时的课程。本课程属于第1季。

    单片机课程的主要内容包括:《朱有鹏老师单片机系列课程》的规划、课程设计、学习路线介绍,单片机学习的意义、单片机与物联网的关系,51单片机工作原理、电路原理图识别、C语言基础知识等学习单片机软件开发必备的基础知识,常用开发工具Keil uVision软件的使用、模拟单步调试方法、ISP下载方式与原理讲解,针对51单片机编程的零基础C语言讲解、学习单片机同时入门C语言,单片机和嵌入式系统常用基本外设(如LED、蜂鸣器、数码管、按键、DS1302实时时钟、38译码器、AD/DA转换器、串口、RS232/RS485通讯、定时器、液晶显示器、步进电机)的原理及编程控制方法。

    课程特色

    *零基础可学习,降低学习门槛。

    *深入浅出,通俗易懂。不怕学不会,就怕你不学习。

    *思路清晰、语言风趣,对着视频看也不会想睡觉······

    *视频 + 文档 + 练习题 + 答疑,多方位保证学习质量。

    *基础知识 + 思路引导的教学方式,授之以鱼更授之以渔。

    *系列课程。本教程只是入门篇,后续还有更多更精彩视频更新中。

    展开全文
  • 作者:佚名来源:本站原创点击数:更新时间:2007年08月14日【字体:大中小】随着电子技术的迅速发展,计算机已深入地渗透到我们的生活中,许多电子爱好者开始学习单片机知识,但单片机的内容比较抽象,相对电子爱好者...

    作者

    :

    佚名

    来源

    :

    本站原创

    点击数

    :

    更新时间:

    2007

    08

    14

    【字体:大

    小】

    随着电子技术的迅速发展,计算机已深入地渗透到我们的生活中,许多电子爱好者开始

    学习单片机知识,

    但单片机的内容比较抽象,

    相对电子爱好者已熟悉的模拟电路、

    数字电路,

    单片机中有一些新的概念,

    这些概念非常基本以至于一般作者不屑去谈,

    教材自然也不会很

    深入地讲解这些概念,

    但这些内容又是学习中必须要理解的,

    下面就结合本人的学习、

    教学

    经验,对这些最基本概念作一说明,希望对自学者有所帮助。

    一、总线:我们知道,一个电路总是由元器件通过电线连接而成的,在模拟电路中,连

    线并不成为一个问题,

    因为各器件间一般是串行关系,

    各器件之间的连线并不很多,

    但计算

    机电路却不一样,

    它是以微处理器为核心,

    各器件都要与微处理器相连,

    各器件之间的工作

    必须相互协调,

    所以就需要的连线就很多了,

    如果仍如同模拟电路一样,

    在各微处理器和各

    器件间单独连线,

    则线的数量将多得惊人,

    所以在微处理机中引入了总线的概念,

    各个器件

    共同享用连线,

    所有器件的

    8

    根数据线全部接到

    8

    根公用的线上,

    即相当于各个器件并联起

    来,但仅这样还不行,如果有两个器件同时送出数据,一个为

    0

    ,一个为

    1

    ,那么,接收方

    接收到的究竟是什么呢?这种情况是不允许的,

    所以要通过控制线进行控制,

    使器件分时工

    作,任何时候只能有一个器件发送数据(能有多个器件同时接收)

    。器件的数据线也就被称

    为数据总线,

    器件所有的控制线被称为控制总线。

    在单片机内部或者外部存储器及其它器件

    中有存储单元,

    这些存储单元要被分配地址,

    才能使用,

    分配地址当然也是以电信号的形式

    展开全文
  • 本文主要介绍单片机必须了解的定时器中断功能。
  • 单片机外设篇——SPI协议

    千次阅读 2021-01-31 14:15:40
    题外话:工作过程中,一直在移植别人写好的SPI协议,然后和外设的芯片(例如:Flash芯片、NFC芯片等)进行通信,但是都没有往底层深入的看,下午看了照着代码看了三个多小时,写这篇博客作为总结。 一、SPI协议是...
  • 大一时积累的51单片机库函数,包含了中断、定时器,串口通信等标准外设的使用,还有1602液晶、红外解码、I2C、SPI协议、TFT液晶、DS18B20等等常用传感器的使用,代码注释非常详细。
  • 01单片机执行指令我们来思考一个问题,当我们在编程器中把一条指令写进单片机内部,然后取下单片机单片机就可以执行这条指令。那么这条指令一定保存在单片机的某个地方,并且这个地方在单片机掉电后依然可以保持这...
  • 原标题:单片机系统的基本概念(1) 单片机组成:中央处理器、存储器、I/O设备。(2)存储器:物理实质是一组或多组具备数据输入/输出和数据存储功能的集成电路,用于充当设备缓存或保存固定的程序及数据。A、ROM(只读...
  • _单片机基础知识概述单片机的C语言应用程序设计 王 楠 EMail: heroyoyu2008@163.com TEL:1座机电话号码07 讲授提纲 一、单片机概述 二、8051单片机的特点 三、8051单片机的结构 四、8051单片机的引脚及其片外总线 五...
  • 单片机入门篇1、学好电子技术基础知识,如电路基础、模拟电路、数字电路和微机原理。这几门课程都是弱电类专业的必修课程,学会这些后能保证你看懂单片机电路、知道电路的设计思路和工作原理;2、学习计算机硬件知识...
  • 本科期间如果可以灵活运用单片机外设开发,那么将会在各种比赛中如鱼得水~~并且,有了这段学习的经验,再去学其他的就会知道如何去开头啦~ 03 软件下载 ‍下面这个是Altium Designer20的安装包...
  •  如图,为单片机AD转换器的一种: 各引脚名称及作用如下: VIN(+),VIN(-)——两模拟信号输入端,用以接收单极性、双极性和差模输入信号。 DB7~DB0——具有三态特性数字信号输出口。 AGND——模拟信号地。...
  • PIC32MX单片机外设库使用(Ⅰ)- 系统时钟及I/O口基本设置时间:2018-11-23 14:20:01[导读]开发环境:MAPLAB X IDE v1.85编译器:MPLAB XC 321.使用说明:PIC32外设库提供用于设置和控制32位外设的函数和宏。希望使用...
  • 大家是不是常常会遇到这种情况:咦,这个外设的输出频率是多少呢?这个IIC通信的通信频率,我怎么选择呢?系统时钟是多少呢?我怎么才能精确延时1ms呢?如果这些问题时不时的困扰你,那么推荐看看这篇文章,有助于...
  • AD 1.采样频率就是采样周期的倒数,也就是一秒钟采样的次数; 2.分辨率是决定采样最小值,比如基准电压为1v,8位的采样,最小值是1/256,1为的采样的最小值是1/1024,分辨率越高,采样越精确 ...
  • 高字节和低字节 一. 计算机的数值应视为连续若干个二进制位的集合; 二.... 三. (小端模式,人类正常读写存放顺序0x00,0x00,0x00,0x01)例如定义一个unsigned short型变量在0x1234 5678(数据寻址地址),那么这...
  • 外设与内设 在学习汇编语言时,我们会接触到一些寄存器,比如R0、R1、还有栈指针寄存器SP、下一条指令寄存器PC 等等。这些寄存器是存在于内核(如CPU)之内的,这些寄存器是我们无法通过c语言访问到的,而只能用...
  • 单片机外设 12864 等

    2011-10-19 11:58:00
    先贴资料 这个是12864的串行传输方式 还有就是pdf的说明 里面有指令 串行的代码如下: #include <REGx51.H>...#define RS P2_0 //片选 高电平有效 单片LCD使用时可固定高电平 cs ...#define S...
  • 单片机外设LCD1602液晶屏的介绍

    万次阅读 多人点赞 2017-06-04 22:09:59
    点阵组成,广泛应用在单片机应用系统中。 点阵图形型:笔记本电脑和彩色电视等设备中。 1602 液晶也叫 1602 字符型液晶它是一种专门用来显示字母、数字、符号等的点阵型液晶模块 它有若干个 5X7 或者 5X11 ...
  • 调试stm8L151的程序,先启动某个外设后再想关掉时发现执行了Deinit()函数后外设寄存器的值并没有恢复默认设置,竟然还保持原来的值,奇怪!!!! 经过一段时间调试发现我在执行Deinit()函数前将外设的时钟关掉了、...
  • 前面提到的按键的检测,第一种传统的扫描存在延时消抖和while松手检测语句的缺点;第二种的带标志位的检测法存在延时消抖的缺点;而现在介绍的按键扫描法是“快速识别”方法(以独立按键为例,因为矩阵键盘的扫描与...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,525
精华内容 1,010
关键字:

单片机外设