找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2368|回复: 0
收起左侧

新人求助 求大神大大指点一二 关于ad0809数字电压表

[复制链接]
ID:83129 发表于 2015-6-16 09:56 | 显示全部楼层 |阅读模式
代码如下:
#include"reg52.h"
#include"absacc.h"
#include"intrins.h"
#define COM8155 XBYTE [0xFF20]
#define PA XBYTE [0xFF21]
#define PB XBYTE [0xFF22]
#define PC XBYTE [0xFF23]
#define ADC XBYTE [0xFEF3]

unsigned char code  table[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};                  //数码管数字查找表       
         
sbit CLK=P2^5;                                  
sbit CS=P2^7;
sbit IOM=P2^0;
sbit EO=P3^4;       
sbit ADDA=P2^1;
sbit ADDB=P2^2;
sbit ADDC=P2^3;                                                    //定义P2^7为8155和AD0809的片选信号段
sbit wr=P3^2;
/*sbit RD=P3^1;*/
                                                                 
unsigned int ADCDat;
unsigned int vot=0;
unsigned int Data[4]={0,0,0,0};
unsigned int KEY;

void AD0809();
void delayms(unsigned int xms);
void Datacaculate();                                                    //一坨函数声明
unsigned char Keyscan();
void Display(unsigned int key);
void DisplayEstimate(unsigned int key);

void delayms(unsigned int xms)
{
        unsigned int i,j;
        for(i=0;i<xms;i++)
                for(j=0;j<110;j++);
}
void Datacaculate()                                              //用于计算数据
{       
        unsigned int j=0;       
        Data[0]=0;                                               //数据的存储初始化
        Data[1]=0;
        Data[2]=0;
        Data[3]=0;
        vot=0;
        AD0809();
        delayms(5);
        ADCDat=(unsigned int)ADCDat*1000/51;
        vot=(unsigned int)ADCDat;                           //对四次抽样值求平均

        Data[0]=vot/1000;                                        //存储最终数据        依次为显示的第一位,第二位,第三位,第四位
        Data[1]=vot%1000/100;
        Data[2]=vot%100/10;
        Data[3]=vot%10;
}

void AD0809()                                       //在PI口加灯验证 读出数据
{      
        ADC=0;                     //启动IN0通道
                CS=0;                                                           //片选信号
                RD=1;                                                           //初始化OE=0
                wr=1;                                                                 //初始化ST=0        清楚缓冲器中内容
                ADDA=0;ADDB=0;ADDC=0;                                                          
                delayms(5);                  
                wr=0;
                delayms(5);
                wr=1;
                while(!EO);
                RD=0;
                P1=0XFF;
                ADCDat=P1;
                delayms(50);
                wr=1;
                RD=1;
                delayms(1);
                CS=1;
}



unsigned char Keyscan()
{
        unsigned char temp,key=2;
        PA=0x7f;
        temp=PC;
        temp&=0x0f;
        if(temp!=0x0f)
        {
                delayms(10);
                temp=PC;
                temp&=0x0f;
                if(temp!=0x0f)
                    {
                           switch(temp)
                        {
                            case(0x07):  key=4;break;
                            case(0x0b):  key=3;break;
                            case(0x0d):  key=2;break;
                            case(0x0e):  key=1;break;
                            default : break;
                        }
                    }
        }
        while(temp!=0x0f)
        {
              temp=PC;
              temp&=0x0f;
        }
        return key;
}
void Display(unsigned int key)
{
      unsigned int j=0;
      unsigned char dmask=0xbf;
      COM8155=0x43;IOM=1;
      PB=0xff;
      KEY=1;
      for(j=0;j<4;j++)
       {
                for(;KEY<key;KEY++)
                        {
                                PA=dmask;
                                PB=0xc0;
                                dmask=_cror_(dmask,1);
                       }         
           }
       PA=dmask;
        if(!j)
        {
                        PB=~(table[Data[j]]||0x80);
                        delayms(50);
        }
         else
         {
                        PB=~table[Data[j]];
                        delayms(50);
         }
         dmask=_cror_(dmask,1);
}


void DisplayEstimate(unsigned int key)
{
        if(key==1)
        {
                if(!Data[0])                                                           //超量程判断  0~0.5v
                {
                        Display(key);
                        delayms(10);
                }
                else
                {
                        PA=0xbf;
                        PB=~table[1];
                        delayms(10);
                }
        }
        else if(key==2)
        {
                 if(Data[0]<5)                                                                 //超量程判断         0~5v
                 {
                         Display(key);
                        delayms(50);
                 }
                 else
                 {
                         PA=0xbf;
                        PB=~table[1];
                        delayms(50);
                 }
        }
}


void main()
{
        unsigned int Flag=2;                        //定义量程变量                                                       
        COM8155=0x43;                              //        8155工作方式
        CLK=0;

        EA=1;                                                            //开全局中断
        TMOD=0x01;
        TL0=(65536-24)%256;                                //T0装载                 
        TH0=(65536-24)/256;
                                                      
        ET0=1;                                         //开T0定时器
        TR0=1;                                       // Gate=0 此时 TR0=1  开启定时器0
       
       
        CS=0;                           
        while(1)
        {
                Datacaculate();
                Flag=Keyscan();
                DisplayEstimate(Flag);
                delayms(10);
        }
}

void T0_time() interrupt 1
{
        TL0=(65536-24)%256;
        TH0=(65536-24)/256;
        CLK=~CLK;
}
  在proteus仿真结果是:ad输出端一直是高电平 另一个仿真用定时器中断作为ad的CLK时 无信号输入 (一直是灰色的)



ad0809的输出一直为高

ad0809的输出一直为高
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表