51单片机读书笔记

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

51 单片机读书笔记
篇一:51 单片机读书笔记】
单片机是一种集成电路芯片,采用超大规模技术把具有数据处理能力(如算术运算、逻辑运算、数据传送、中断处理)的微处理器(cpu) ,随机存取数据存储器(ram) ,只读程序存储器(rom) ,输入输出电路(i/o 口),可能还包括定时/计数器,串行通信口(sci) ,显示驱动电路(lcd 或led 驱动电路),脉宽调制电路(pwm) ,模拟多路转换器及a/d 转换器等电路集成到一个单块芯片上,构成一个最小然而完善的计算机系统。

软件特征是指指令系统特性和开发支持环境,指令特性即单片机的寻址方式、数据处理方式、逻辑处理方式、输入输出特性及对电源的要求等等现在常规的单片机普遍都是将中央处理器(cpu) 、随机存取数据存储(ram) 、只读程序存储器(rom) 、并行和串行通信接口,中断系统、定时电路、时钟电路集成在一个单一的芯片上,增强型的单片机集成了如a/d 转换器、pmw( 脉宽调制电路)、wdt( 看门狗),有些单片机将lcd( 液晶)驱动电路都集成在单一的芯片上,这样单片机包含的单元电路就更多,功能就越强大单片机按内部数据通道的宽度,可分为4位、8 位、16 位及32位单片机。

单片机的特点可归纳为以下几个方面:
1) 集成度高
2) 存储容量大
3) 外部扩展能力强
4) 控制功能强
5) 低电压、低功耗
6) 低电压、低功耗
7) 可靠性高
mcs -51 系列单片机还有颇具特色的21 个特殊功能寄存器sfr 利用sfr 可完成对定时器、串行口、中断逻辑的控制,这就使得单片机可以把定时/计数器、串行口、中断逻辑等集成在一个芯片上。

mcs -51 单片机组成结构中包含
运算器、控制器、片内存储器、并行i/o 口、串行i/o 口、定时/计数
器、中断系统、振荡器等功能部件
sp 是堆栈指针寄存器,pc 是程序计数器,psw 是程序状态字寄存器,
dptr 是数据指针寄存器。

(5) 程序状态字寄存器(标志寄存器)。

程序状态字寄存器(psw) 是一个8 位的特殊寄存
器,它保存alu 运算结果的特征和处理状态,以供程序查询和判别。

psw 中各位状态信息通常是指令执行过程中自动形成的,但也可以由用户根据需要加以改变。

psw 中各位的定义如下:时,(cy)=1 ;当加法或减法运算时,最高位无进位或借位,(cy)=0 。

cy 位主要用在多字节的加减法运算中。

②ac(psw.6) :辅助进位标志。

无符号数运算中,当加法或减法运算时,低 4 位向高
4 位有进位或借位,(ac)=1 ;当加法或减法运算时,低 4 位向高 4 位无进位或借位,(ac)=0 。

ac 位常作为计算机进行bcd 码修正的判断依据。

③f0(psw.5) :用户标志位。

无特别意义,供用户自行定义。

通过软件置位或清零,并根据(f0)=1 或0 来反映系统某一种工作状态,决定程序的执行方式。

④rs1 、rs0(psw.4 、psw.3) :工作寄存器组选择位。

可用软件置位或清零,用于选定当前使用的 4 个工作寄存器组中的某一组。

将在存储器结构部分中介绍。

⑤ov(psw.2) :溢出标志。

主要用在有符号数运算时,运算结果超出了范围时,(ov)=1 ;否则,(ov)=0 。

如为8 位运算,若结果超过了8位补码所能表示的范围—128〜+ 127,则(ov)=1。

计算机在数据处理过程中,ov 置位和清位的依据是:即(ov)=(c)?(c7.6) 。

⑥p(psw.0) :奇偶标志位。

在执行指令后,单片机根据累加器 a 的
8 位二进制数中“ 1 ”的个数的奇偶,自动给该标志置位或清零。

