打印

求助一个关于单片机和ad的程序

[复制链接]
1622|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
rocyking|  楼主 | 2012-6-3 09:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
rocyking|  楼主 | 2012-6-3 09:38 | 只看该作者
/*------------------------------------
程序名称:双路AD0832数据采集
功能:将双路AD0832采集信号通过数码管显示
日期:2011/11/26
修改:无
-------------------------------------*/
#include <reg51.h>
#include <intrins.h>
#include <AD0832.h>
#include <Serial.h>
#define uint unsigned int
#define uchar unsigned char
uchar code dula[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};  //共阳数码管段码,此处反相后用于共阴数码管
uchar code wela[]={0x80,0x40,0x20,0x10};          //4位数码管位码
extern uchar ADC_Num1,AD_Num2;
uchar ADC_Val1,ADC_Val2;

uchar UpLimit1,DownLimit1;
uchar UpLimit2,DownLimit2;
void InitTimer()
{
    TMOD=0x01;
        TH0=(65536-50000)/256; //定时器0重装初值
        TL0=(65536-50000)%256;
        ET0=1;
        TR0=1;
        EA=1;
}
/*---------------------------------
                定时器0中断函数
-----------------------------------*/
void Timer0() interrupt 1
{
        static uchar count1;
        TR0=0;
        TH0=(65536-50000)/256; //定时器0重装初值
        TL0=(65536-50000)%256;
        count1++;
        if(count1>=4)
        {
                count1=0;
                AdConvert(0);
                AdConvert(1);
        }
        TR0=1;
}  
/*------------------------------------
                延时函数
--------------------------------------*/
void delayms(xms)
{
        uint i,j;
        for(i=xms;i>0;i--)
        {
                for(j=110;j>0;j--);
        }
}
/*-------------------------------------
                数码管显示
--------------------------------------*/
void display(uchar num1,uchar num2)
{
        uchar w1,w2,w3,w4;
        w1=num1/10;     //取num1十位
        w2=num1%10;     //取num1个位      
        w3=num2/10;
        w4=num2%10;
       
        P2=0x00;
        P0=dula[w1]&0x7f;   //数码管显示小数点
        P2=wela[0];         //选择0位数码管
        delayms(2);
       
        P2=0x00;
        P0=dula[w2];
        P2=wela[1];
        delayms(2);       
       
        P2=0x00;
        P0=dula[w3]&0x7f;
        P2=wela[2];
        delayms(2);       
       
        P2=0x00;
        P0=dula[w4];
        P2=wela[3];       
}
/*-------------------------------------
                主函数
--------------------------------------*/
void main()
{
        ADC_Init();
        InitTimer();
        while(1)
        {
                ADC_Val1=(uchar)(ADC_Num1*5.0*10/255);   //2-10转换显示的电压值
                ADC_Val2=(uchar)(ADC_Num2*5.0*10/255);
                display(ADC_Val1,ADC_Val2);
                /*if((ADC_Num1>66||ADC_Num1<35)&&(ADC_Num2<87||ADC_Num2>117)) //检测异常报警
                {
                        display(0x01,0x01);   //异常显示11       
                }
                else
                {
                        display(ADC_Val1,ADC_Val2);        //正常的电压值
                }*/

        }       
}

使用特权

评论回复
板凳
rocyking|  楼主 | 2012-6-3 09:39 | 只看该作者
#define uint unsigned int
#define uchar unsigned char
uchar dat1,dat2;
uchar ADC_Num1=125;
uchar ADC_Num2=125;
/*-------------------------------------
ADC0832
-------------------------------------*/
sbit ADC_CS1=P1^1;
sbit ADC_CS2=P1^5;
sbit ADC_CLK1=P1^0;
sbit ADC_CLK2=P1^3;
sbit ADC_D1=P1^2;
sbit ADC_D2=P1^4;

/*-------------------------------------
                ADC0832初始化
-------------------------------------*/
void ADC_Init()
{
        ADC_CS1=0;
        ADC_CS2=0;       
}
/*-------------------------------------
                AD转换程序
-------------------------------------*/
void AdConvert(bit ChSelect)
{
        unsigned char i,j;
    //bit ChFlag;
        //在第1个时钟脉冲的下沉之前DI端必须是高电平,表示启始信号
         ADC_CLK1=0;      //初始化
         ADC_D1=1;
         _nop_();
         ADC_CS1=0;
         _nop_();
         ADC_CLK1=1;
         _nop_();
         //在第2、3个脉冲下沉之前DI端应输入2位数据用于选择通道功能
         ADC_CLK1=0;   
         ADC_D1=1;                  //通道0的第一位
         _nop_();
         ADC_CLK1=1;
         _nop_();
         ADC_CLK1=0;
         if(ChSelect==0)
         {
                 ADC_D1=0;            //通道0的第二位,选通CH0
         }
         else
         {
                 ADC_D1=1;
         }
         _nop_();
         ADC_CLK1=1;
         _nop_();
         ADC_CLK1=0;
         ADC_D1=1;

    for(i=0;i<8;i++)        //读取前8位值,先高位后低位
    {
                _nop_();
            dat1=dat1<<1;
            ADC_CLK1=1;
                   _nop_();
                _nop_();  
            ADC_CLK1=0;
            _nop_();
                _nop_();
                if(ADC_D1==1)   
                {
                        dat1|=0x01; //最低位幅值为1
                }
                else
                {
                        dat1|=0x00;   //否则幅值为0
                }
     }

    for(j=0;j<8;j++)
    {
                dat2=dat2>>1;
                if(ADC_D1)
                {
                        dat2|=0x80;
                }
                else
                {
                        dat2|=0x00;
                }
                  ADC_CLK1=1;
                   _nop_();
                _nop_();  
            ADC_CLK1=0;
                   _nop_();
                _nop_();  
     }
         if(dat1==dat2)
         {
                 if(ChSelect==0)
                {
                        ADC_Num1=dat2;                  //测试端
                }
                else
                {
                        ADC_Num2=dat2;
                }
         }
         _nop_();
     ADC_CS1=1;
         ADC_D1=1;
     ADC_CLK1=1;
}

使用特权

评论回复
地板
rocyking|  楼主 | 2012-6-3 09:39 | 只看该作者
自己顶贴

使用特权

评论回复
5
rocyking|  楼主 | 2012-6-3 09:51 | 只看该作者
顶啊顶

使用特权

评论回复
6
lyjian| | 2012-6-3 13:32 | 只看该作者
你要求助什么呀?

使用特权

评论回复
7
lirunze| | 2012-6-3 16:20 | 只看该作者
显摆呢吧

使用特权

评论回复
8
suse-lj| | 2012-6-4 09:42 | 只看该作者
楼主 可能是告诉我们,他的程序 很棒吧

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

8

帖子

0

粉丝