C51 AT89S51 期末考试 八股文复习 (不是S51的不适用)

 用的书是 张毅刚 C51 第二版  下面都是考试最喜欢考的重点 

word文件会直接挂在下载链接 不需要积分  个人笔记免费分享

在P0,P1,P2,P3 要是没有用sbit 而是直接用Px的形式,记住是对八位二进制所总体控制,写成0xff 0xdf ox00 千万不能写成P1=1或者P1=0;

对按键的判断可以通过中断也可以通过查询(第五章还需要补充

注意按键消抖的方法。

【中断】

TCON

TF1

TR1

TF0

TR0

IE1

IT1

IE0

IT0

定时器1溢出中断

定时器1启动

定时器0溢出中断

定时器0启动

外部中断1请求

外部中断1触发方式

外部中断0请求

外部中断0触发方式

IE

EA

--

--

ES

ET1

EX1

ET0

EX0

中断允许总开关

串口中断开关

定时器1中断开关

外部中断1 开关

定时器中断0开关

外部中断0开关

IP

--

--

--

PS

PT1

PX1

PT0

PX0

串口中断优先级

定时器1中断优先级

外部中断1 优先级

定时器中断0优先级

外部中断0优先级

单一中断的系统里,AT89SC51对外部中断的响应时间(不是处理时间)总是在3-8个机器周期(不是时钟周期)之内。

在单片机复位以后IP寄存器被清零,中断优先级统统都默认位低(0)优先级。

中断响应的条件:

  1. EA=1;
  2. 对应的中断请求标志位为1;(一般都是自动生成)
  3. 该中断源的中断允许位为1;
  4. 没有同级或者更高级的中断正在被服务。

上述可以说明可以用标志位查询中断的方式的时候,只要不让中断源的中断允许位为1就可以了。

同级之间的中断是不能被彼此打断的,这是因为AT89SC51的中断系统中有两个不能被位寻址的“优先级激活触发器“,一个用指示高优先级,一个用来指示低优先级。当一个中断被响应的时候要把对应的触发器置1,以防被打断。

同级中断优先级(高低至低)和他们的中断地址:外部中断0003H,T0溢出中断000BH,外部中断1 0013H,T1溢出中断001BH,串口收发中断0023H。

中断嵌套只能发生在单片机正在执行一个低优先级中断服务程序,此时又有一个高优先级中断产生,这时候就会出现高中断打断低中断服务程序,然后去执行高中断的服务程序,然后等高中断服务程序处理完了以后再处理低中断服务程序。

外部中断的过程是

先配置外部中断的参数(选择使用外部中断几,电平触发还是下降沿触发:IT1或者IT0)

有可能还需要控制中断优先级(PX1或者PX0)

启动总中断EA=1;

然后启动外部中断(在IE寄存器中选择EX1还是EX0)

选择查询方法还是中断方法,标志位为IE1或者IE0  标志位可以是硬件自动清零也可以是软件清零。

外部中断的中断标志位IE1或者IE0是会自动清除的,无论是下降沿模式还是低电平触发,但是低电平触发的外部中断有可能会因为中断标志位IE0或者IE1自动清除后仍然存在,所以需要在外部添加一个D触发器,通过链接到一个管脚上让该管脚产生一个负脉冲,然后让INT0变成1,从而使得其无效。

由于串口中断标志位TI和RI不会被自动清零,串口中断请求的撤销只能用软件在中断服务程序中将串口中断标志位TI或者RI置1。

中断函数不是乱写的 :void 名字(void) interrupt n using n

n是中断号,不是说乱写的

外部中断0  ----- n=0

定时器中断0  ----n=1

外部中断1   -----n=2

定时器中断1   -----n=3

串口中断。     -----n=5 

(编程题肯定会考)

 Using后面的不写的话默认会把中函数中的所有工作寄存器的内容保存在堆栈中,如果使用using的话,在中断函数的入口处将当前工作寄存器的内容将被保护到堆栈中,函数返回之前将被保护的寄存器的内容从堆栈中恢复。

中断函数会自动生成中断向量,退出中断函数的时候,所有被保存在堆栈中的工作寄存器(四个)和特殊功能寄存器(s51有26个,c51有21个)会被恢复。

一般来说中断函数既没有返回值也没有参数中断函数不能被直接调用,因为中断函数的返回是由汇编语言指令RETI完成的,RETI会影响不能寻址的中断优先级寄存器(到底能不能寻址,位寻址)的状态,如果主动调用中断函数,则不会执行RETI指令,其操作结果会出错。

如果要在中断服务函数中调用其他函数,那么必须保证被调用的函数所使用的寄存器区必须与中断函数使用的寄存器区不同

【定时器】

TCON

TF1

TR1

TF0

TR0

IE1

IT1

IE0

IT0

定时器1溢出中断

定时器1启动

定时器0溢出中断

定时器0启动

外部中断1请求

外部中断1触发方式

外部中断0请求

外部中断0触发方式

TMOD

GATE

C/T’

M1

M0

GATE

C/T

M1

M0

是由TRx控制还是两个来一起控制

选择定时器还是选择计数器

定时器工作模式选择

定时器工作模式选择

是由TRx控制还是两个来一起控制

选择定时器还是选择计数器

定时器工作模式选择

定时器工作模式选择

启动定时器一定要打开啊!!!

TF1和TF2计数器溢出中断标志位可以选择查询后进行软件清零,也可以使用中断,然后让硬件自动清零。

四种工作模式:

方式0    13位定时器/计数器

方式1    16位定时器/计数器

方式2    8位定时器/计数器 低位计数 高位自动重新装载

方式3    2个八位定时器/计数器 仅能使用T0   T1停止计数

方式0:13位:高8位加低5位 ,作为定时器(内部)的时候,计数时钟是机器周期fosc/12

作为计数器的时候,是对外部引脚的下降进行的。

GATE=0

正常

正常

GATE=1

(TRx=1&&

=1)才允许计数

(TRx=1&&

‘=1)才允许计数

方式1: 16位

 

方式2: 8位定时器/计数器 低位计数 高位自动重新装载 在地位计数器溢出的时候,在把中断标志位置1 的同时,将THx中的初值自动装载到低位HLx,让低位重新开始计数。

方式3: 鸠占鹊巢, HL0不受影响但是这时候TH0只能作为定时器,不能作为外部计数器,且它也需要一个启动装置,那么就是使用了T1的启动标志位TR1,占用了T1的中断请求标志位TF1。 这时候的T1可以在方式0,1,2下作为串口波特率发生器。如果这时候强制设置为方式3,则将停止计数。

定时器计数外部脉冲的c51端口在T0,T1的管脚上

计数外部脉冲是负跳变,下降沿,每个机器周期都会进行采样,花费一个机器周期,采样高电平一个机器周期,采样低电平一个机器周期,在下一个机器周期的时候对计数器进行增加1的操作。所以需要计数的脉冲的最高频率为系统震荡器频率的fosc/24

【串口】

SCON

SM0

SM1

SM2

REN

TB8

RB8

TI

RI

方式选择

方式选择

多机位控制

允许串行接收

发送第9位数据

接收到的第9位数据

发送中断标志位

接收中断标志位

PCON

SMOD

--

--

--

GF1

GF2

PD

IDL

波特率加倍标志

--

--

--

希望不考

希望不考

希望不考

希望不考

SM2: 用来辅助多机位通行的过程,当SM2=1的时候,只有当接收到第9位置(RB8)为1的时候,才能使RI置1,产生中断,并且将收到的前8位的数据送到SBUF,如果第九位的数据为0的时候,则将接收到的前8位数据丢弃。

SM2=0的时候,无论RB8是0还是1都将数据保存在SBUF中,并且使得R置1,产生中断。

由于需要用到第九位数据,所以常常作用在串口工作方式2或者3。

当工作在方式0 的时候,SM2必须位0。

当工作在方式1的时候,如果SM2=1的时候,只有收到有效的停止位的时候才会激活RI,请求中断。

REN:允许串口接收位

在开启串口接收中断的时候,REN一定要记得启用允许接收。

TB8:发送的第9位数据,也是人家接收到的第9位数据(常常用于主机)

在方式2,3中是要发送的第九位数据,可以用软件清零或者置1。

在双机串行通信的时候,一般用作奇偶校验位,也可以用来表示主机发送的是地址帧,还是数据帧,TB8=1是地址帧,TB8=0的时候是数据帧(这里用从机的角度去思考为什么1是地址,0是数据)。

RB8:接收到的第9位数据

在方式0中不用

在方式1的时候如果SM2=0的时候,RB8是接收到的停止位。

在方式2或者3的时候,是接收到的第九位。

TI:发送中断

什么时候置一?在方式1的时候,第八位数据发送完成就由硬件置1。方式2或者3的时候是在发送停止位的开始的时候置1。TI可以用来软件查询,也可以申请中断,在中断中向SBUF中写入要发送的下一帧数据,但是一定要记住是用软件清零的

(发送Buffer和接收Buffer好像都是SBUF)

RI:接收中断

什么时候置一?在方式0的时候接收到第八位数据时候,硬件置1。在其他方式的时候,是在收到停止位的时候,该位置置1。RI=1,表示一帧数据接收完毕,并且申请中断,要求CPU从接收SBUF取走数据。可以用来软件查询,也可以申请中断,但是一定要记住是用软件清零的

好像是软件把SBUF取走了以后用软件把标志位RI清空。所以有人用RI的标志位来判断SBUF是不是被清空了。

串口的四种工作模式:(由SCON的高两位SM0和SM1控制)

方式0           同步移位寄存器方式(用于接串转并模块拓展IO口)fosc/12 (机器周期)

方式1           8位异步收发,波特率由定时器控制

方式2           9位异步收发  波特率为fosc/64或者fosc/32

方式3           9位异步收发  波特率由定时器控制

波特率的计算:

方式0:    机器周期

方式1:   2的SMOD次方/32*T1溢出频率

方式2:   SOMD=0: fosc/64 或者SMOD=2: fosc/32 

方式3: 2的SMOD次方/32*T1溢出频率

记忆方法:

方式0 方式2 不受定时器控制 一个是固定的机器周期 (fosc/12) 一个是受2的SMOD次方进行控制,分母是64,32是和2约方了

方式1或者3 都受定时器控制,都是2的SMOD次方/32 *T1的溢出频率(一定记住是32!!) 

方式0:(同步8位)

数据是从RXD的引脚发出的 TX发出移位脉冲的    

数据是从RX进来的,TXD发出移位脉冲 要把允许接收打开

方式1:(异步8位)波特率由T1控制,32

TX发送 异步时钟:内部产生的TX时钟(和波特率一样), 等到8个数据位置全部发送完成以后产生中断 

RX接收 要把允许接收打开,异步时钟:内部产生的RX时钟(和波特率一样),或者位检测采样时钟(是RX时钟的16倍数)采三判二,7、8、9个脉冲的时候采样。

什么时候RXbuffer:SBUF才不会丢掉呢?

  1. RI=0的时候且SBUF已经被取空
  2. SM2=0或者SM2=1且接收到的停止位是1,则将数据装入到SUBF且将数据装到RB8,且中断标志位置1.

方式2: (异步9位)波特率就受到SMOD控制,0的时候是fosc/64, 1的时候fosc/32 

在发送前根据通信协议确定TB8的值。需要用软件对TB8进行处理,置0或者置1。(因为SBUF为8位数据位)将要写的整体写到SBUF中,串口能自动把TB8读出来,然后装入到第九位数据位,然后发送出去。

接收:要把允许打开,什么时候不会丢掉buffer呢?SBUF要空,SM2=0(所有人,10分钟),SM2=1但是第九位为1。然后才会把接收到的数据缓存在SBUF中然后把RB8置1.

在检测到停止位的时候才进行产生中断,

方式3 (异步9位)波特率由定时器决定,这时候和方式1是一样的,且这时候是2的SMOD次方/32*T1的溢出频率。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值