2019-09-22 14:43:29 qq_35358125 阅读数 125
  • 单片机有很多种-1.3.第1季第3部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第3个课程,主要讲了单片机的发展史,各种主流单片机的各自特点,STC51单片机的各系列的特点以及项目中如何选型主控单片机。

    2479 人正在学习 去看看 朱有鹏

之前使用单片机编程时,通常会使用一些较为不专业的语句,现在和大家一起学习下常见的单片机赋值操作;
一、把变量的某位清零

//定义一个变量 a = 1001 1111 b (二进制数) 
unsigned char a = 0x9f;  
//对 bit2 清零 
a &= ~(1<<2); 
//括号中的 1 左移两位,(1<<2)得二进制数:0000 0100 b  
//按位取反,~(1<<2)得 1111 1011 b 
//假如 a 中原来的值为二进制数: a = 1001 1111 b 
//所得的数与 a 作”位与&”运算,a = (1001 1111 b)&(1111 1011 b), 
//经过运算后,a 的值 a=1001 1011 b 13 // a 的 bit2 位被被零,而其它位不变

使用 a&=~(1<<x);可以将第x位清零;

二、把变量的某几个连续位清零

//若把 a 中的二进制位分成 2 个一组  
//即 bit0、bit1 为第 0 组,bit2、bit3 为第 1 组,  
//  bit4、bit5 为第 2 组,bit6、bit7 为第 3 组 
//要对第 1 组的 bit2、bit3 清零   
a &= ~(3<<2*1);   

//括号中的 3 左移两位,(3<<2*1)得二进制数:0000 1100 b 
//按位取反,~(3<<2*1)得 1111 0011 b 
//假如 a 中原来的值为二进制数: a = 1001 1111 b  
//所得的数与 a 作”位与&”运算,a = (1001 1111 b)&(1111 0011 b),  
//经过运算后,a 的值 a=1001 0011 b 14 // a 的第 1 组的 bit2、bit3 被清零,而其它位不变。 
//上述(~(3<<2*1))中的(1)即为组编号;如清零第 3 组 bit6、bit7 此处应为 3 
//括号中的(2)为每组的位数,每组有 2 个二进制位;若分成 4 个一组,此处即为 4 
//括号中的(3)是组内所有位都为 1 时的值;若分成 4 个一组,此处即为二进制数“1111 b” 

//例如对第 2 组 bit4、bit5 清零 
a &= ~(3<<2*2);

使用a&=~((2^m-1)<<m*n) m个为一组 第n组清零

三、对变量的某几位进行赋值

//a = 1000 0011 b 
//此时对清零后的第 2 组 bit4、bit5 设置成二进制数“01 b ” 
 a |= (1<<2*2); 
//a = 1001 0011 b,成功设置了第 2 组的值,其它组不变 

使用a|=(Q<<m*n) m个为一组,设置第n组的值为Q

四、对变量的某位取反

//a = 1001 0011 b 
//把 bit6 取反,其它位不变 
a ^=(1<<6); 
//a = 1101 0011 b 

使用a^=(1<<m) 使第m位取反

小结:赋值使用或|,清零使用与&,取反使用异或^

希望可以对大家学习起到帮助。

2019-03-12 20:45:25 xhluojinji 阅读数 132
  • 单片机有很多种-1.3.第1季第3部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第3个课程,主要讲了单片机的发展史,各种主流单片机的各自特点,STC51单片机的各系列的特点以及项目中如何选型主控单片机。

    2479 人正在学习 去看看 朱有鹏
  • 简介

单片机即单片机微型单片机,是将单片机主机(CPU、 内存和I/O接口)集成在一小块硅片上的微型机。

单片机又称微控制器(MCU)。

单片机具有三高优势(集成度高、可靠性高、性价比高)。

  • 单片机的历史

第一阶段,初级单片 机阶段。以Intel公司的MCS-48为代表

第二阶段(1978~1983):高性能单 片机阶段。以MCS-51系列为代表

第三阶段(1988年~):8位单片机, 巩固、完善及16位单片机推出阶段。 以MCS-96系列为代表

  • 单片机的发展趋势

CPU的改进:采用双CPU结构,以提高处理能力。增加数据总线宽度。采用流水线结构。

存储器的发展:加大存储容量。片内EPROM开始FLASH化。程序保密化。

片内I/O的改进:增加并行口的驱动能力。增加I/O口的逻辑控制功能。通信及网络功能加强。

集成更多的外围电路

引脚的多功能:

功耗

专用型单机发展加快:

  • 单片机主要技术指标

字长:8位机、16位机、32位机。

内存容量:1K=2^10=1024,1M=2^20

