新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 基于单片机的模拟开关时序设计与仿真

基于单片机的模拟开关时序设计与仿真

作者:时间:2013-02-16来源:网络收藏

对开关S1与S2的电荷注入效应。由图3可知S2关断时间晚于S3,S1关断时间晚于S2。S2断开时的电荷注入效应引起V1点较小的波形失真,关闭S1,尽管有S2的电荷注入效应,但V1被置为输入电压Vin,因此,被测电容Cx上的电压不受S2的电荷注入效应影响;S1断开时的注入电荷,会沿着已闭合的开关S2流向地,S1不会对被测电容Cx产生影响。所以,S1和S2对输出基本不产生影响。
 对开关S4与S5的电荷注入效应。S4与S5在断开时,产生的电荷注入效应会使A2和A3的输出波形有微小失真,但相对于输出值较小,可以忽略,而且A4采用差动式结构输入会使S4与S5的电荷注入效应相互抵消,故S4与S5的电荷注入效应不会对最终的输出Vo产生影响。
由以上分析可知,通过合理设计模拟开关控制时序,解决了其关断时引入的电荷注入效应。
3 实现开关时序的相关软件
3.1 Keil C51简介
 Keil是德国Keil公司开发的编译器。Keil C51是目前最流行的51开发工具,现在Keil公司的编译器有支持经典80C51和80C51派生产品的版本。新版本mu;Vision2把μVision1用的模拟调试器dScope与集成开发环境无缝地结合起来,界面更友好,使用更方便,支持的品质更多。对于使用C语言进行单片机开发的用户,Keil C51已成为必备的开发工具。
Keil C51软件是众多单片机应用开发的优秀软件之一,Keil C51提供了一个集成开发环境IDE(Intergrated Development Environment)?滋Vision,包括C51编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器,支持汇编、PLM语言和C语言的程序设计,界面友好,易学易用。在开发应用软件的过程中,编辑、编译、汇编、连接、调试等各阶段都集成在一个环境中,先用编辑器编写程序,再调用编译器进行编译,连接后即可直接运行[5,6]。
本软件采用Keil C51进行开发,程序可读性强。
3.2 Proteus简介
Proteus嵌入式系统仿真与开发平台是由英国Labcenter Electronics公司开发的,是目前世界上最先进、最完整的嵌入式系统设计与仿真平台,是目前唯一能够对各种微处理器进行实时仿真、调试与测试的EDA工具。Proteus除了具有和其他EDA工具一样的原理布图、PCB自动或人工布线及电路仿真的功能外,最大的特点在于其电路仿真是互动的,针对微处理器的应用还可以直接在基于原理图的虚拟原型上编程,真正实现了没有硬件目标原形的情况下对系统的调试、测试、验证,并实现软件源码级的实时调试,如有显示及输出,还能看到运行后输入输出的效果,配合系统配置的虚拟仪器如示波器、逻辑分析仪等,建立了一个完备的电子设计开发环境。Proteus产品系列可以对基于微控制器的设计连同所有的外围电子器件仪器仿真,用户甚至可以实时采用诸如LED/LCD、键盘、RS232终端等动态外设模型来对设计进行交互仿真。
Proteus是一款电路分析与实物仿真软件,运行于Windows操作系统上,具有实验资源丰富、实验周期短、硬件投入少、实验过程损耗小、与实际设计接近程度大等特点[7-9]。
4 开关时序的设计与仿真
开关时序设计原理图如图4所示,图中采用80C51芯片,其中管脚XTAL1、XTAL2接时钟控制器,RST端上电,5个输出管脚P1.0~P1.4分别控制开关S1、S2、S3、S4和S5,电源VCC为+5 V的直流电源。

4.1 程序设计
在Keil平台进行如图5所示的程序编译。
程序代码如下:
#includelt;reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit s1=P1^0; //控制开关1
sbit s2=P1^1; //控制开关2
sbit s3=P1^2; //控制开关3
sbit s4=P1^3; //控制开关4
sbit s5=P1^4; //控制开关5
bit flag,flag1,flag2,flag3;
uchar ds,ds1,ds2,ds3;
uint jishi;
void Initialization() //初始化函数
{
EA=1;
ET0=1;
TMOD=0X02; //定时器工作方式为2
TH0=0x06; //定时250 ?滋s
TL0=0x06;
TR0=1;
s1=0;
s2=1;
s3=1;
s4=1;
s5=1;
flag1=1;flag2=0;flag3=0;
}
void inte() interrupt 1 using 3 //1s中断处理函数
{
  if(++jishi==40) //时间间隔4000×250 ?滋s=1 s
{
jishi=0;
if(flag1){ds1++;}
if(flag2){ds2++;}
if(flag3){ds3++;}
}
}
void main ()
{
Initialization();
while(1)
{
   if(flag1)
{
if(ds1==4){s3=0;}
if(ds1==11){s5=0;}
if(ds1==12){s2=0;}
if(ds1==13){s1=1;}
if(ds1==20){s4=0;flag1=0;flag2=1;}
}
  if(flag2)
{
if(ds2==1){s3=1;}
if(ds2==2){s5=1;}
if(ds2==9){s2=1;}
if(ds2==10){s1=0;}
if(ds2==17){s4=1;flag2=0;flag3=1;ds2=0;}
}
   if(flag3)
{
if(ds3==7){s3=0;}
if(ds3==14){s5=0;}
if(ds3==15){s2=0;}
if(ds3==16){s1=1;}
if(ds3==23){s4=0;flag2=1;flag3=0;ds3=0;}
}
}
  }



评论


相关推荐

技术专区

关闭