51单片机学期总结

来源:互联网 发布:手机录制视频剪辑软件 编辑:程序博客网 时间:2024/06/05 06:21
这学期开了《单片机原理与应用技术》,试考完了,课设也做完了,也放假一星期多了(^_^),抽出半天的时间把这学期在课堂上学到的东西做了个总结,以便以后可以快速查阅生气
学完这门课给自己的感觉是学到挺多以前不知到的东西,虽说是8051单片机,里面还是有很多值得学习的东西。以前一开始学51就直接用C语言去开发,只知道宏观上的原理,里面究竟是怎样工作的也只是有个大概的模型,自个也没有抽时间去学习,所以之前对51这种单片机的认识只是停留在表面上而已。另外,也感受到了汇编语言的“直接”在某些方面带来的优势,不过直接操作寄存器是比较直接豪放,51完成的功能一旦多代码就显得不清晰,而且移植修改花的时间也比较多。总之,对51原理的更深入理解需要看得懂汇编,高效的使用51当然用C语言。
总结内容开始
一、单片机有符号数的几种码 & 进制转换:
(1)
单片机中数都是以补码的形式存放的,这样进行减法运算时直接变成加法运算,乘除法也是直接将补码进行乘除运算
正数:原码 = 反码 = 补码
负数:反码 = 原码除符号位,其余位取反
补码 = 反码 + 1
8位有符号数的数值范围:
(十进制)(-128)-->(+127) “-128”是怎么来的?
(二进制)1111,1111-->0111,1111 (最高位为符号位)
(正数的最大值为0111,1111,最小值为0000,0001,故为+1~+127)
(负数的最大值为1111,1111,最小值为1000,0000,下面解释“-128”的由来)
负数在单片机中是以补码的形式存放,同时也是以补码的形式进行加减运算的
就拿char型-100来说,他的原码是1110,0100,反码是1001,1011,因此它的补码就是1110,1100
同理,1111,1111的补码是它的反码1000,0000(注意这里的最高位1仅仅代表符号),补码就是1000,0001,就是十进制的“-1”
1000,0000的补码是它的反码1111,1111,补码就是1(1)000,0000,有一个进位位舍弃变成1000,0000,结果是十进制的“-128”
负数会比正数表示的数值范围多1个的原因:7个数值位“000,0000”在符号位为0时被0占有,而符号位为1时被负数占有
减法运算:
100-50 = 0110,0100+1100,1110 = (1)0011,0010 进位位舍弃,符号位为0,结果是50
乘法运算:具体的计算过程,单片机不用理什么符号位,他就认为有多少个数相加
(-50)*(-2) = 1100,1110*1111,1110 = 0110,0100   有254(1111,1110)个206(1100,1110)相加然后取出结果的低八位,不信你试试254*206然后看低八位的二进制值
(2)进制转换
十进制转二进制、八进制、十六进制:
整数部分:
将十进制分别除于2、8、16,直到商小于进制的权时停止,先出来的余数是进制转换结果的低位(LB),最后出来的是高位(MB)
小数部分:
将十进制的小数位分别乘于2、8、16,每次乘完取走整数部分,剩下来的小数部分继续乘,直到小数为0停止,先取出来的是高位(MB)
补充一个概念:
非压缩8421BCD码:用8位来表示,其实高四位一直都是0
压缩BCD码:用4位来表示,常用

二、51单片机结构:涉及片内RAM地址分布,CPU架构、P0-3口特殊功能特点
(1)存储区结构:
(8051单片机的片内ROM是4KB,片内RAM是256字节(平时使用的STC89C52RC片内ROM是8K,RAM是512字节。STC12C5A60S2/AD的片内ROM有60K,片内RAM有1280字节。其他的查一下对应手册即可知道))


片内或片外的ROM分布

code区:代码存储区,最大64K (MOVC指令,DPTR间址寄存器)
内部RAM分布
data区:内部RAM区00H-7FH,通常128 Bytes,访问通过直接寻址 (MOV指令)
00H-1FH是4组工作寄存器的地址每一组有8个8位的寄存器都叫做R0-R7
20H-2FH位寻址区(位地址00H-7FH)
30H-7FH用户数据缓冲区,也就是程序跑起来之后临时变量的存放区,堆栈区也通常在软件上设置到这里
专用寄存器SFR区(128Bytes):从80H到FFH,主要是这些寄存器:P0、P1、P2、P3、PCON、SCON、TCON、TMOD、PCON、IE、ACC、B、SBUF、PSW等等
IDATA区:8051系列比如型号为8052的内部还有附加128Byte的RAM,从80H到FFH,为了区别SFR只能通过间接寻址来访问(MOV指令,@R1/R2寄存器)。
外部RAM分布
xdata区:最大64K (MOVX指令,DPTR间址寄存器)