若累加器 a 的8 位二进制数中“1”的个数为奇数,则(p)=1 ;若累加器 a 中“1”的个数为偶数,则(p)=0 。

该标志对串行通信的数据传输非常有用,通过奇偶校验可检验传输的可靠性控制器是单片机的神经中枢,是由指令寄存器ir 、指令译码器id 、
程序计数器pc 、
堆栈指针sp 、数据指针dptr 、定时及控制逻辑电路等组成。

它先以
主振频率为基准发出cpu 的时序,对指令进行译码,然后发出各种控
制信号,完成一系列定时控制的微操作,用来协调单片机内部各功能部件之间的数据传送、数据运算等操作
控制器
1) 程序计数器pc(16 位的计数器) 。

用于存放cpu 下一条要执行的指令地址,是一个16位的专用寄存器,可寻址范围是OOOOh〜ffffh , 共64 kb 。

(2) 指令寄存器(ir) 。

指令寄存器用于存放指令代码
(3) 指令译码器id 。

指令译码器用于分析指令功能,根据操作码产生相应操作的控制信号。

(4) 数据指针(dptr) 。

数据指针dptr 是一个16 位的专用寄存器,其高位字节寄存器用dph 表示,低位字节寄存器用dpl 表示。

(5) 定时与控制逻辑。

定时与控制逻辑由时序部件和微操作控制部件构成
(6) 时序部件。

时序部件由时钟系统和脉冲分配器构成
(7) 微操作控制部件。

计算机在执行一条指令时,总是把一条指令分成若干基本操作,称为微操作。

微操作控制部件根据指令产生计算机各部件所需要的控制信号。

这些控制信号是由指令译码器的输出信号、脉冲分配器产生的节拍脉冲以及外部的状态信号等进行组合产生
【篇二:51 单片机学习笔记】
51 单片机手册
51 单片机手册................................................... .. (1)
开发板................................................... . (1)
程序下载................................................... .. (1)
程序开发................................................... (1)
开发环境...................................................
i2c .....................................................................................................
(2)
i2c 通信读写数据过
程..... .. (2)
spi 总
线.....
(4)

括.....
(4)
c 语言应
用.....
...4

断.....
(4)
data, idata, xdata, pdata,
code (5)
c 语言中的static 详细分析 (6)
开发板
程序下载
stc90xx 的下载注意点: 1. 3.3v 和5v 短路帽需要接到5v 2.j0 挑到auto 3. txd,rxd 都在usb 端 4. 用usb 转串口线连接pc 和板子 5. usb 转串口的驱动装上. 6. 用pzisp.exe ,芯片型号要选对。

程序开发
开发环境
需要转上keil3
工程文件后缀为uv2
一开始要新建一个project ,会自动跳出选择相应芯片的窗口,选择对应的就ok, 主要是为了生成头文件
i2c
i2c 通信读写数据过程
在通信之初,主从机必须根据自己的要求约定好通信规则:command 的定义和位置、address 的位数和位置。

以读写从机寄存器数据为例:
假设从机寄存器地址为8 位、从机寄存器也位8 位(被读取数据为8 位);
约定读command 为0x01 ,写command 位0x02 ;约定主机发起通信后,第一个slave address 字节收到ack 后,紧跟的一个字节为command ,再下面一个字节为address 。

1. 读寄存器数据步骤:
1.1 主机先发起一次通信,将读command(0x01)和需要读取的寄存器地址address 写入从机;(主机发出写操作)
1.2 从机firmware 的处理:
1.2.1 将command 和address 分别提取出来;
1.2.2 判断command 的含义(本例中,是读指令还是写指令);
1.2.3 根据收到的的address ,将对应寄存器的的数据放入从机i2c 输出buffer ;(这个步骤可以使用指针)
1.3 主机再次发起一次通信,读取从机的数据;(主机发出读操作)
2. 写操作步骤:
2.1 主机发起通信,按约定依次写入command 、要写入的从机寄存器地址address 和要写入的数据data ;
2.2 从机firmware 要做的处理:
2.2.1 分别提取command 、address 和data ;
2.2.2 根据command 做出判断(本例中则判断是写入还是读取);2.2.3 将data 写入与接收到的address 对应的寄存器。

