首页资源分类嵌入式处理器AVR > 基于51的控制的adc0809仿真

基于51的控制的adc0809仿真

已有 445023个资源

下载专区

上传者其他资源

    文档信息举报收藏

    标    签:单片机

    分    享:

    文档简介

    基于51的控制的adc0809仿真

    文档预览

    摘要 现今大多数的数据都是以电压形式进行采集,并数字化然后进行处理,如何进行多路的电压采集并数字化就显的有实际意义。 以8052单片机作为控制器,用8255进行并行口扩展,实现对ADC0809和LCD1602进行控制,从而实现多路电压的采集和显示。将8路开关组成选择电路,来选择用以采集和显示的通道。该设计能简单快速的实现8路电压的低精度的采集和显示。具有很好的操作性。 proteus作为一款优秀的数字仿真软件, 但可以传统的数字仿真,还可以数模混合仿真,从而能在验证好设计在进行系统搭建,减少开发时间。 关键词 51;单片机;8255;电压采集;ADC0809 ;LCD1602 绪论 随着信息技术的普及,越来越来越多的信号都是以数字的形式进行采集和处理。因为数字相对模拟信号具有很多优点。数字信号具有保密性好,抗干扰能力强的有点,同时由于数字信号处理技术的发展,数字信号的处理变得更加快速和高效。而由于现实世界由传感器采集到的数据多为模拟的电压信号,因此,模拟的数字化转换就很有意义。 51单片机作为最成功的8位单片机,具有指令丰富,速度快,价格低,片上资源丰富等特点,能轻易胜任一般的数据采集的控制器。ADC0809是一款具有8个模拟输入通到的8位逐次逼近型AD转换器,可以满足多路数据的低精度采集。LCD1602是16*2的字符型工业液晶。可以轻易满足显示要求的不高的场所。由于LCD1602加上ADC0809和8路开关,所需要的I/O明显多于51单片机所能提供的数量。所以采用了8255并行扩展芯片对I/O口扩展,以达到需要。 由于现今数字IC设计的复杂性,如果没在进行设计验证下时进行系统搭建,会在后期调试上的浪费时间。Proteus能对大部分数字电路或则数模混合电路进行仿真。从而减少后期调试的时间 硬件实现 该设计所需要的主要器件有8051单片机,8055并行扩展芯片,ADC0809,LCD1602,开关。设计总体如图。 左边第一个U1为8051,由于软件允许,省去了复位,时钟,电源电路。U1上方八个按键开关接地,构成低电平有效选择电路,并与U4—8输入与门构成中断电路,接外部中断0。当任意按键按下,产生一次中断。U2为8255,由于8255数据口为集电极开路,需要RP1排阻构成上拉电阻。LCD1602与ADC0809接到8255的IO。ADC的EOC反相后接8051的外部中断1。 软件实现 软件流程图如下。 主程序 外部中断0服务程序 外部中断1服务程序 中断采用边沿触罚方式、 仿真结果 对八个通道分别设置为0.5 , 1.0 , 1.5 , 2.0 , 2.5 , 3.0 , 3.5 , 4.0,信号设置如图 运行程序,系统上电复位,提示选择通道 选择通道7 选择通道6 选择通道5 选择通道4 选择通道3 选择通道2 选择通道1 选择通道0 结论 该设计成功实现了8路电压的采集和显示 附录 C语言源程序 //---------------------------- #include #include #include #include //---------------------------- #define PortA XBYTE [0x8000] #define PortB XBYTE [0xa000] #define PortC XBYTE [0xc000] #define Contral XBYTE [0xd000] //---------------------------- #define RS 0x01 #define RW 0x02 #define EN 0x04 #define ALE 0x10 #define OE 0x08 typedef unsigned char uchar; typedef unsigned int uint; //---------------------------- void Initial8052(); void WriteCommand_LCD(uchar command); void WriteData_LCD(uchar dat); void InitialLCD(); void DisplayChar_LCD(uchar x,uchar y,uchar chara) reentrant; void Delay(uint cnt); void DisplayString_LCD(uchar row,uchar *p) reentrant; void InitialInt(); void StratADC(); void SetCh(uchar ch); //------------------------------ void main() { P1=0xff; Initial8052(); InitialLCD(); InitialInt(); DisplayString_LCD(1,"Please select Ch"); EA=1; while(1); } void Initial8052() { Contral=0x82; //port a is output,port b is input,port c is output } //----------------------------------------------------------------- //LCD //----------------------------------------------------------------- void WriteCommand_LCD(uchar command) { PortC=PortC | EN; PortC=PortC & ~RW; PortC=PortC & ~RS; PortA=command ; PortC=PortC & ~EN; Delay(50); } void WriteData_LCD(uchar dat) { PortC=PortC | EN; PortC=PortC & ~RW; PortC=PortC | RS; PortA=dat; PortC=PortC & ~EN; Delay(50); } void InitialLCD() { WriteCommand_LCD(0x38); WriteCommand_LCD(0x0c); WriteCommand_LCD(0x06); WriteCommand_LCD(0x01); } void DisplayChar_LCD(uchar x,uchar y,uchar chara) reentrant { uchar address; if (y==1) address=0x80+x; if (y==2) address=0xc0+x; //DDRAMµØÖ·ÐÞÕý WriteCommand_LCD(address); //дµØÖ· WriteData_LCD(chara); } void DisplayString_LCD(uchar row,uchar *p) reentrant//×Ö·û´®ÏÔʾ³ÌÐò£¬rowΪÐÐÑ¡Ôñ£¬pΪ×Ö·ûÖ¸Õë { data uchar str[16]; data uchar i=0; strcpy(str,p); //str¸´ÖÆ if (row==1) { for(i=0;str[i]!='\0';i++) //ÏÔʾµÚÒ»ÐÐ DisplayChar_LCD(i,1,str[i]); //ÑÓʱµÈ´ýдÍê³É } if (row==2) { for(i=0;str[i]!='\0';i++) //ÏÔʾµÚ¶þÐÐ DisplayChar_LCD(i,2,str[i]); } } void Delay(uint n) { uint i; uchar j; for(i=n;i>0;i--) for(j=0;j<10;j++); } //------------------------------------------------------------------------- void StartADC() { PortC=PortC | ALE; //ale,start=1; PortC=PortC & ~ALE; //ale,start=0; } void SetCh(uchar ch) { ch<<=5; PortC=(PortC & 0x1f) | ch; } //-------------------------------------------------------------------------- //Interrupt //-------------------------------------------------------------------------- void InitialInt() { IT0=0; EX0=1; IT1=1; EX1=1; PX1=1; PX0=0; } void ISR_IT0() interrupt 0 { float voltage; data uchar str[16]; EA=0; PortC=PortC | OE; //enable output of adc voltage=PortB*0.0196; sprintf(str,"%f V",voltage); DisplayString_LCD(2,str); PortC=PortC & ~OE; //OE=0 StartADC(); EA=1; } void ISR_IT1() interrupt 2 { EA=0; switch (P1) { case 0x7f:DisplayString_LCD(1,"Voltage of ch.7 ");SetCh(7);break; case 0xbf:DisplayString_LCD(1,"Voltage of ch.6 ");SetCh(6);break; case 0xdf:DisplayString_LCD(1,"Voltage of ch.5 ");SetCh(5);break; case 0xef:DisplayString_LCD(1,"Voltage of ch.4 ");SetCh(4);break; case 0xf7:DisplayString_LCD(1,"Voltage of ch.3 ");SetCh(3);break; case 0xfb:DisplayString_LCD(1,"Voltage of ch.2 ");SetCh(2);break; case 0xfd:DisplayString_LCD(1,"Voltage of ch.1 ");SetCh(1);break; case 0xfe:DisplayString_LCD(1,"Voltage of ch.0 ");SetCh(0);break; default : ;break; } EA=1;

    Top_arrow
    回到顶部
    EEWORLD下载中心所有资源均来自网友分享,如有侵权,请发送举报邮件到客服邮箱bbs_service@eeworld.com.cn 或通过站内短信息或QQ:273568022联系管理员 高员外,我们会尽快处理。