单片机学习之Day2-结构与引脚

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:注意注意,此篇长文警告

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


一、单片机的基本组成与内部结构

此文以Atmel公司的AT89S51为例,介绍单片机的基本组成、内部结构和引脚功能。

  1. 单片机的基本组成与内部结构·
    AT89S51单片机基本组成功能框图如2-1图所示。单片机内部集成了一台微型计算机的各个主要部件,包括CPU、存储器、可编程I/O口、定时器/计数器、中断控制、串行口等,各部分通过内部总线相连。图中的P0、P1、P2、P3为4个可编程的输入/输出端口,TXD、RXD为串行口的输入、输出端。
    此外AT89S51的内部结构图如2-2图所示.在单片机内部,除了有CPU、RAM、RON定时器、串行口等主要功能部件之外,还有驱动器、锁存器、指令寄存器、地址寄存器等辅助电路部分。由图2-2还可以看出各功能模块在单片机的位置和相互关系。
    在这里插入图片描述
    在这里插入图片描述
  • [1] 中央处理器(CPU)
    中央处理器是单片机最核心的部分,主要完成运算和控制功能,这一点与通用微处理器基本相同,只是它的控制功能更强。80C51系列的CPU是一个字长为8的中央处理单元,它对数据的处理是以字节为单位运行的。

  • [2] 数据存储器(内部RAM)
    数据存储器用于存放变化的数据。在80C51单片机中,通常把控制与管理寄存器在逻辑上划分在内部RAM中,因为其地址与RAM是连续的。在AT89S51中,数据存储器的地址空间为256个RAM单元,但其中能作为数据存储器供用户使用的仅有前面128个,后128个被专用寄存器占用。AT89S52供用户使用的数据存储器比51多128个,共256个。

  • [3] 程序存储器(内部ROM)
    程序存储器用于存放程序和固定的常数等,通常采用只读存储器。只读存储器有多种类型,在AT89系列单片机中全部采用闪存。AT89S51内部配置了4KB闪存,52配置了8KB闪存。

  • [4] 定时器/计数器
    定时器/计数器用于实现定时和计数功能。AT89S51共有2个16位定时器/计数器,52共有3 个16位。

  • [5] 并行I/O口
    并行I/O口主要用于实现外部设备中数据的并行输入/输出,有些I/O口还有其他多种功能。AT89S51/52共有4个8位I/O口。

  • [6] 串行口
    AT89S51/52有一个UART全双工异步串行口,用于实现和其他具有相应接口的设备之间的异步串行数据传送。AT89S51/52还有一个ISP全双工同步串行口,用于实现串行在线下载程序。

  • [7] 时钟电路
    时钟电路的作用是产生单片机工作所需要的时钟脉冲序列。AT89S51/52单片机内部有时钟电路,但晶振和微调电容需要外接。

  • [8] 中断系统
    中断系统的主要作用是对外部或内部的中断请求进行管理和处理。AT89S51/52的中断系统可以满足一般控制应用的需要。AT89S51共有5中断源,其中有两个外部中断源: I N T 0 ‾ \overline{INT0} INT0 I N T 1 ‾ \overline{INT1} INT1;有3个内部中断源,即2个定时/计数中断和1个串行口中断。此外AT89S52增加了一个定时器2的中断源。

  1. 单片机的引脚功能
    AT89S51/52单片机实际有效的引脚为40个。为了尽可能减少引脚数,AT89S51/52单片机的部分引脚具有第二功能,也称为复用功能。 AT89S51/52单片机引脚图如下所示:
    AT89S51/52引脚图
    下面我们一起来看看它的各个引脚及功能
  • [1]主电源引脚GND VCC
    GND:接地 VCC:电源输入,接+5V电源
  • [2]时钟电路引脚XTAL1和XTAL2
    XTAL1:接外部晶体的一端。它是片内振荡器反向放大器的输入端。在采用外部时钟时,外部时钟振荡信号直接送入此引脚,作为驱动端。
    XTAL2:接外部晶体的另一端。它是片内振荡器反向放大器的输出端,振荡电路的频率是晶体振荡频率。若采用外部时钟电路,此角悬空不用。
  • [3] 控制信号引脚 R S T RST RST A L E ALE ALE/ P R O G ‾ \overline{PROG} PROG P S E N ‾ \overline{PSEN} PSEN E A ‾ \overline{EA} EA/ V P P VPP VPP
    1)RST:
    复位输入端。在该脚输入2个机器周期以上的高电平,将使单片机复位。
    2) A L E ALE ALE/ P R O G ‾ \overline{PROG} PROG
    地址锁存允许输出/编程脉冲输入端。这个引脚具有2种功能。在访问片外存储器时,ALE作为锁存扩展地址低位字节的输出控制信号(称允许锁存地址),平时不访问片外存储器时,该端也以1/6的时钟振荡频率固定输出正脉冲,供定时器或其他器件设备使用。AEL端的负载驱动能力为8个LSTTL。对片内存储器编程(固化)时,该引脚用于输入编程脉冲,此时为低电平有效。
    3) P S E N ‾ \overline{PSEN} PSEN
    片外程序存储器选通控制信号端。在访问片外存储器时,此端输出负脉冲作为程序存储器读选通信号。CPU在向片外程序存储器取指令期间, P S E N ‾ \overline{PSEN} PSEN信号在12个时钟周期中2次生效。不过,在访问片外数据存储时,这2次有效的 P S E N ‾ \overline{PSEN} PSEN信号不出现。 P S E N ‾ \overline{PSEN} PSEN端同样可驱动8个LSTTL负载。
    4) E A ‾ \overline{EA} EA/ V P P VPP VPP
    此端口为内、外程序存储选择/编程电源的输入端。它具有2种功能。当 E A ‾ \overline{EA} EA端接高电平时,CPU从片内程序存储地址0000H单元开始执行程序。当地址超出4KB(52是8KB)时,将自动执行片外程序存储器的程序;当 E A ‾ \overline{EA} EA端接低电平时,CPU仅访问片外程序存储器,即CPU直接从片外0000H开始执行程序。在对闪存编程时,该引脚用于施加编程电压 V P P VPP VPP。80C51根据型号不同有多种编程电压,有5V、12V、15V。
  • [4] 输入/输出引脚:
    P0~P3是51/52单片机与外界联系的4个8位双向并行I/O口。
    1)P0.0~P0.7:
    P0的8个引脚,在访问片外片外存储器时,它分时提供低8位地址和8位数据,故又可简称为AD0~AD7。当不作为总线时,也可作为普通I/O口使用。
    2)P1.0~P1.7:
    P1的8个引脚。51/52单片机的P1口除了可以作为一般I/O口,其中5位还有第二功能。列表如下:
P1口第二功能的名称及作用
P1.0T2(定时器/计数器2的外部计数输入/时钟输出)
P1.1T2EX(定时器/计数器2的捕获触发和双向控制)
P1.5MOSI(主机输出线,用于在系统编程)
P1.6MISO(主机输入线,用于在系统编程)
P1.7SCK(串行时钟线,用于在系统编程)

总结

今天也是加油的一天

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是天祥TX-1C单片机开发板的时钟程序示例: ```c #include <reg52.h> #define uchar unsigned char #define uint unsigned int sbit SCL=P2^1; //定义 I2C 时钟线引脚 sbit SDA=P2^0; //定义 I2C 数据线引脚 void I2C_Start(void); void I2C_Stop(void); void I2C_SendByte(uchar dat); uchar I2C_RecvByte(void); void Delay1ms(uint cnt); void DS1307_Init(void); void DS1307_Write(uchar addr, uchar dat); uchar DS1307_Read(uchar addr); void DisplayTime(void); uchar code WeekDayTable[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"}; //星期表 uchar code timeData[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //保存时间日期数据 uchar i; //循环计数变量 void main() { DS1307_Init(); //初始化 DS1307 while(1) { DisplayTime(); //显示时间 } } void I2C_Start(void) { SDA=1; //数据线高电平 SCL=1; //时钟线高电平 Delay1ms(1); //延时 SDA=0; //数据线低电平,发出起始信号 Delay1ms(1); //延时 SCL=0; //时钟线低电平,准备发送或接收数据 } void I2C_Stop(void) { SDA=0; //数据线低电平 SCL=1; //时钟线高电平 Delay1ms(1); //延时 SDA=1; //数据线高电平,发出停止信号 Delay1ms(1); //延时 } void I2C_SendByte(uchar dat) { uchar i; for(i=0; i<8; i++) { SDA=dat>>7; //发送数据的最高位 dat<<=1; //数据左移一位,准备发送下一位数据 SCL=1; //时钟线高电平,数据线上的数据被采样 Delay1ms(1); //延时 SCL=0; //时钟线低电平,准备发送或接收下一位数据 Delay1ms(1); //延时 } } uchar I2C_RecvByte(void) { uchar i, dat=0; SDA=1; //数据线高电平,准备接收数据 for(i=0; i<8; i++) { dat<<=1; //数据左移一位,准备接收下一位数据 SCL=1; //时钟线高电平,数据线上的数据被采样 Delay1ms(1); //延时 if(SDA) //如果数据线上的数据为高电平 { dat|=0x01; //将数据线上的数据存入 dat 的最低位 } SCL=0; //时钟线低电平,准备发送或接收下一位数据 Delay1ms(1); //延时 } return dat; } void Delay1ms(uint cnt) { uint i, j; for(i=0; i<cnt; i++) { for(j=0; j<110; j++); } } void DS1307_Init(void) { uchar i; I2C_Start(); //发起 I2C 起始信号 I2C_SendByte(0xd0); //发送器件地址+写命令 I2C_SendByte(0x07); //发送内部地址:时钟芯片控制寄存器 I2C_SendByte(0x00); //发送控制字节:清除 CH、RS0、RS1 位 I2C_Stop(); //发起 I2C 停止信号 I2C_Start(); //发起 I2C 起始信号 I2C_SendByte(0xd0); //发送器件地址+写命令 I2C_SendByte(0x00); //发送内部地址:秒 for(i=0; i<7; i++) { I2C_SendByte(timeData[i]); //发送时间数据 } I2C_Stop(); //发起 I2C 停止信号 } void DS1307_Write(uchar addr, uchar dat) { I2C_Start(); //发起 I2C 起始信号 I2C_SendByte(0xd0); //发送器件地址+写命令 I2C_SendByte(addr); //发送内部地址 I2C_SendByte(dat); //发送数据 I2C_Stop(); //发起 I2C 停止信号 } uchar DS1307_Read(uchar addr) { uchar dat; I2C_Start(); //发起 I2C 起始信号 I2C_SendByte(0xd0); //发送器件地址+写命令 I2C_SendByte(addr); //发送内部地址 I2C_Start(); //发起 I2C 起始信号 I2C_SendByte(0xd1); //发送器件地址+读命令 dat=I2C_RecvByte(); //接收数据 I2C_Stop(); //发起 I2C 停止信号 return dat; } void DisplayTime(void) { uchar year, month, day, weekDay, hour, minute, second; year=DS1307_Read(0x06); //读取年份 month=DS1307_Read(0x05); //读取月份 day=DS1307_Read(0x04); //读取日期 weekDay=DS1307_Read(0x03); //读取星期 hour=DS1307_Read(0x02); //读取小时 minute=DS1307_Read(0x01); //读取分钟 second=DS1307_Read(0x00); //读取秒钟 printf("%d/%d/%d %s %d:%d:%d\n", 2000+year, month, day, WeekDayTable[weekDay-1], hour, minute, second); //格式化输出时间 Delay1ms(1000); //延时1秒 } ``` 该程序使用了DS1307实时时钟芯片来实现时钟功能,使用I2C总线进行通信。程序中的`DS1307_Init()`函数用于初始化DS1307,将控制寄存器清零,并将时间数据写入DS1307的寄存器中。`DS1307_Write()`和`DS1307_Read()`函数用于向DS1307写入数据和从DS1307读取数据。`DisplayTime()`函数用于读取DS1307中的时间数据并将其格式化输出。 该程序需要在连接好DS1307实时时钟芯片的天祥TX-1C单片机开发板上运行,才能正常显示时间。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值