(这个步骤可以使用指针)。

spi 总线
概括通常有一个主设备和一个或多个从设备,需要至少 4 根线(1)sdo -主设备数据输出,从设备数据输入;(2)sdi -主设备数据输入,从设备数据输出;
(3)sclk -时钟信号,由主设备产生;
Wes -从设备使能信号,由主设备控制。

据输出通过sdo 线,数据在时钟上升沿或下降沿时改变,在紧接着的下降沿或上升沿被读取
spi 接口的一个缺点: 没有指定的流控制,没有应答机制确认是否接收到数据
spi 的片选可以扩充选择16 个外设, 这时pcs 输出=npcs, 说npcs0~3 接4-16 译码器,这个译码器是需要外接4-16 译码器,译码器的输入为npcs0~3 ,输出用于16 个外设的选择。

c 语言应用中断timer0_int() interrupt 1 using 2 { unsigne
d char temp1 ; unsigned char temp2 ;
executable c statements ;
}
interrupt 声明表示向量生成在(8*n +3) ,这里,n 就是interrupt 参数后的那个数字这里,在08h 的代码区域生成ljmp timer0_int 这样一条指令
中断源的矢量位置中断源keil 中断编号矢量地址最高优先级
60x0033 外部中断0 00x0003 定时器0 溢出10x000b 外部中断 1
20x0013 定时器 1 溢出30x001b 串口40x0023 定时器 2 溢出50x002b dma70x003b 硬件断点80x0043 jtag90x004b 软件断点10 0x0053 监视定时器12 0x0063 data, idata, xdata, pdata, code 从数据存储类型来说,8051 系列有片内、片外程序存储器,片内、片外数据存储器,片内程序存储器还分直接寻址区和间接寻址类型,分别对应code 、data 、xdata 、idata 以及根据51 系列特点而设定的pdata 类型,使用不同的存储器,将使程序执行效率不同,在编写c51 程序时,最好指定变量的存储类型,这样将有利于提高程序执行效率(此问题将在后面专门讲述)。

与ansi-c 稍有不同,它只分samll 、compact 、large 模式,各种不同的模式对应不同的实际硬件系统,也将有不同的编译结果。

在51 系列中data,idata,xdata,pdata 的区别:
data: 固定指前面0x00-0x7f 的128 个ram ,可以用acc 直接读写的,速度最快,生成的代码也最小。

idata:固定指前面OxOO-Oxff的256个ram,其中前128和data的
128 完全相同,只是因为访问的方式不同。

idata 是用类似 c 中的指针方式访问的。

汇编中的语句为:mox acc,@rx.(不重要的补充: c 中idata 做指针式的访问效果很好)
xdata: 外部扩展ram ,一般指外部0x0000-0xffff 空间,用dptr 访问。

pdata: 外部扩展ram 的低256 个字节,地址出现在a0-a7 的上时读写,用movx acc,@rx 读写。

这个比较特殊,而且c51 好象有对此
bug ,建议少用。

但也有他的优点,具体用法属于中级问题,这里不提。

【篇三:51单片机c语言学习笔记】
一、定时器/计数器
1. 定时器/计数器结构
2. 寄存器tcon :定时器/计数启动和停止
2.1 tcon 的高 4 位控制定时器/计数器的启动和中断申请,低 4 位与
外部中断有关。

2.1.1 tf1/tf0 :定时器/计数器t1 和t0 的益处标志位,定时器/计数器
有溢出时,会将tf1 或tf0 位置“1”,表示定时器/计数器有中断请求。

2.1.2 tri或tr0 :定时器/计数器t1和tO的启动/停止位。

tri或tr0 设置为“1”定时器/计数器t1 和t0 的启动,若设置为“0”,相应的定时器/计数器就停止工作。