运算速度:时钟频率、主频、每秒运算次数

内存存取周期:50nS 、70nS 、200nS 。

  • 单片机运算基础

  • MCS-51单片机的结构与原理

一个8位CPU;

片内振荡和定时电路;

128B内部RAM(00H~7FH);

4个8位并行I/O口;

2个16位可编程定时/计数器;

一个全双工串行口;

5个中断源(可编程为两个优先级);

22个SFR(除PC外,其余21个分散在 80H~FFH之间)

堆栈深度可达80B(30H~7FH);

16B(128位,20H~2FH)可位寻址区

  • CPU内部结构

算术逻辑运算单元ALU (8位)

寄存器阵列:

1、工作寄存器R0~R7 (8位):暂存运算数据和中间结果。4个工作寄存器区,工作寄存器0区~3区。每个区均 含8个寄存器R0~R7 。用PSW中的两位PSW.4和PSW.3来切换工作寄存器区,选用一个工作寄存器区进行读写操作

2、累加器Acc(8位):需要ALU处理的数据计算结果多数要经过A累加器。

3、寄存器B(8位):与A累加器配合执行乘、除运算。也可用作通用寄存器。

4、程序状态字PSW(8位):存放ALU运算过程的标志状态,Cy AC F0 RS1 RS0 OV — P

5、数据指针DPTR(16位):存放片外存储器地址,作为片外存储器的指针。可分成 两个8位寄存器DPH、DPL使用。

6、堆栈指针SP(8位):堆栈是按“先进后出”原则存取数据的存储区。MCS-51堆栈设在片内RAM区。数据入栈/出栈时, SP自动加1/减 1,其内容始终为栈顶地址。复位时 SP=07H。

7、程序计数器PC(16位):CPU总是按PC的指示读取程序。PC可自动加1。因此CPU执行程序一般是顺序方式。当发生转移、子程序 调用、中断和复位等操作,PC被强制改写,程序执行顺序也发生改变。复位时,PC=0000H。

  • 8051存储器结构

程序存储器

在MCS-51的指令系统仅有两条:

MOVC A,@A+DPTR
MOVC A,@A+PC

复位后,程序计数器PC的内容为0000H

MCS-51最多可外扩64K字节程序存储器

数据存储器

从00H~1FH的32B单元是4个工作寄存器组。

地址20H~2FH的16B共128位,是可位寻址的内部RAM区,它们既可字节寻址, 亦可位寻址

其他80B是只能按字节寻址的内部RAM区,为用户区。

MCS-51单片机的堆栈安排在内部RAM内,堆栈 的深度以不超过内部RAM的空间为限。

  • 堆栈

堆栈是一种只允许在其一端进行数据 插入和删除操作的一种数据结构。数据 存取为“后进先出” 。

堆栈功能:保护断点和现场信息。

堆栈的建立:MCS-51的堆栈是设置在内部RAM 30H~7FH空间中,栈底为低地址单元,堆栈指针为SP。

  • 特殊功能寄存器SFR

SFR区部分寄存器功能介绍如下:

程序计数器(PC、16位):存放将要执行的指令地址

累加器(ACC、8位):存放数据或中间结果。

B寄存器(8位):主要用于乘、除运算。

数据指针(DPTR、16位):存放外部数据存储器的地址。

程序状态字(PSW、8位):用于寄存程序运行的状态信息。

标志位功能:

CY:(1)执行算术运算时,最高位向前 进位或借位时,CY为1;否则,CY为0。(2)在位操作中,作“位”累加器。

AC:用于十进制调整。当低四位向高四位进位或借位时,AC为1;否则AC为0。

F0:供用户定义的标志位,可以用指令置位或复位,用以控制程序的转向。

OV:(1)在带符号数的加减运算中,结果产生溢出,OV=1;否则,OV=0。(2)在乘法运算中,乘积超过255,OV=1, 表示积存放在B与A中;否则,OV=0,表示积只存放在A中。(3)在除法运算中,当除数为0时,OV=1, 除法无意义。

P:累加器A中数的奇偶性,若A中“1”的 个数为奇数,则P=1;否则,P=0。

  • 对专用寄存器的两点说明

(1) 单片机的22个专用寄存器中,有21个 是可按字节寻址的(PC除外)。这些字 节地址不连续的分散在内部RAM存储空间 的高128B中,剩余的空闲地址不允许用户使用。

(2) SFR只能使用直接寻址方式来访问它们,书写时既可使用寄存器名,也可使用寄存器单元地址

  • 具有位寻址能力专用寄存器

在21个特殊功能寄存器中,有11个特殊功能寄存器具有位寻址能力,它们的字节地址正好能被8整除,其十六进制地址的末位, 只能是0H或8H。

  • 外部数据存储器