C语言编程时:根据需要在定义变量或数组时加上以下关键字

data:直接寻址的片内RAM区低128B(00H~7FH) 
bdata:片内RAM的可位寻址区(20H~2FH),允许字节和位混合访问 
idata:单片机间接访问的片内RAM区,允许访问全部片内RAM 
pdata:Ri间接访问的片外RAM的低256B(00H~FFH) 
xdata:用DPTR间接访问的片外RAM,允许访问全部64KB片外RAM(0000H~FFFFH) 
code:汇编使用MOVC查表指令,单片机的64KB程序存储区ROM

(2)51单片机引脚功能特点:
IO接口:
P0:8位不带内部上拉电阻准双向IO口,非常值得研究的一组IO口,P0端口是51单片机的总线口,分时出现数据D7一D0、低8位地址A7一AO,以及三态,用来接口存储器、外部电路与外部设备
情况1:做地址/数据总线时和做输入I/O口时,p0口不用接上拉电阻。
情况2:但当做输出I/O口时,p0口必须要接上拉电阻(4.7k-10k)才可以。但是加上拉电阻不会提高他的驱动能力。
P1/P2/P3:带内部上拉电阻的准双向口,可作一般双向I/O使用。
P2口还可以作访问外部存储器的高八位地址
P3口还有第二功能:RXD、TXD、INT0、INT1、Timer0/1外部时钟输入、外部RAM写读控制线WR和RD
(注意:WR/RD两个信号是单片机自动产生的,很多人总是以为要设置什么寄存器之类的东西,容易出现迷惑,只要我们在程序里一调用 MOVX 或者在 C 语言里读写 XDATA(外部)的地址,这两个信号就产生了)
EA/VPP:EA=1,即该引脚接高电平VCC,先使用内部的ROM,访问单元的地址超过0FFFH(4K地址空间)时,将自动执行访问外部ROM程序。EA=0时只访问外部的ROM。
ALE/PROG:访问外部RAM/ROM时作为低八位地址锁存允许控制信号,这个信号也很有意思,他只有在使用MOVC和MOVX指令时才输出信号
PSEN:访问外部ROM时的读选通信号,低电平表示读信号
XTAL1/XTAL2:接晶振
RST:复位引脚
(3)最小系统电路:8051的ALE引脚和PSEN引脚输出高电平,同时RST引脚为高电平时系统复位

电阻和电容的参数共同决定电容的充电时间t=RCLn[E/Vt],这个时间又决定了单片机复位响应时间。下图中:


在按键按下去的瞬间,电容存储的电量通过R1释放,RST引脚由低电平变成高电平,进入复位状态,C和R1决定系统从按键按下到响应系统复位的时间。
按释放之后,电容通过R2开始充电,直至“-”极引脚变成低电平,C和R2决定从复位状态退出的时间长短。
(4)8051单片机系统设计方案:重点方案二
方案一:非总线式

不利用单片机的读写外部 RAM 功能, 而直接利用 I/O口读写方式进行外部设备的读写,比如我们点亮LED之类的操作
这种方式估计大家最熟悉不过了,它的实质就是根据外设需要的时序在程序上来控制IO引脚在什么时候高电平,什么时候低电平。
优点:灵活性好   缺点:扩展时要要重新设计电路
方案二:总线式
所谓总线式设计方案就是利用51单片机的读写外部RAM功能,将要设计的外部设备(比如说键盘、液晶等)统统挂到单片机总线上,使其统一按类似读写外部 RAM 功能的指令方法进行操作。
优点:方便扩展   缺点:灵活性差,设计要求较多
设计涉及的主要问题:单片机和外围设备时序逻辑的分配、 地址空间的分配、 总线驱动能力

51单片机的读写外部RAM功能分析:(作了解)

     

