后记:补考结束,没啥问题,虽然结果还没出来,这里要说明一下平时多学习积累的重要性,还有平时多进行记忆,不然很多东西其实一下子没法记住,特别是光看不练,还是得多靠自己的脑子进行复现,复现是检验你是否理解的重要指标之一,然后才是创造和提高,先能进行复现其他再说,还有就是有人给你指明方向也很重要,如果没有老师进行透题,虽然我复习了很多,但大部分都不考,相当于做无用功,很多时候就是这样子,学的全面自然重要,但要是能知道考试范围就能大大降低学习难度
目录
01绪论
02微型计算机组成与结构
03单片机汇编语言指令系统
04数据传送与交换指令
05中断服务
06定时/计数器
07单片机串行通信
08考题
一、绪论
- 冯·诺依曼计算机由运算、控制、储存、输入、输出五个部件构成
- 第四代电子计算机以微处理器(MPU)为核心
- 单片机由中央处理器CPU、储存器RAM、ROM、并行I/O、串行I/O、定时器/计数器、中断系统、系统时钟电路和总线8个构成
二、微型计算机组成与结构
- 计算机由硬件和软件组成
- 运算器进行算术运算、逻辑运算、数据转换
- 控制器是从内存期初指令的
- 指令告诉控制器做什么,数据从哪来到哪去
- 指令由操作码和地址码构成,操作码说明执行的操作,地址码说明数据的来源和去向
- 指令放在存储器里,叫做储存程序
- 控制器靠储存的程序执行叫做程序控制
- 冯诺依曼设计思想的核心在于储存程序和程序控制
- 储存器,一个触发器有两个状态可以表示一位二进制数,16位数要16个触发器
- 保存一个数的所有触发器合起来叫做一个存储单元,每个单元的编号叫做地址
- 所有储存单元的数量叫做存储容量
- 中央处理器CPU:CPU = 运算器 + 控制器
- 计算机主机:主机 = 中央处理器 + 主存储器
- 一个8位中央处理器
- 一个片内振荡器和时钟电路
- 4KB片内程序存储器
- 256字节片内RAM
- 4个8位并行的双向I/O口
- 2个16位定时器/计数器
- 1个全双工串行口
- 5个中断源
- 累加器Acc是8位寄存器
- PSW是一个8位的特殊功能寄存器,存放状态信息,包括进位信息C,半进位标志位AC,RS1和RS0是选择当前工作的寄存器,ov是溢出标志位,p奇偶校验位,奇数个1为1
- 一个字节是8位二进制数,每个地址单元只能存1个字节
PSW状态字8个状态字 功能 CY 进位标志位,最高位进位或借位置一 AC 半进位标志位,第四位进位或借位置一 F0 用户标志位 RS1 选择寄存器组 RS0 选择寄存器组 OV 溢出标志位 F1 保留位,不用 P 奇偶校验位,奇数个1为1
五个中断源
5个中断源 | 中断入口地址 |
---|---|
外部中断0 | 0003H |
定时器/计数器0溢出中断 | 000BH |
外部中断1 | 0013H |
定时器/计数器1溢出中断 | 001BH |
串行中断 | 0023H |
数据存储器RAM分为低一百二十八字节,和高一百二十八字节
低一百二十八字节存放四组通用寄存器区,位寻址区和用户RAM区
高一百二十八单元是特殊功能寄存器区SFR
低128单元从00H~7FH
高128单元从80H~FFH
序号 | 符号 | 名称 |
---|---|---|
1 | B | B寄存器 |
2 | ACC | 累加器 |
3 | PSW | 程序状态字 |
4 | P0 | P0口锁存器 |
5 | P1 | P1口锁存器 |
6 | P2 | P2口锁存器 |
7 | P3 | P3口锁存器 |
8 | TL0 | T0的低八位 |
9 | TH0 | T0的高八位 |
10 | TL1 | T1的低八位 |
11 | TH1 | T1的高八位 |
12 | DPL | DPTR的低8位 |
13 | DPH | DPTR的高8位 |
14 | IP | 中断优先级控制器 |
15 | IE | 中断允许控制寄存器 |
16 | TMOD | 定时/计数器工作方式寄存器 |
17 | TCON | 定时器控制寄存器 |
18 | PCON | 电源控制寄存器 |
19 | SP | 堆栈指针 |
20 | SBUF | 串行数据缓冲器 |
21 | SCON | 串行控制寄存器 |
注:TOT1不是特殊功能寄存器,而是TH0TH1TL0TL1
1个机器周期=6个状态周期=12个振荡周期
振荡周期=晶振频率的倒数
指令周期是1到4个机器周期
复位的条件,RST端保持至少2个机器周期的高电平
复位方式有三种:上电复位,按键电平复位,按键脉冲复位
复位后,特殊功能寄存器回到初始状态,其中SP=07H,P0到P3=FFH(悬1)
P0口:可以位寻址,扩展时作为低8位数据线,也可以作为通用I/O口
P1口:通用I/O口,没有第二功能
P2口:可以位寻址,扩展时作为高8位数据线,也可以作为通用I/O口
P3口:每一位都有第二功能,也可以作为通用I/O口
P3口 | 功能 |
---|---|
P3.0 | RXD串行输入口 |
P3.1 | TXD串行输出口 |
P3.2 | 反INTO外部中断0 |
P3.3 | 反INTO外部中断1 |
P3.4 | T0定时器0外部输入 |
P3.5 | T1定时器1外部输入 |
P3.6 | 反WR外部数据存储器写选通 |
P3.7 | 反RD部数据存储器写选通 |
三、单片机汇编语言指令系统
完整指令:
标号:操作码 操作数;注释
其中标号、操作数和注释有时候没有
操作码 | 功能 |
---|---|
Rn | n取工作寄存器组的R0~R7 |
Ri | 取R0和R1 |
dir | 8位直接地址 |
(dir) | 8位直接地址单元中的内容 |
#data | 8位立即数 |
#data16 | 16位立即数 |
addr16 | 16位地址值 |
addr11 | 11位地址值 |
bit | 位地址 |
rel | 相对偏移量,1字节补码数 |
@ | 间接寄存器或基地址寄存器的前缀 |
DPTR | 16位外部数据指针寄存器 |
A | 累加器 |
B | 寄存器B |
C | 进位位,借位或累加器 |
$ | 本条指令的起始地址 |
寻址方式: | |
1.寄存器寻址 | |
2.直接寻址 | |
3.寄存器间接寻址 | |
4.立即寻址 | |
5.变址寻址 | |
6.相对寻址 | |
7.位寻址 |
1.寄存器寻址
寻址范围包括:
通用寄存器R0~R7
特殊功能寄存器A、B、DPTR
例如 MOV A,R0;
2.直接寻址
直接给出操作数的地址
直接地址可以是特殊功能寄存器和内部RAM低128字节
例如 MOV A,30H;
3.寄存器间接寻址
能用于间接寻址的有:R0,R1,DPTR,SP
寻址范围:
(1)内部RAM低128个单元,通用形式为@Ri
(2)对片外数据存储器的64K字节间接寻址
(3)堆栈区:堆栈指令PUSH和POP用SP作为简介地址寄存器
4.立即寻址
有8位和16位
用#表示
eg:MOV A,#0FH;
5.变址寻址
地址为:PC或DPTR+A
只能对程序存储器ROM的数据进行操作,64KB,通常用于查表操作
MOVC A,@A+DPTR;
MOVC A,@A+PC;
JMP @A+DPTR;跳转
6.相对寻址
SJMP rel
地址偏移量用rel表示,rel是1个有符号的8位二进制补码,范围是-128~127
转移的目的地址=转移指令地址+转移指令字节数+rel
程序存储器
7.位寻址
寻址范围:
(1)内部RAM的位寻址区
(2)特殊功能寄存器的可寻址位
eg:
SETB 20H;
MOV 32H,C;
四、数据传送与交换指令
操作码<目的操作数>,<源操作数>
MOV 片内RAM
MOVX 片外RAM
MOVC ROM
源操作数不变,目的操作数变成源操作数
别人都可以传给A
除了RnRi都可以传给Rn
直接地址全都可以传给自己,包括自己
立即数都不能传给自己,但都可以传给别人
建议记住画法
MOVX 的所有指令(与外部RAM进行数据交换)
MOVX A,@Ri;
MOVX @Ri,A;
MOVX A,@DPTR;
MOVX @DPTR,A;
MOVC 查表指令,只能读取程序存储器,不能写
MOVC A,@A+DPTR;
MOVC A,@A+PC;
字节交换指令
XCH A,Rn;
XCH A,dir;
XCH A,@Ri;
低半字节交换
XCHD A,@Ri;A是八位的,交换低八位
SWAP A;自己的高四位和低四位交换
堆栈指令
用于保护程序断点和数据
PUSH dir;SP加一,(dir)→(SP)
POP dir;(SP)→(dir),SP减一
用于保护现场和回复现场
不带进位加法指令
ADD A,#data;A+data→A
ADD A,direct;A+(direct)→A
ADD A,Rn;A+Rn→A
ADD A,@Ri;A+(Ri)→A
如果位3有进位(位0到位7)
PSW里面的半进位标志AC置一,反之清零
如果位七有进位
PSW里面的进位标志CY置一,反之清零
如果两个有符号数在加减法时,只有低六位或者第七位发生进位或借位,则OV=1
带进位的加法指令
ADDC A,#data;A+data+CY→A
ADDC A,direct;A+(direct)+CY→A
ADDC A,Rn;A+Rn+CY→A
ADDC A,@Ri;A+(Ri)+CY→A
加一指令
INC A;
INC Rn;
INC direct;
INC @Ri;
INC DPTR;
说明:INC A只影响P(奇偶标志位)不影响其他的
带借位的减法指令
SUBB A,#data;A-data-CY→A
SUBB A,direct;A-(direct)-CY→A
SUBB A,Rn;A-Rn-CY→A
SUBB A,@Ri;A-(Ri)-CY→A
如果位3有借位(位0到位7)
PSW里面的半进位标志AC置一,反之清零
如果位七有借位
PSW里面的进位标志CY置一,反之清零
如果两个有符号数在加减法时,只有低六位或者第七位发生进位或借位,则OV=1
减一指令
DEC A;
DEC Rn;
DEC direct;
DEC @Ri;
只影响p
十进制调整指令
进位或半进位标志为一,则A+06H或60H
DA A;
乘法指令
MUL AB;A*B的结果放在BA中,B为高字节,A存低字节
若乘机大于255即一个字节,则OV=1
除法指令
DIV AB;A/B=A…B商存在A,余数存在B
逻辑与ANL
ANL A,Rn;
ANL A,direct;
ANL A,@Ri;
ANL A,#data;
ANL direct,A;
ANL direct,#data;
先转换成二进制再按位计算
结果存放入目的地址
逻辑或XRL
逻辑异或ORL
逻辑与用于清零
逻辑或用于置1
逻辑异或用于取反(与1异或取反)
清零
CLR A;
按位取反
CPL A;
循环左移
RL A;先转换成二进制
循环右移
RR A;
带进位的左移
RLC A;
带进位的右移
RRC A;
控制转移类指令
绝对转移指令
AJMP addr11;范围是2kb
长转移指令
LJMP addr16;范围64kb
短转移指令
SJMP rel;
变址寻址转移指令
JMP @A+DPTR;
条件转移指令
JZ rel;A为零则转移,不为零顺序跳转
JNZ rel;不为零跳转
比较不相等转移
CJNE A,direct,rel;
CJNE A,#data,rel;
CJNE Rn,#data,rel;
CJNE @Ri,#data,rel;
减一不为零跳转
DJNZ Rn,rel;
DJNZ direct,rel;
相当于计数器
子程序调用
调用指令和返回指令在子程序成对出现
调用子程序指令,会自动进行入栈和出栈操作,进行现场保护
短调用指令
ACALL addr11;2KB
长调用指令
LCALL addr16;64KB
返回指令
RET;子程序返回
RETI;中断程序返回
NOP;空操作指令,用于测试或者延时
位传送指令
MOV C,bit;
MOV bit,C;
例如
MOV P1.0,C;
位置一,位清零
SETB C;
SETB bit;
CLR C;
CLR bit;
例如
SETB P1.2;
CLR P3.3;
位与指令
ANL C,bit;
ANL C,/bit;将bit取反后再和C相与,存入C
位或指令
ORL C,bit;
ORL C,/bit;
位取反指令
CPL C;
位控制转移指令
JC rel;CY=1 转移
JNC rel; CY=0 转移
JB ACC.7,rel; 这样也可以
JNB rel;if bit=0 jump
JBC bit,rel;if bit=1 jump and bit clear to 0
Program Design
伪指令(编写程序要用,生成的汇编程序中没有)
ORG 16位地址
程序开始规定起始地址,一般是0030H开始,如果不规定就是0000H
END 汇编结束指令,整个源程序只能有一条END;
EQU 标号赋值伪指令
字符名称 EQU 赋值项
例如:
TEMP EQU 20H;
则之后的TEMP都可以用20H代替
DB从指定的地址开始,在程序存储器的连续单元定义数据
DB 8位数表
可以是一个字节常数或者字符或者字节串和字符串
例如
DB 30H,40H,21,10
定义字伪指令
DW 16位数表
例如
ORG 1000H
DW 1234H,55H,9876H
每个地址单元存两位,如1000=12H,1001H=34H,1002H=00H,1003H=55H…
定义存储区
从指定地址开始,保留指定个字节单元作为存储区
DS 表达式
例如
ORG 3000H
TAB:DS 08H
BIT位地址赋给名称
例如
P10 BIT P1.0
用P1.0代替P10
五、中断服务
中断源 | 中断请求标志位 | 中断入口地址 | 自然优先级 | 触发方式 |
---|---|---|---|---|
反INT0(P3.2) | IE0 | 0003H | 最高 | 低电平触发、或下降沿 |
T0(P3.4) | TF0 | 000BH | T0溢出 | |
反INT1(P3.3) | IE1 | 0013H | 最高 | 低电平触发、或下降沿 |
T1(P3.5) | TF1 | 001BH | T1溢出 | |
串行口 | T1/R1 | 0023H | 最低 | 串行口发送完成或接收完数据 |
注:INT是外部中断interfere |
中断相关的特殊功能寄存器 | 名称 |
---|---|
TCON | 定时控制寄存器 |
SCON | 串行口控制寄存器 |
IE | 中断允许控制寄存器 |
IP | 中断优先级控制寄存器 |
都可以进行位寻址 | |
(1)TCON | |
D7 | D6 |
—- | —- |
TF1 | TR1 |
IE0、IE1:外部中断请求标志,硬件自动设置,CPU接收到INTX端有效的中断请求后IEX位自动置1,中断响应期间自动清零
IT0、IT1:外中断请求触发方式控制位
ITX=0为低电平触发,一个机器周期
ITX=1为负跳脉冲触发,至少两个机器周期
TF0、TF1:定时器溢出中断请求标志位,相应溢出标志位TFx由硬件置1,a:软件查询由用户软件清零 b:中断方式是作为中断请求标志位,为1自动转向中断服务程序,再由硬件自动清零
TR0、TR1:T0、T1的运行控制位,相应的位等于1开启
(2)SCON
串行口控制寄存器
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|
SM0 | SM1 | SM2 | REN | TB8 | RB8 | T1 | R1 |
T1:串行口发送中断标志位,将CPU的数据写入缓冲器,启动发送
R1:串行口接收中断标志位,将CPU接收数据
(3)IE
中断允许控制寄存器:由用户软件设置
0AFH | 0AEH | 0ADH | 0ACH | 0ABH | 0AAH | 0A9H | 0A8H |
---|---|---|---|---|---|---|---|
EA | / | / | ES | ET1 | EX1 | ET0 | EX0 |
EA:中断允许总控制位 | |||||||
EA=0,中断总禁止 | |||||||
EA=1,中断总允许 |
EX0(EX1):外部中断允许控制位(INT0、INT1)
同理
ET0(ET1):定时/计数中断允许控制位(T0、T1)
ES:串行中断允许控制位
结论:
51单片机实行两级控制
单片机复位后处于禁止状态
单片机在中断响应后不会自动关闭中断,因此要手动关闭软件中断
(4)IP
中断允许控制寄存器:由用户软件设置
0BFH | 0BEH | 0BDH | 0BCH | 0BBH | 0BAH | 0B9H | 0B8H |
---|---|---|---|---|---|---|---|
/ | / | / | PS | PT1 | PX1 | PT0 | PX0 |
系统复位后,各位均为0,如果同级多个中断请求同时出现,则按从PX0到PS的顺序开始 | |||||||
低优先级不能打断高优先级 |
中断处理:
中断请求,IE置1
中断响应:满足中断响应的条件
中断初始化
六、定时/计数器
定时,即对机器周期进行计数,如果是12MHz的晶振,则机器周期为1/12*12=1微秒,计数频率1MHz
计数,对外来脉冲进行计数
从外部输入口T0(P3.4)和T1(P3.5)两个引脚输入,对下降沿计数
一个下降沿跳变要两个机器周期,则要24个振荡周期,则频率就是1/24振荡周期
51单片机里面有两个可编程的16位定时器和计数器,简称T0,T1,
分为T0:TH0,TL0 T1:TH1,TL1
定时器计数不占用CPU时间
开始工作时要对定时器计数器进行初始化
包括TCON和TMOD
初始化
1.对TMOD赋值
2.计算初值,送入TH0、TL0
3.如果使用中断要对IE赋值
4.将TR0或TR1置1,启动定时器和计数器
如果有多个中断入口,CPU会自动进入它要响应的那个入口,然后进行跳转,给它一个新的地址来写中断响应程序,它不会进到别人的入口,因为CPU会将这些入口屏蔽
七、单片机串行通信
通信方式分为串行通信和并行通信
(1)并行方式————数据的各位同时发送或同时接收,速度快,但是要用到多根传输线,所以一般只在近距离使用
(2)串行通信
分为单工、全双工和半双工
串行通行可以分为:同步串行通信和异步串行通信
同步:先发送一个字符作为同步字符,再连续发送数据,数据之间不能有间隔,用时钟来同步,速度比异步快
异步:一个字符一个字符发送,因此要增加起始位、奇偶校验位和停止位
起始位 | 数据位8位 | 奇偶校验位 | 停止位 |
---|
先发送起始位,规定数据发送线上无数据时电平为1,发送数据时先发送一个低电平
数据位,低位先发送再发送高位
奇偶校验位,数据发送完后,发送奇偶校验位检验数据正确性
停止位,高电平有效,可以是1、1.5、2位
波特率,每秒传送二进制数码的位数 b/s
串行口:由发送寄存器,接收寄存器,移位寄存器组成
八、考题
解答:
1.复位后,特殊功能寄存器回到初始状态0000H,不过其中SP=07H,P0到P3=FFH(悬1)
2.答: 80C51 有七种寻址方式:
1、立即寻址,用#表示,寻址空间为ROM;
2、直接寻址,例如A,30H,寻址空间为片内RAM的低128B和特殊功能寄存器;
3、寄存器寻址,用上Rn,寻址空间为A、B、DPTR、CY、通用工作寄存器等;
4、寄存器间接寻址,用上@,片内RAM低128B、片外RAM;
5、相对寻址,MOV rel;一般是标号,寻址空间为ROM; .
6、变址寻址,@A+DPTR,寻址空间为ROM;
7、位寻址,SETB,C等,寻址空间为片内RAM低128B的位寻址区的128个位,其字节地址为20H~2FH; 以及部分可以位寻址的特殊功能寄存器。
3.串行口有4种工作方式,通过SCON中的SMl、SM0位来决定
|SM0 |SM1 |工作方式 |功能说明|
|—-|—-|—-|—-|—-|
|0|0|0|同步移位寄存器输入/输出,波特率为fOSC/12|
|0|1|1|8位UART,波特率可变(TI溢出率/n,n=16或32)|
|1|0|2|9位UART,波特率为fosc/n,n=32或64)|
|1|1|3|9位UART,波特率可变(TI溢出率/n,n=16或32)|
工作方式0:
八位同步移位寄存器
(1)数据发送
数据从RxD引脚串行输出,TXD引脚输出同步脉冲。
(2)数据接收
在满足REN=l和RI=0的条件下,串行口处于方式0输入。
此时,RXD为数据输入端,TXD为同步信号输出端
工作方式1:
八位异步移位寄存器
(1)数据发送
发送时,数据从TXD端输出
4.一条乘法指令或者一条除法指令都需要 4 个机器周期,一个指令周期由1~4个机器周期组成,一个机器周期由6个状态周期,12个振荡周期组成
5.最长时间为2^N *机器周期=2^N * (1/晶振频率)*12
6.工作寄存器0区—3区,每个工作寄存器区为8字节(其中每字节分别记作R0-R7),共占用32字节的空间,0区的地址为00H-07H,1区的地址为08H-0FH,2区的地址为10H-17H,3区的地址为18H-1FH, 工作寄存器的选择由程序状态字PSW中RS0、RS1位的值决定,当RS1、RS0为00时选中0区,为01时选中1区,为10时选中2区,为11时选中3区
7.EA:中断允许总控制位
EA=0,中断总禁止
EA=1,中断总允许
EA引脚必须接低电平
8.80C51的中断系统有5个中断源:3个在片内;2个在片外
中断源 | 中断请求标志位 | 中断入口地址 | 自然优先级 | 触发方式 |
---|---|---|---|---|
反INT0(P3.2) | IE0 | 0003H | 最高 | 低电平触发、或下降沿 |
T0(P3.4) | TF0 | 000BH | T0溢出 | |
反INT1(P3.3) | IE1 | 0013H | 最高 | 低电平触发、或下降沿 |
T1(P3.5) | TF1 | 001BH | T1溢出 | |
串行口 | T1/R1 | 0023H | 最低 | 串行口发送完成或接收完数据 |
注:INT是外部中断interfere
这些在TCON里面
当IT0 = 0时,外部中断0被控制为电平触发方式。
当IT0 = 1时,外部中断0被控制为边沿触发方式。
IE0:外部中断0的中断请求标志。
当P3.2引脚信号有效时,IE0 = 1,外部中断0向CPU申请
中断,当执行完后,由片内硬件自动清0。
IE1:外部中断1的中断请求标志。
当P3.3引脚信号有效时,IE1 = 1,外部中断1向CPU申请
中断,当执行完后,由片内硬件自动清0。
TF0:定时器0溢出中断标志。
T0被启动计数后,从初值做加1计数,当计满溢出后由
硬件置位TF0,同时向CPU发出中断请求,此标志一直保
持到CPU响应中断后才由硬件自动清0。也可以由软件查
询该标志,并且由软件清0。
TF1:定时器1溢出中断标志。
T1被启动计数后,从初值做加1计数,当计满溢出后由
硬件置位TF1,同时向CPU发出中断请求,此标志一直保
持到CPU响应中断后才由硬件自动清0。也可以由软件查
询该标志,并且由软件清0。
串行的在SCON里面
TI:串行发送中断标志。
CPU将一个数据写入发送缓冲器SBUF时,就启动发送,
每发送完一个串行帧数据后,硬件将使TI置位。但CPU
响应中断时并不清除TI,必须在中断服务程序中由软件
清除。
RI:串行接收中断标志。
在串行口允许接收时,每接收完一个串行帧数据,
硬件将使RI置位。同样,CPU在响应中断时不会
清除RI,必须在中断服务程序中由软件清除。
中断服务入口地址设置一条跳转指令,转移到
中断服务程序的实际入口地址。 最好用LJMP指令,
这样很方便地将中断服务程序不受限制的安排在64K
B任何地方。因为51单片机的5个中断源的中断服务程序入口地址太接近,就8个单元的空,一般的中断程序放不下,所以编程时把中断服务程序放在较远的容量足够大的地方
9.访问外扩展的数据存储器,要由P2口提供高8位地址,P0
口提供低8位地址和8位双向数据总线
10.存储类型
函数类型 函数名(形式参数表) interrupt n using n
关键字interrupt是中断号,对于51单片机,n取值为
0~4。
关键字using后的 n是所选择的寄存器组,using是一个
选项,可省略
11
C51语言的强大功能及其高效率在于提供了丰富的可直
接调用的库函数。库函数可以使程序代码简单、结构清晰、
易于调试和维护。
下面介绍几类重要的库函数。
特殊功能寄存器包含文件reg51.h或reg52.h。
reg51.h中包含所有的8051的sfr及其位定义。
reg52.h中包含所有8052的sfr及其位定义,一般系统
都包含reg51.h或reg52.h。
绝对地址包含文件absacc.h:该文件定义了几个宏,
以确定各类存储空间的绝对地址。
输入/输出流函数位于stadio.h文件中。流函数默认
8051的串口来作为数据的输入/输出。如果要修改为
用户定义的I/O口读写数据,例如,改为LCD显示,
可以修改lib目录中的getkey.c及putchar.c源文件,
然后在库中替换它们既可。
动态内存分配函数,位于stdlib.h中。
能够对方便地对缓冲区进行处理的缓冲区处理函数位
于string.h中。其中包括复制、移动、比较等函数
- CPU(微处理器)
8位,与通用CPU基本相同,包括了运算器和控制器两大部分,
还有面向控制的位处理功能。
运算器:
算术逻辑运算单元ALU
累加器A
程序状态字寄存器PSW
控制器包括:程序计数器、指令寄存器、指令译码器、定
时及控制逻辑电路等。功能是控制指令的读入、译码和执
行,从而对各功能部件进行定时和逻辑控制。
13
指示堆栈顶部在内部RAM块中的位置。
堆栈结构–向上生长型。单片机复位后,SP为07H,使
得堆栈实际上从08H单元开始,由于08H~1FH单元分别属
于1~3组的工作寄存器区,最好在复位后把SP值改为60H或
更大值,避免堆栈与工作寄存器冲突。
14
51单片机数据储存器扩展最大容量可达64K字节, 地址范围:0000h~FFFFh
15
关键字 at 可对指定的存储器空间的绝对地址访问,格
式如下:
[存储器类型] 数据类型说明符 变量名 at 地址常数
其中,存储器类型为C51能识别的数据类型;数据类型为
C51支持的数据类型;地址常数用于指定变量的绝对地址,
必须位于有效的存储器空间之内;使用 at 定义的变量必
须为全局变量
16
与8051汇编语言相比, C51有如下优点。
可读性好。C51语言程序比汇编语言程序的可读性好,
编程效率高,程序便于修改、维护以及升级。
模块化开发与资源共享。用C51开发的程序模块可不经
修改,直接被其他工程所用,使得开发者能够很好地
利用已有的大量标准C程序资源与丰富的库函数,减少
重复劳动,同时也有利于多个工程师进行协同开发。
可移植性好。为某种型号单片机开发的C语言程序,只
需把与硬件相关的头文件和编译链接的参数进行适当
修改,就可方便地移植到其他型号的单片机上。
C51语言与8051汇编语言比较
生成的代码效率高。当前较好的C51语言编译系统编
译出来的代码效率只比直接使用汇编语言低20%左右,
如果使用优化编译选项,最高可达到90%左右
#include<reg51.h>
unsigned char dispcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
0x82,0xf8,0x80,0x90}; //共阳数码管的段码
void delay10ms(int n);
void main(void)
{
char i;
while(1)
{
for (i = 0; i <10; i++)
{
P1 = dispcode[i]; //数码管更新显示
delay10ms(50); //延时500ms
}
}
}
//10ms延时函数,应用于12.0MHz时钟。
void delay10ms(int n)
{
int i=0,j;
while(n–)
{
for(i=0;i<10;i++)
{
for(j = 0; j < 125; j++);
}
}
}
数码管码段的计算方式
https://jingyan.baidu.com/article/20b68a88f2c3bf796dec625f.html
其实就是8的每个管对应a、b、c…g,还有一个dp共阴的是0,共阳的是1,然后翻译成二进制到十六进制,前面用0x(十六进制的前缀)
阴极1表示开,阳极是0表示开,他们刚好所有数字都是反过来的