MCS-51外部数据存储器寻址空间为64KB

MCS-51同外部数据存储器的指令有4条:

MOVX A,@Ri
MOVX A,@DPTR
MOVX @Ri, A
MOVX @DPTR,A

R0,R1为8位寄存器,寻址范围256B,DPTR为16位的数据指针,寻址范围64KB。

  • I/O端口

MCS-51有4个双向的8位并行I/O口:P0~P3

每一个口都有一个8位的锁存器

复位后它们的初始状态为全“1”

P0口是三态双向口:既可作为并行I/O口,也可作为数据总线口。当外部扩展了存储器或I/O端口,则只能作数据 总线和地址总线低8位。

P1口是专门供用户使用的I/O口,是准双向接口

P2口是准双向接口,既可作为并行I/O口,也可作为地址总线高8位口。当外部扩展了存储器或I/O端口,则只能作地址总线高8位

P3口是准双向口,又是双功能口。该口的每一 位均可独立地定义为第二功能,作为第一功能使用时,口的结构与操作与P1口相同。

P1,P2,P3口内部均有上拉电阻,当它们用作输入方式时,对应的口锁存器必须先“置”1

P0口内部没有上拉电阻,当它作为通用I/O时, 外接上拉电阻,在用作地址/数据线时,不必外加上拉电阻

P0口的每位输出可驱动8个LSTTL负载,P1-P3 口可驱动4个LSTTL负载

  • 复位电路

复位后PC值为0000H,故复位后的程序入口地址为0000H;

复位后PSW=00H,使片内存储器中选择0区工作寄存器,用户标志为F0为0状态;

复位后SP=07H,设定推栈栈底为07H;

复位后的P1,P2,P3口锁存器全为1状态,使 这些准双向口皆处于输入状态;

内部RAM不受复位的影响。

复位电路的基本功能是:系统上电时提供复位信号,在加电瞬间,RST端出现一定时间的高电平, 直至系统电源稳定后,撤销复位信号。

  • CPU时序

MCS-51内部有一个用于构成振荡器的高增益反相放大器,引脚XTAL1XTAL2分别是此放大器的输入端和输出端。

CPU执行一条指令的时间称为指令周期,它是 以机器周期为单位的,MCS-51典型的指令周 期为一个机器周期。

每个机器周期由6个状态周期组成,每个状态周期由2个振荡周期组成,状态周期即S1、S2、 S3、S4、S5、S6,而每个状态周期由两个节拍Pl,P2组成。

大多数8051指令执行时间为一个机器周期, MUL(乘法)和DIV(除法)需要4个机器周期

  • CPU引脚功能

双列直插式封装(DIP,Dual Inline Package

方形封装(PLCC,Plastic Leaded Chip Carrier

  • 引脚功能

端口线(4×8 = 32条)

1)P0.0-P0.7         2)P1.0-P1.7          3)P2.0-P2.7           4)P3.0-P3.7

电源线(2条):    VCC为+5V电源线,VSS为地线

控制线(6条):

ALE/PROG :地址锁存允许/编程线

EA/VPP:允许访问片外存储器/编程电源线

PSEN:片外ROM选通线

RST/VPD:复位/备用电源线

XTAL1和XTAL2:片内振荡电路输入/输出线

  1. ALE/PROG :地址锁存允许/编程线

配合P0口引脚的第二功能使用 ,用于把这个片外存储器低8位地址锁存到外部专用地址锁存器

在不访问片外存储器时,MCS-51自动在 ALE线上输出频率为fosc/6的脉冲序列。 该脉冲序列可用作外部时钟源或作为定时脉 冲源使用。

它可以在对8751片内EPROM编程/校验时传送5ms宽的负脉冲。

  1. EA/VPP:允许访问片外存储器/编程电源线

控制MCS-51使用片内ROM还是使用外ROM。 若=1,则允许使用片内ROM; 若=0,则只能使用片外ROM。

对8751的EA/VPP用于在片内EPROM编程/ 校验时输入21V或12.5V编程电源。

  1. PSEN:片外ROM选通线

执行访问片外ROM的指令MOVC时, 自动在线上产生一个负脉冲,用于为片外 ROM芯片的选通(相当于读信号RD)。其 他情况下,线均为高电平封锁状态。

  1. RST/VPD:复位/备用电源线

使CPU处于复位(即初始化)工作状态。 复位有上电自动复位人工按钮复位两种

RST/VPD的第二功能是作为备用电源输入端。 当主电源VCC,发生故障而降低到规定低电平 时,RST/VPD线上的备用电源自动投入,以保证片内RAM中信息不丢失。

  1. XTAL1和XTAL2:

片内振荡电路输入/输出线,这两个端子用来外接石英晶体和微调电容,即用来连接片内 OSC的定时反馈回路,

  • 单片机的工作方式

复位方式:

单片机在开机时都需要复位,以便CPU以及 其他功能部件都处于一个确定的初始状态, 并从这个状态开始工作,RST引脚是复位信号的输入端,复位信号是高电平有效,持续时间要有24个 时钟周期以上,若时钟频率为12MHz,则复位脉冲宽度至少 应为2µS。

程序执行方式:单步执行方式 、连续执行方式

单步执行方式是指按一次单步执行键就执行一 条用户指令的方式。 单步执行方式常常用于用户程序的调试。 单步执行方式是利用单片机外部中断功能实现的。

连续执行方式是单片机都需要的一种工作方式 被执行程序可以放在片内或片外ROM中,由于复位后程序计数器PC=0000H,可以预先在0000H处放一条转移指令,以便跳转到 0000H~0FFFFH中的任何地方执行程序。

节电方式:待机方式 、掉电保护方式

 

EPROM的编程和校验方式

 

 

 

2019-07-31 11:24:12 wujizhishang 阅读数 71
  • 单片机有很多种-1.3.第1季第3部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第3个课程,主要讲了单片机的发展史,各种主流单片机的各自特点,STC51单片机的各系列的特点以及项目中如何选型主控单片机。

    2479 人正在学习 去看看 朱有鹏

一、判断一个byte(或者int)的数中某一位是否为1(或0)

      要判断的数Num, 位置为第N位(从低字节起【1】)

if(Num &(1<<(N-1))>0)  //或者可以写16进制数Num &(hex(1<<N-1))
{
   //为1

}
else
{
   //为0
}

二、给一个byte(或者int)数中某一位赋值1或置0

Num |= (1<<(N-1)); //赋值1
Num |= 0;//置0

 

2019-12-15 22:53:17 qq_42689352 阅读数 7
  • 单片机有很多种-1.3.第1季第3部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第3个课程,主要讲了单片机的发展史,各种主流单片机的各自特点,STC51单片机的各系列的特点以及项目中如何选型主控单片机。

    2479 人正在学习 去看看 朱有鹏

#如何点亮单片机上的流水灯

1.首先我们需要查看该单片机上的led灯原理图
在这里插入图片描述
因为LED灯接的是VCC,所以我们只要把相对应的口定义之后赋值为0,就可以使得电源流通,从而点亮它。
2.编程烧录
在这里插入图片描述

2011-10-22 19:09:00 iteye_17686 阅读数 234
  • 单片机有很多种-1.3.第1季第3部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第3个课程,主要讲了单片机的发展史,各种主流单片机的各自特点,STC51单片机的各系列的特点以及项目中如何选型主控单片机。

    2479 人正在学习 去看看 朱有鹏

说明:原创都是个人经验,本人才疏学浅,如有不妥之处切盼高手指点纠正!

今天在做单片机的一个小程序,本来以为改一改例子程序很简单,结果耗费了一一整天时间。程序中用了很多strcat函数对字符串进行拷贝,我为了增强程序的通用性,就把原来字符串的地方用char数组代替。结果出现了很多意想不到的问题,输出字符混乱,系统重启等等。经过自己分析才发现strcat函数在作怪。C程序里规定字符串数组以\0作为结束符,也就是说strcat函数的操作只有在收到结束符才停止,如果不停止则胡乱寻址,程序不错才怪呢。

strlen,strcat,strcpy等函数是以\0即0x00为结束符标识。而在实际应用中,总不能每次都在字符串后面跟个\0字符吧,在一些需要转换类型的场合很不实用。

为了摆脱这个限制,可以使用strncpy,strncat 这一类函数来操作,根据len来决定拷贝和附加的长度。以strncpy函数举例

char *strncpy ( char *dst, /* destination string */

char *src, /* source string */

int len); /* max characters to copy */)

原文的表述:The strncpy function copies at most len characters fromsrc todst. Characters are copied until a null character ('\0') is copied or untillen characters have been copied. If the length ofsrc is less thanlen the remaining bytes in dst are padded with null characters ('\0').

注:*pStrInf=strstr(buf,"=");//返回指针是"="的起始地址,即包含"=".

其中这里特别说明一下:strcat和strcpy的区别,都是拷贝函数,Strcat是附加在源字符串的后面,而strcpy函数是从源字符串的0地址开始拷贝!!

为了以后自己不犯错同样错误,记录下来,也希望能帮助到别人。

没有更多推荐了,返回首页