3. 寄存器tmod :设置定时器/计数工作方式(用于计数或定时)。

3.1 tmod :定时器/计数器工作方式
3.2 tmod寄存器中高4位控制t1,低4位控制tO。

他们对定时器/ 计数器工作tO、t1
的控制功能是一样。

(下面以低4位控制定时器/计数器tO 为例,说明各位的具体控制功能)
3.2.1 gate :门控位,控制定时器/计数器的启动模式。

gate=0 时,只要用软件使tcon 中的tr0 置“1”,就可以启动定时器/ 计数器工作。

gate=1 时,将tr0 置“1”外,还需要外部中断引脚int0 也为高电平,才能启动定时器/计数器工作。

3.2.2 c/t :定时器/计数器模式选择位
c/t=0 时,定时器/计数器被设置为定时器工作方式,c/t=1 时,定时器/计数器被设置为计数器工作方式。

3.2.3 m0 、m1 :定时器/计数器工作方式设置位。

备注:t
0、t1 工作于定时或者计数时都不占cpu 工作时间。

4. 定时器/ 计数器的初始值计算
5. 定时器/ 计数器应用举例
5.1 用定时器t0 查询方式控制p2 口8 位led 灯闪烁使用定时器t0
的查询方式tf0 来控制p2 口8 位led 闪烁,t0 工作于方式1,led 灯闪烁周期100ms, 即亮50 ms ,熄灭50 ms 0 。

5.1.1 定时器t0 工作方式的设置
用指令对t0 的工作方式进行设置:tmod=0x01 ;//即tmod=0000 0001b, 低 4 位gate=0 ,c/t=0 ,m1m0=01
上述设置中,低 4 位c/t=0 ,使t0 工作于计时方式。

gate=0 ,使
tr0=1 时即可启动t0 开始工作。

m1m0=01 ,使t0 工作于方式1。

5.1.2 定时器初值的设定
单片机晶振为11.0592mhz, 所以经12 分频后送到t0 的脉冲频率是
f=11.0592/12
mhz ,周期t=1/f=12/11.0592=1.085 us 。

即每个脉冲计时 1.085 us ,
要计时50 ms (即50000 us ),需要计的脉冲数为
50000/1.085=46038( 次)。

则定时器的初始应设置为65536-
46083=19453 。

这个数需要t0 的高8 位寄存器(th0) 和低8 位寄存器(tl0) 来分别存储,这两个寄存器初始值的设置方法如下:
th0= (65536-46083 )/256 ;//定时器t0 的高8 位赋初值tl0= (65536-46083 )%256 ;//定时器t0 的低8 位赋初值
5.1.3 定时器t0 开始工作后,可通过编程让单片机不断查询益出标志位tf0 是否为1,若为1,则表示计时时间到,否则等待。