总线应用小结:硬件上,需要在P0口添加一个地址锁存器(一般是ROM/RAM的扩展),或者添加译码电路来选中外设,会使用WR/RD/PSEN/ALE这四个引脚。
软件上,汇编的话使用特殊指令MOVX(EXRAM),MOVC(EXROM)来进行操作外设。C语言的话使用xdata来声明变量的存储类型(例如:char xdata i=0;//以后CPU读写这个变量都是在外部的RAM里面的)

使用总线并没有想象中的那么难,它只是听起来比较高大上而已,不要畏惧它!它只是CPU在硬件上的一种机制,相关引脚有特殊时序而已。


三、定时器/计数器(计数器主要是用来计数外部时钟脉冲)
主要是工作方式的设置(TMOD),初值设置(TH0、TL0、TH1、TL1),中断控制(TCON)
此外定时器1是串口通信产生波特率的振荡源,只要开了定时器1,就默认提供给串口使用,不需要开中断之类的设置
对定时器/计数器的响应可以使用查询(TF0、TF1)方式和中断方式。
中断入口地址:
T0:000BH、T1:001BH
C语言中断组:
T0:interrupt 1、T1:interrupt 3

四、外部中断
主要是触发方式&中断请求设置(TCON),中断允许控制设置(IE),中断优先级设置(IP)
中断入口地址:
EX0:0003H、EX1:0013H
C语言中断组:
EX0:interrupt 0、EX1:interrupt 2

五、串口通信使用
主要是工作方式的设置(SCON)、波特率的设置(T1)、优先级(IP)、奇偶校验设置(TB8、RB8、PSW.0,注意把一个数值放进ACC累加器中如果“1”的个数是奇数PSW.0=1)
TB8和RB8还可以在多机通讯的时候作为地址帧和数据帧的区别,使用这种功能之后就不能再进行奇偶校验了
作用:可用来下载程序、扩展并行IO口(74LS164输出/74LS165输入)、多机通讯收发数据
在做串口通信的项目的时候需要用到反馈信息来进行调试比较容易找出问题。

六、电源控制(PCON)
空闲模式:置位IDLE进入空闲模式
空闲模式将停止程序执行,RAM中的数据仍然保持,晶振继续工作但与CPU断开,定时器和串行口继续工作,可由任一中断唤醒 ,执行完中断程序后,将从程序停止的地方(进入空闲模式时)继续指令的执行
掉电模式:也叫低功耗模式,通过置位PDWN位来进入,低功耗模式中晶振将停止工作,定时器和串行口都将停止工作。至少有2伏的电压加在芯片上,所以RAM中的数据仍将保存
省电模式只可由外部中断唤醒

七、IIC总线(集成电路总线)

IIC是一种新的芯片间的通讯方式由PHILIPS 开发和推广IIC通讯采用两条线进行通讯,一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL,因此也叫二线制串行总线。可进行多器件通讯。


总线上的每个器件都有自己的地址,数据传送是双向的,总线支持多主机。普通8051系列单片机是没有硬件支持IIC的,但是可以通过软件来实现模拟IIC总线通信。飞利浦的8051内核的单片机就是有硬件支持IIC的。

时序种类:起始信号、终止信号、发送“0”、发送“1”


主机传输时序:


主机发送数据给从机
(1)主机先发开始信号 (2)然后发送从机匹配(写)地址  (3)接着读SDA引脚检查一次从机发送的应答信号,“0”表示应答了  (4)若应答了接着串行发送8位数据(先发高8位)  (5)再去检查从机发送的应答信号  (6)收到应答信号就发终止信号
主机读取从机的数据
(1)主机先发开始信号 (2)然后发送从机匹配(读)地址  (3)接着读SDA引脚检查一次从机发送的应答信号,“0”表示应答了  (4)若应答了接着串行接收8位数据(先收高8位)  (5)一个字节接收成功的话,紧接着主机向从机发送应答信号“0”  (6)全部数据接收完毕之后向从机发送非应答信号迫使从机结束数据传输
当然上面的这种数据传输协议是广义上的,具体的时序还得根据外设的IIC接口时序来调整。
小结:编程时主机需要的函数
void  iic_start(void);//产生START信号void  iic_stop(void);//产生STOP信号void  iic_write_byte(uchar dat);//写IIC总线写1个字节uchar iic_read_byte(void);//从IIC总线读取1个字节void  iic_send_ack(bit ack);//由主向从发送应答码,0-ACK,1-NAK bit  iic_get_ack(void)//取得由从到主的应答码,0-ACK,1-NAK
常见的IIC总线接口设备:
OLED、12864、DS1302时钟芯片、A/D转换芯片AD1100、D/A转换芯片MAX517、调频接收发射模块PL-102B、三轴磁场模块HMC5883L、三轴陀螺仪加速度模块MPU6050等等

八、SPI总线(4线制串行总线接口)STC12系列的单片机就有这种接口,特点:全双工、同步。
四条导线分别为:
串行时钟(SCLK)
主出从入(MOSI):主机写从机的数据线
主入从出(MISO):主机读从机的数据线
从选信号(SS)
常见的SPI总线接口设备:
无线收发模块NRF24101、

九、看门狗

看门狗可设定溢出率,也可单独用来作为定时器使用。




0 0