控制/MCU
单片机被广泛应用于工业控制,家电,消费电子,医疗电子,仪表测量等领域,为应广大初级电子工程师/单片机爱好者之需,电子发烧友隆重策划整合推出《单片机关键技术基础详解》系列技术文章,以后会陆续推出其他章节,敬请广大工程师朋友继续关注和留意。
一、关于C51单片机的中断号以及中断向量
1、中断号
2、interrupt 和 using 在C51中断中的使用
8051 系列 MCU 的基本结构包括:32 个 I/O 口(4 组8 bit 端口);两个16 位定时计数器;全双工串行通信;6 个中断源(2 个外部中断、2 个定时/计数器中断、1 个串口输入/输出中断),两级中断优先级;128 字节内置RAM;独立的 64K 字节可寻址数据和代码区。中断发生后,MCU 转到 5 个中断入口处之一,然后执行相应的中断服务处理程序。中断程序的入口地址被编译器放在中断向量中,中断向量位于程序代码段的最低地址处,注意这里的串口输入/输出中断共用一个中断向量。8051的中断向量表如下:
二、CPU与单片机的复位电路的作用及基本复位方式
在上电或复位过程中,控制CPU的复位状态:这段时间内让CPU保持复位状态,而不是一上电或刚复位完毕就工作,防止CPU发出错误的指令、执行错误操作,也可以提高电磁兼容性能。
无论用户使用哪种类型的单片机,总要涉及到单片机复位电路的设计。而单片机复位电路设计的好坏,直接影响到整个系统工作的可靠性。许多用户在设计完单片机系统,并在实验室调试成功后,在现场却出现了“死机”、“程序走飞”等现象,这主要是单片机的复位电路设计不可靠引起的。
基本的复位方式
单片机在启动时都需要复位,以使CPU及系统各部件处于确定的初始状态,并从初态开始工作。89系列单片机的复位信号是从RST引脚输入到芯片内的施密特触发器中的。当系统处于正常工作状态时,且振荡器稳定后,如果RST引脚上有一个高电平并维持2个机器周期(24个振荡周期)以上,则CPU就可以响应并将系统复位。单片机系统的复位方式有:手动按钮复位和上电复位。
1、手动按钮复位
手动按钮复位需要人为在复位输入端RST上加入高电平(图1)。一般采用的办法是在RST端和正电源Vcc之间接一个按钮。当人为按下按钮时,则Vcc的+5V电平就会直接加到RST端。手动按钮复位的电路如所示。由于人的动作再快也会使按钮保持接通达数十毫秒,所以,完全能够满足复位的时间要求。
图1
2、上电复位
AT89C51的上电复位电路如图2所示,只要在RST复位输入引脚上接一电容至Vcc端,下接一个电阻到地即可。对于CMOS型单片机,由于在RST端内部有一个下拉电阻,故可将外部电阻去掉,而将外接电容减至1?F。上电复位的工作过程是在加电时,复位电路通过电 容加给RST端一个短暂的高电平信号,此高电平信号随着Vcc对电容的充电过程而逐渐回落,即RST端的高电平持续时间取决于电容的充电时间。为了保证系统能够可靠地复位,RST端的高电平信号必须维持足够长的时间。上电时,Vcc的上升时间约为10ms,而振荡器的起振时间取决于振荡频率,如晶振频率为10MHz,起振时间为1ms;晶振频率为1MHz,起振时间则为10ms。在图2的复位电路中,当Vcc掉电时,必然会使RST端电压迅速下降到0V以下,但是,由于内部电路的限制作用,这个负电压将不会对器件产生损害。另外,在复位期间,端口引脚处于随机状态,复位后,系统将端口置为全“l”态。如果系统在上电时得不到有效的复位,则程序计数器PC将得不到一个合适的初值,因此,CPU可能会从一个未被定义的位置开始执行程序。
图2
3、积分型上电复位
常用的上电或开关复位电路如图3所示。上电后,由于电容C3的充电和反相门的作用,使RST持续一段时间的高电平。当单片机已在运行当中时,按下复位键K后松开,也能使RST为一段时间的高电平,从而实现上电或开关复位的操作。
根据实际操作的经验,下面给出这种复位电路的电容、电阻参考值。
图3中:C:=1uF,Rl=lk,R2=10k
图3 积分型上电复位电路
三、单片机双机并行通信中所遇问题
1 引言
本系统采用的CPLD为 ATMEL公司生产的ATF1540AS器件,该器件是一种高性能、高密度复合可编程逻辑器件,简称CPLD,它利用ATMEL 的电可擦除存储器技术,有 64个逻辑宏单元和68个I/O端口,很容易和多个TTL、SSI、MSI、LSI和经典的PLDS组合使用。每个宏单元包括积项和积项多路选择器、 OR/XOR/CASCADE逻辑、触发器、输出选择和使能、输入逻辑阵列五个部分。ATF1504AS的增强选路开关增加了可用的门计数,提高了管脚锁存设计修改的成功率。
图1 双机通信框图
2 系统结构
系统的CPU采用W77E58,由ATF1504AS构成通信接口,系统框图如图1所示。
2.1 问题提出
电脑刺绣机为达到良好的人机界面交互功能,采用上下位机方式,下位机主要进行绣花动作的控制,上位机主要进行花样的跟踪。为了实现绣花的同时在液晶屏上进行绣花跟踪,单CPU方式存在系统资源透支, CPU处理数据将十分困难,于是提出了采用双CPU的工作方式,但同时带来一个问题—双CPU的通信问题。
2.2 解决方案
(1) 采用串行通信方式
优点:在由单片机组成的多机方式中,串行接口方式是最常用的。串行通信方式接口电路简单,可以方便实现长距离传输。抗干扰能力比较好。
缺点:传输数据慢,不适合实时数据传输。在数据传输要求高的情况下,容易造成瓶颈堵塞现象。
(2) 采用并行通信方式
优点:并行通信传输数据快,适合进行实时控制。
缺点:抗干扰能力差,不适合长距离传输,最大距离不超过5m。
由于本系统对数据传输的实时性要求比较高,并且上下位机之间的距离不超过3m,进行适当的抗干扰措施,完全可以达到系统的要求,所以确定采用并行通信方式。
2.3 具体措施
(1) 采用ATF1504AS(可编程逻辑器件)进行并行通信,减少分立器件所产生的杂散电容而带来的噪声干扰。
(2) 在输入数据端加斯密特电路(74LS14),将外部传输线上耦合噪声滤除掉。从而提高总线接收的抗干扰性能。
(3) 采用三态门驱动方式可以提高总线的抗干扰能力,因为三态门有三种状态输出,既所谓的低阻高电平、低阻低电平、高阻态(禁态)。由于三态门的输入具有的三态性,所以使三态门的信号源的负担减轻。有利于提高速度和抗干扰能力。
3 双CPU通信原理设计
3.1 双CPU通信原理图
从图2双CPU通信原理图中可以看出,在输入接口上都接上74LS14斯密特电路和74LS244三态门驱动器,以提高抗干扰能力。在SRZB、SCYX(上位机)及SRZB、SCYX(下位机)的握手信号线上接入74LS14斯密特电路,以提高抗干扰能力。
图2 双机通信原理图
3.2 ATF1504AS内部原理图
由于篇幅有限,仅列出上位机的ATF1504AS的内部原理图如图3,下位机的ATF1504AS的内部原理图与此相类似。
图3 ATF1504AS内部原理图
4 系统工作原理
4.1 上位机输入数据
如图3所示。在输入数据以前,通过对U1(74173)给U2(D触发器)进行初始化,即对U2的CLRN端输入一上升沿的脉冲,使U2清零。此时上位机 SRYX端为低电平,ZDQQ端为高电平。此时为接收数据做好准备。当下位机接收到上位机的SRYX端输出的低电平时,就可以发送数据到锁存器中,紧接着给上位机的SRZB端输出一个上升沿脉冲,U2的Q端(SRYX端)输出正脉冲,ZDQQ端经过反相器输出负脉冲。上位机在检测到ZDQQ端为低电平时,将数据线上的数据取出。紧接着通过对UI给U2进行进行初始化,完成对一个字节的读取,并为读取下一个字节做好准备。上位机输入数据信号波形图如图5所示。
图4 上位机输出数据时信号波形图
图5 上位机输入数据时信号波形图
4.2 上位机输出数据
如图3所示在输出数据以前,通过对U1 (74173)给U3(D触发器)进行初始化,即对U3的PRN端输入一上升沿的脉冲,使U3输出置1。此时上位机的SCZB端经反相器输出低电平,U3 的Q端为高电平。此时为发送数据做好准备。当上位机的SCYX端接收输入的上升沿脉冲时,U3的Q端为低电平,当CPU检测到Q端为低电平时,就可以发送数据到锁存器中,紧接着通过上位机的SCZB端向下位机SRZB端输出一个上升沿脉冲。表示已发送数据,接着通过对U1给U2进行进行初始化。完成对一个字节的输出,并为输出下一个字节做好准备,上位机输出数据信号波形图如图4所示。
5 软件设计
5.1 程序流程设计
图6示出输入数据流程图,图7示出输出数据流程图。
图6 输入数据流程
图7 数据输出程序流程图
5.2 部分程序清单
(1) 输入数据程序清单
ORG 0000H
JMP START
ORG 0003H
JMP RESEVE
START: MOV TCON,#0 ;设置中断INT0
MOV TMOD,#11H
CALL SZSRDK ;设置输入端口
MOV IE,#81H
MOV IP,#1 ;开中断
。.
。.
。.
RESEVE: CLR EA ;开中断
PUSH PSW
PUSH DPH
PUSH DPL
RESEV1: JB ZDQQ,RESEV1
;判ZDQQ是否为低
MOV DPTR,#ADDR0
;为U5(输入数据端口)的地址
MOVX A, @DPTR
。.
。.
CALL SZSRDK
POP DPL
POP DPH
POP PSW
SETB EA
RETI
SZSRDK: CLRN EQU 2CH.0
CLR CLRN ;
MOV DPTR,#ADDR1
;为U1的地址
MOV A,2CH
MOVX @DPTR,A
SETB CLRN
MOV A,2CH
MOV DPTR,#ADDR1
MOVX @DPTR,A
RET
(2) 输出数据程序清单
SEND: MOV DPTR,#ADDR3
MOVX A,@DPTR
JB ACC.0,SEND
;为U3的Q端输出
MOV DPTR,#ADDR4
;为U4(输出端口)的地址
MOVX @DPTR,A
CALL SZSCDK
RET
SZSCDK: PRN EQU 2CH.1
SETB PRN
MOV DPTR,#ADDR1
;为U1的地址
MOV A,2CH
MOVX @DPTR,A
CLR PRN
MOV DPTR,#ADDR1
MOV A,2CH
MOVX @DPTR,A
RET
6 结束语
设计中采用了AT1504AS器件,该器件实现了硬件设计软件化,方便了硬件设计,缩短了设计周期,降低了设计成本,应用也十分方便,该系统经过采取以上措施后,以达到最初的设计要求。现产品已投放市场,市场的反映良好。
四、PIC单片机软件开发技巧
项目是有关机器人控制的实现。控制部分采用PIC16F7X系列单片机,运用汇编语言编程,运行速度较快,能够达到系统的要求。
在这里使用的大多是数字信号的控制,电机的控制只有开和合两种状态。在动作的过程中需要两只手臂、身体、头部、脚部等的协调动作。整个控制系统比较复杂,因而在PIC程序编写和空间分配方面需要注意一些问题。
1 动作标志位的使用
在整个控制中,组合的动作很多,当所有动作定位都通过光电开关控制时,在程序编写上就有一些问题。如要求左手上升到鼓掌位、右手上升到举手位(手初始位置在最下的放下位),光电开关0有效(即为0时是挡住),到达正确位置。用简单的理解可以写成下面的程序:
list P=16c73
call lefthandup
call righthandup
LO call readinsignal
bdss csl_v,1efthandligbts
call lefthandstop
btfsc csl_v,righthandlight4
goto L0
call righthandstop
L1 call readinsignal
btfsc csl_v,lefthandlight3
goto L1
call lefthandstop
:
lefthandlight表示光电开关,由此判断是否到相应的位置。1表示在手臂最下面的位置;2表示在手臂的握手位置;3表示在手臂的鼓掌位置;4表示在手臂的高举手位置。上面程序描写左手臂上升到举手位置和右手臂上升到鼓掌位置并停止的过程。先判断左手到达否,到达则左手停止,接着看右手是否到达举手位,到达则停止,否则循环上述的检测,直到左手到达鼓掌位,右手到达举手位。
注意,这里的3,4表示的就是鼓掌位,举手位。经过循环检测可以让手臂停在各位上,然而机械动作是有惯性的,机械停止位可能在该位的上一点或下一点,这就影响下面动作的进行,可能在若干动作后机械动作出现失常,也就是程序没法正常的运行。在此情况下,需要修改程序的编写方式,采用标志位来控制动作的进行。如果采用控制标志位,一定要在动作子函数中对标志位置零。程序如下:
list p=16c73
:
actlonstopflag equ Ox6e ;位定义
lefthandfla8 cqu 0x0 ;0表示停止左手动作
rightbandflag equ Oxl ;O表示停止右手动作
:
movlw Ox03
movWf actionstopflag
call lefthanduo
call righthandup
L2 call readinsignal
btfss csl_v,lefthandhght3
call lefthatldotop
btfss csl_v,righthandlight4
call righthandstop
movlw Ox00
subwf actionstopflag,w
btfss status,z
goto L2
继续下面的程序
actionstopflag表示动作标志位参数,给动作标志位赋值,动作停止函数中将清零标志位的值。上述程序和前面所述程序的功能一样,实现两支手臂的动作。上面程序描写左手是否到达鼓掌位,到达停止,右手是否到达举手位,到达停止。看动作标志位是否为零,不是,不断地循环检测;是,执行下面的程序。
2 GOTO,cALL指令的不同使用
在PIC的汇编程序中,CALL与GOT0指冷使用的场合不同。一般情况下,在于程序与主程序之间大多用CALL指令;而状态转换模块之间大多用GOTO指令,即由此状态进入另一种状态不需返回。由于PIC单片机的堆栈有限,在程序中,不能无止境地使用GOTO语句,这样会使堆栈溢出,程序无法正常运行。各个小程序内部循环占用堆栈的级数不多,使用GOTO指令是可行的,但在大的程序中用GOTO则无法返回到调用前程序的下一条指令。CALL指令完成调用完子程序后返回到调用前的程序。程序如下:
list D=16c76
start:ca11 setcpu
call automatlsn、statel
L3 call readinsignal
btfsc cs2_v,ultrasonicdetectl
goto L3
goto autonatlsmstate2
:
automatlsmstate2:
return
auatomatismstatel、automatismstate2表示两种状态,uhrasonicdetectl表示一个输入超声检测信号。上面程序描写调用automatistmstate1状态,执行完后进行下面的检测ultrasonicdetect],没有触发就一直循环检测,触发就进入autornatismstate2状态,执行完也不再回到下面的程序。
3 状态标志位Z、C的不同使用情况
在进行判断标志位时,Z(零标志)、C(借位标志)是不同的。Z为l时,表示上面的结果为0,Z为0时,则结果不为0。C为l时,借位,C为0时,没有借位。在使用定时器的时候,一般使用C标志位,这是由于当完成某一动作去检查定时器时,时间可能没到,或是正好,或是已经超过时间,只要到了或超过时间,都要按照要求关闭定时器,如下面程序所述。如果用Z标志位,等于0时可能没有检测到,无法判断停止的状态,而用z可以很好地控制时间定时。进行一般的计算时大多用Z,如前面的动作标志位中就是如此使用的。
list D=16c76
call opentimerO
L4 movlw d’30’
subwf t0_v2,W
btfss status,c
goto L4
cau closetimer0
程序检测时间是否到达1.5s,没有则循环等待,到了或检测时间过了就关闭定时器,执行下面的程序。
总之,在PIC单片机的编程中采用合适的方法,可以使整个程序运行稳定,而且程序空间的使用也将有所减小,避免了调试中的Bug。这是笔者在实际中的一点体会,还有许多不足或没有考虑到的问题,希望在和大家的探讨中不断学习PIC单片机的精髓。
全部0条评论
快来发表一下你的评论吧 !