5.1.4 程序设计
实例42:用定时器t0 查询方式p2 口8 位控制led 闪烁
#includereg51.h // 包含51 单片机寄存器定义的头文件
[**************************************************************
函数功能:主函数**************************************************************/ void main(void)
{
// ea=1; // 开总中断
//et0=1; // 定时器t0 中断允许tmod=0x01; //tmod=0000 0001b, 使用定时器t0 的模式 1 th0=(65536-46083)/256; // 定时器t0 的高8 位赋初值
tl0=(65536-46083)%256; // 定时器t0 的低8 位赋初值tr0=1;// 启动定时器t0
tf0=0;// 定时器t0 溢出标志位用软件清零p2=0xff; // 先定义p2 口为高电平,led 灯不亮while(1) // 无限循环等待查询
{
while(tf0==0) // 查询标志位是否溢出
; // 空指令
tf0=0; // 若计时时间到tf0=1, 需用软件将其清0 p2=~p2;// 将p2 按位取反, 实现led 灯闪烁th0=(65536-46083)/256; // 定时器t0 的高8 位重新赋初值tl0=(65536-46083)%256; // 定时器t0 的低8 位重新赋初值}
}
5.2 用定时器t1 查询方式控制单片机发出1khz 音频
5.2.1 定时器t1 工作方式的设置
用指令对t1 的工作方式进行设置:tmod=0x10 ;//即tmod=0001 0000b, 高 4 位gate=0 ,c/t=0 ,m1m0=01
上述设置中,高 4 位c/t=0 ,使t1 工作于计时方式。

gate=0 ,使
tr1=1 时即可启动t1 开始工作。

m1m0=01 ,使t1 工作于方式1。

5.2.2 定时器t1 初值的设定
要发出1khz 音频,让单片机送给蜂鸣器(接p3.7 引脚)的电平信号,每隔音频的半个周期取反一次即可。

音频的周期为1/1000=0.001s, 即1000us, 则要计数的脉冲数为1000/1.0852=921 (次),定时器t1 的初值设置如下:
th1= (65536-921 ) /256 ;//定时器t0 的高8 位赋初值tl1= (65536-921 )%256 ;//定时器t0 的低8位赋初值
5.2.3 程序设计
实例43:用定时器t1 查询方式控制单片机发出1khz 音频
#includereg51.h // 包含51 单片机寄存器定义的头文件sbit sou nd=p3八7;// 将sou nd 位定义为p3.7 引脚
/************************************************************** 函数功能:主函数**************************************************************/ void main(void) {
// ea=1;// 开总中断//et0=1;// 定时器t0 中断允许tmod=0x10; //
tmod=0001 0000b, 使用定时器t1 的模式 1 th1=(65536-921)/256;// 定时器t1 的高8 位赋初值tl1=(65536-921)%256;// 定时器t1 的低8位赋初值tr1=1; // 启动定时器t1 tf1=0; // 定时器t1 溢出标志位用软件清零
while(1)// 无限循环等待查询
{ while(tf1==0) // 查询标志位是否溢出
; //空指令
tf1=0; // 若计时时间到tf0=1, 需用软件将其清0 sound=~sound; // 将
p3.7 引脚输出电平取反
th1=(65536-921)/256;// 定时器t0 的高8 位重新赋初值tl1=(65536-921)%256;// 定时器t0 的低8位重新赋初值}
} 二、中断
1. 中断优先响应级别:
2. void time0(void) interrupt 1 using0
注解: interrupt 1 为外部int0 中断using0 为使用0 组工作寄存器 (不声
明,默认为0 组)
3. 中断号要与定时器(中断源)相对应,才能正确响应中断。

4. 中断启用: 只有总开关ea 和分支开关均闭合,相应中断才被使用。

5. 外部int1/int0 、定时器/计数器、串口等中断开关说明:
1) ea :中断允许总控制位,ea=0 时,禁止所有中断,ea=1 时,开启总中断。

2) es: 串口允许中断控制位,es=0 时,禁止串口中断,es=1 时,允许串口
中断。

3) et1 :定时器/ 计数器t1 的溢出中断允许位,et1=0 时,禁止t1 中断,
et1=1 时,允许t1 中断。

4) ex1 :外部中断 1 中断允许位,ex1=0 时,禁止int1 中断,
ex1=1 时,允
许int1 中断。

5) et0 :定时器/ 计数器t0 的溢出中断允许位,et0=0 时,禁止t0 中断,
et0=1 时,允许t0 中断。

6) ex0 :外部中断0 中断允许位,ex0=0 时,禁止int0 中断,
ex0=1 时,允
许int0 中断。

6. tr0 和tr1 :定时器/计数器t0 和t1 的启动/ 停止位,tr0/tr1=1 ,定时器/
计数器开始工作,tr0/tr1=0 ,定时器/ 计数器停止工作。

7. tf0 和tf1 :定时器/ 计数器t0 和t1 的中断请求标志。

当定时器/ 计数器t0
和t1 工作产生溢出时,会将tf0 或tf1 位置 1 。

以定时器t0 为例,t0 溢出时,tf0 置 1 ,同时向cpu 发出中断请求。

在cpu 响应中断后,tf0 自动清0。

相关文档
最新文档