用AT89C实现对功放的自动控制Word格式文档下载.docx
《用AT89C实现对功放的自动控制Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《用AT89C实现对功放的自动控制Word格式文档下载.docx(13页珍藏版)》请在冰点文库上搜索。
P3口的P3.0~P3.5、P3.7是内部上拉电阻的七个双向I/O引脚。
P3.6用于固定输入片内比较器的输出信号,并且它作为一通用的I/O引脚不可访问。
P3口缓冲器可吸收20mA电流。
当P3口引脚写入1时,它们被内部上拉电阻拉高并可用作输入端;
用作输入端时,被外部拉低的P3口引脚将用上拉电阻而流出电流。
P3口还用于实现AT89C2051的各种功能:
P3.0-RXD(串行输入端口);
P3.1-TXD(串行输出端口);
P3.2-INTO(外部中断0);
P3.3-INT1(外部中断1);
P3.4-T0(定时器0外部输入);
P3.5-T1(定时器1外部输入)。
P3口好接收一些用语闪速存储器编程和程序校验的控制信号。
RST是复位输入。
二、控制电路
因为设计目的比较简单,所以直接采用了上电复位和内部震荡。
因为AT89C2051功率低,引脚输出的电流(不足2mA)无法驱动发光二极管,因此用了个三极管。
(下图是其中1路信号源的电路)
三、电源
由于继电器部分用的是12V电压,所以,用力1块LM7805将其调整为5V。
四、程序
为了避免在信号切换时出现杂音,我们用P1.2口做静音信号(MUTE)输出端,高电平有效,这样画出的几路信号源的时序图如左图所示。
可以看出应该在信号源切换开始的时候首先静音,然后再执行其他的切换指令,然后在信号源切换状态结束后再取消静音,以避免出现杂音。
我们还可以用1个寄存器记录状态,使得程序每次中断产生后都可以明白现在是在使用哪一路信号源,应该切换到哪一路信号源。
流程如下:
五、编写代码
AT89C2051是ATMEL微控制器家族中一款经济、中低价位产品,内含2K字节的闪存程序存储器,完全和MCS-51结构兼容并可用MCS-51指令进行编程。
但是需要注意以下几个方面:
1、在使用跳转或分支相关的指令时,必须进行空间约束,确保目的地址落在AT89C2051的2K的物理存储器空间内。
例如:
对于2K的存储器来说,LJMP7E0是一有效指令,而LJMP900H则是无效的。
2、在使用和MOVX相关的指令、数据存储器时,因为AT89C2051包含128字节内部数据存储器,这样,AT89C2051中的堆栈深度局限于内部RAM的128字节范围内,他即不支持外部数据存储器的访问,也不支持外部程序存储器的执行,因此,程序中不应包括MOVX[…]指令。
3、一般的80C51汇编程序即使在违背上述限制写指令时仍对指令进行汇编,因此应了解正在使用的微控制器AT89C2051的物理功能和受限范围并相应地调整所用指令的寻址范围,以适合AT89C2051。
4、空闲方式下CPU保持睡眠状态,而所有片内的的外设保持激活状态,这种方式由软件产生。
片内的RAM和所有专用功能寄存器的内容在此方式期间保持不变。
空闲方式可由任何允许中断请求或硬件复位终止。
但是在使用硬件复位终止空闲方式时,AT98C2051通常从程序停止一直到内部复位算法获得控制之前的两个机器周期处恢复程序的执行。
在这种情况下片内的硬件禁止内部对RAM的访问,但允许对端口引脚的访问。
要消除硬件复位终止空载方式时,对端口引脚意外写入的,则进入空闲方式指令的下一条指令不应是写端口引脚或写外部存储器指令。
5、编程时,使用下列步骤:
上电次序:
先在VCC和GND引脚之间加上电源,再设置RST和XTAL1为GND,
所有其他引脚浮空,至少等待10ms。
设置RST引脚为高“H”,设置P3.2引脚为高“H”。
对引脚P3.3、P3.4、P3.5、P3.7加上逻辑电平高“H”或低“L”的正确组合来选择EEPROM编程方式。
(如下图)
在000单元对P1.0~P1.7加入数据代码字节。
升高RST到+12V来激活编程。
这里需要注意的一是内部EEPROM地址地址计数器的RST的上升沿复位到000H,并由XTAL1引脚正脉冲执行计数。
二是片擦除需要10ms的RPOG脉冲。
三是编程期间P3.1被拉低来指示RDY/BSY。
(校验波形如下图)
使P3.2跳变一次来编程EEPROM阵列中的一字节或者加密位。
写字节的周期是自身定时的,一般需用1.2ms。
校验已被编程的数据使RST从+12V降到逻辑电平“H”并设置P3.3~P3.7引脚到正确的电平,可在P1口引脚输出数据。
在下一地址单元编程字节,使XTAL1跳变一次提升内部地址计数器,对P1哭引脚加入新数据。
重复步骤5~8,对整个2K字节阵列改变数据并提升地址计数器或者一直到目标文件结束。
下电次序:
首先设置XTAL1为“L”,然后设置RST为“L”,接着浮空所有其他I/O引脚,最后关闭VCC电源。
需要注意的是加密位不能直接进行校验,加密位的校验可通过对存储器的校验和写入状态得到。
片擦除时,只要利用控制信号的正确组合并保持P3.2引脚10ms的低电平就可电擦除整个EEPROM阵列(2K字节)和两个加密位。
代码阵列在片擦除操作中写入全“1”,并必须要在任何非空存储器字节可被再编程之前执行。
6、编写的代码见附录。
六、仿真
使用南京ICES电子有限公司出品的ICES仿真系统仿真运行,各项均达到预计目标。
七、设计电路
根据前述,用Protel99设计电路如下图
整个电路分为2部分,左部分为本次设计的电路的控制部分,右部为功放部分。
用Protel99制作成电路板如下图所示:
八、制作中的问题
在实际制作中,出现了几个问题,因而做了几处改动:
1、按键中断电路。
试运行时出现了从开始就不停有中断产生情况,后检查发现是因为AT89C2051中断是由下降沿或低电平激发,因此将中断电路修改为下图所示:
2、发光二极管电路。
接通电路后发现发光二极管不亮或者亮光微弱,后测量发现芯片输出电压只有1.5V,根本不能算严格意义上的高电平,因此将限流保护电阻从1KΩ降低到200Ω,二极管工作正常。
3、按键防抖动问题。
常用的按键防抖动方法有两种,一是用三极管电路防抖动(如下图左面2种电路),二是用RS触发器防抖动(下图最右电路)。
试接了三
极管防抖动电路,发现效果并不理想,而用触发器的话电路又太复杂,于是采取了用软件消除抖动。
即当按键产生的第一个中断请求被响应时,中断程序的第一步就是关闭所有中断口,这样,加上后面的延迟(延迟时间的长短与人按键的长短有关,经过反复实验后,决定将其定在大约1秒的位置上,这样,即避免了前沿抖动,也避免了后沿抖动,且等待时间不长),使我们成功地屏蔽掉了因按键抖动而产生的其他中断请求,相对硬件防抖动简单实用且效果好。
4、当芯片已经烧录完成,所有目标均已实现时,又想将其改进一下:
当功放电源关闭时,音源选择应禁止。
也就是说,当P1.7为高时,允许INT0中断,当P1.7为低时,禁止INT0中断,流程如下:
附录:
程序源代码
ORG000H;
程序开始
LJMP0300H;
跳到地址300H
ORG0003H;
INT0有中断
LJMPCHANGE;
跳到CHANGE中断程序
ORG0013H;
INT1有中断
MOVIE,#00H;
关闭所有中断
DELAY:
MOVR2,#04H;
从本行开始向下共6行程序为一组
DELO:
MOVR3,#00FFH;
一起完成延时1秒的任务
DEL1:
MOVR4,#00FFH
DEL2:
DJNZR4,DEL2
DJNZR3,DEL1
DJNZR2,DEL0
CPLP1.7;
P1.7口取反,电源开/关一次
DJNZB,DD;
B值减“1”
MOVB,#02H;
若为“0”,则置为“2”
MOVIE,#85H;
打开INTO,INT1中断
RETI;
跳出
DD:
MOVIE,#84H;
若不为“0”,则打开INT1中断,禁止INT0
STARTEQU0100H;
START开始时地址为100H
ORGSTART+200H;
START地址加到300H
MOVA,#02H;
A寄存器初值为2
MOVB,#02H;
B寄存器初值为2
MOVP1,#00CBH;
初始化P1口
MOVIE,#85H;
打开全局中断,允许INT0,INT1中断
WAIT:
LJMPWAIT;
等待中断
CHANGE:
MOVIE,#00H;
SETBP1.2;
静音开始
DELAY1:
DEL3:
DEL4:
DEL5:
DJNZR4,DEL5
DJNZR3,DEL4
DJNZR2,DEL3
CLRP1.3;
关状态显示灯
JNZDC;
A值减“1”
MOVA#02H;
赋A值为“2”
CLRP1.4;
关MD
CLRP1.5;
关CD
STEBP1.6;
选中Radio
LJMPSILR;
跳到SILR子程序
DC:
DECA;
JNZNZ;
若不为“0”,则跳到NZ
CLRP1.5;
若为“0”,关CD
CLRP1.6;
关Radio
SETBP1.4;
选中MD
NZ:
SETBP1.5;
选中CD
SILR:
SETBP1.3;
打开状态显示灯
CLRP1.2;
关闭静音
MOVIE,#85H;
打开INT0,INT1中断
RETI;
END;
汇编结束