找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2534|回复: 3
收起左侧

AD C语言 ,电压顺序 LED 不同变化问题,求大神指点

[复制链接]
ID:65643 发表于 2014-11-30 10:26 | 显示全部楼层 |阅读模式
下面程序是别人写的,我想在此基础上实现的是,
如按此顺序:  当电压约 1V 以下时, UP LED 亮;  电压约 4V以上时, DN LED 亮, UP LED 灭; 电压再回到约 1V 以下时,
                       UP LED / DN LED 灭, OK LED亮
如按此顺序:  当 电压约 3V以上时, DN LED 亮; 当电压约 1V 以下时, UP LED 亮, DN LED 灭;  电压约 4V以上时, DN LED 亮, UP LED 灭;
                       电压再回到约 1V 以下时, UP LED / DN LED 灭, OK LED亮
按以上我在程序上加了这个,
void motor()
{
        uchar a;
        a = TQADC();

        if (a <= 50)
        {
                Delay(10);
                if (a <= 50)
                {
                        dn = 1;
                        up = 0;
                        while (a < 200)
                                TQADC();
                        up = 1;
                        dn = 0;
                        while (a > 50)
                                TQADC();
                        dn = 1;
                        ok = 0;
                }
        }
}
目前 UP LED 亮后,再电压怎么变化也不动作了。 我把程序和仿真传上来,大侠们帮看看,谢谢



#include "reg52.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
#define nop() _nop_()

//引脚定义
sbit du = P2^6;
sbit we = P2^7;
sbit up = P2^0;
sbit dn = P2^1;
sbit ok = P2^2;
sbit ng = P2^3;
sbit CS_0804  = P3^5;
sbit WR_0804  = P3^6;
sbit INT_0804 = P3^0;
sbit RD_0804  = P3^7;

#define ADC_Data P1          //AD 数据端口
#define SMG_DData P0  //数码管段码端口
#define SMG_WData P0  //数码管位码端口

unsigned char code SMG_Dcode[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //段码表 共阴
unsigned char code SMG_Wcode[]={0xfe,0xfd,0xfb,0xf7};  //位码表        共阴

void Delay(uint x)        // 1ms @12Mhz
{
    uchar a,b,c;
    for(c=x;c>0;c--)
        for(b=142;b>0;b--)
            for(a=2;a>0;a--);
}

uchar TQADC()
{
        uchar DiaoYa = 0;
        WR_0804 = 1;//先使其为高电平
        CS_0804 = 0;//芯片选通使能
        WR_0804 = 0;
        WR_0804 = 1;//相当于给了一个低电平脉冲启动转换
        nop();nop();nop();nop();
        while(INT_0804 == 1);//等待转换结束
        RD_0804 = 0;//读数据
        INT_0804 = 1;
        DiaoYa = ADC_Data;//返回电压寄存器中的值(注意,此时未转换成具体电压)
        RD_0804 = 1;
        return DiaoYa;//返回电压寄存器中的值
}

void DYXS(uchar V_0804)
{
        double Voltage = (double)V_0804;
        uchar Ge    = 0;//用于存取个位数值
        uchar Xiao1 = 0;//用于存取小数点后第一位数值
        uchar Xiao2 = 0;//用于存取小数点后第二位数值
        uchar Xiao3 = 0;//用于存取小数点后第三位数值
    Voltage = (5*(Voltage/255))*1000;//电压值已经转换并且*1000用于提取小数点后三位
       
        //提取每一位的数值
        Ge    = ((uint)Voltage)/1000%10;
        Xiao1 = ((uint)Voltage)/100%10;
        Xiao2 = ((uint)Voltage)/10%10;
        Xiao3 = ((uint)Voltage)%10;

    //显示
        we=1;
        SMG_WData = 0xff;//消隐
        we=0;
        du=1;
        SMG_DData = SMG_Dcode[Ge] | 0x80;
        du=0;
        we=1;
        SMG_WData = SMG_Wcode[0];
        we=0;

        Delay(11);
        we=1;
        SMG_WData = 0xff;//消隐
        we=0;
        du=1;
        SMG_DData = SMG_Dcode[Xiao1];
        du=0;
        we=1;
        SMG_WData = SMG_Wcode[1];
        we=0;
        Delay(11);

        we=1;
        SMG_WData = 0xff;//消隐
        we=0;
        du=1;
        SMG_DData = SMG_Dcode[Xiao2];
        du=0;
        we=1;
        SMG_WData = SMG_Wcode[2];
        we=0;

        Delay(11);
        we=1;
        SMG_WData = 0xff;//消隐
        we=0;
        du=1;
        SMG_DData = SMG_Dcode[Xiao3];
        du=0;
        we=1;
        SMG_WData = SMG_Wcode[3];
        we=0;
        Delay(11);
        we=1;
        SMG_WData = 0xff;  
        we=0;
}

void motor()
{
        uchar a;
        a = TQADC();

        if (a <= 50)
        {
                Delay(10);
                if (a <= 50)
                {
                        dn = 1;
                        up = 0;
                        while (a < 200)
                                TQADC();
                        up = 1;
                        dn = 0;
                        while (a > 50)
                                TQADC();
                        dn = 1;
                        ok = 0;
                }
        }
}

void main()
{
        while(1)
        {
                DYXS(TQADC());
                motor();

        }

}


仿真 LX.zip

105.75 KB, 下载次数: 2

回复

使用道具 举报

ID:65643 发表于 2014-11-30 10:29 | 显示全部楼层
下面程序是别人写的,我想在此基础上实现的是,
如按此顺序:  当电压约 1V 以下时, UP LED 亮;  电压约 4V以上时, DN LED 亮, UP LED 灭; 电压再回到约 1V 以下时,UP LED / DN LED 灭, OK LED亮
如按此顺序:  当 电压约 3V以上时, DN LED 亮; 当电压约 1V 以下时, UP LED 亮, DN LED 灭;  电压约 4V以上时, DN LED 亮, UP LED 灭;   电压再回到约 1V 以下时, UP LED / DN LED 灭, OK LED亮
按以上我在程序上加了这个,
void motor()
{
        uchar a;
        a = TQADC();

        if (a <= 50)
        {
                Delay(10);
                if (a <= 50)
                {
                        dn = 1;
                        up = 0;
                        while (a < 200)
                                TQADC();
                        up = 1;
                        dn = 0;
                        while (a > 50)
                                TQADC();
                        dn = 1;
                        ok = 0;
                }
        }
}
目前 UP LED 亮后,再电压怎么变化也不动作了。 我把程序和仿真传上来,大侠们帮看看,谢谢

仿真 LX.zip

105.75 KB, 下载次数: 2

回复

使用道具 举报

ID:65643 发表于 2014-11-30 21:27 | 显示全部楼层
我按下面写的,功能实现了,但数码管不显示了   ,还得请大侠们指点


#include "reg52.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
#define nop() _nop_()


//引脚定义
sbit du = P2^6;
sbit we = P2^7;
sbit up = P2^0;
sbit dn = P2^1;
sbit ok = P2^2;
sbit ng = P2^3;
sbit CS_0804  = P3^5;
sbit WR_0804  = P3^6;
sbit INT_0804 = P3^0;
sbit RD_0804  = P3^7;


#define ADC_Data P1          //AD 数据端口
#define SMG_DData P0  //数码管段码端口
#define SMG_WData P0  //数码管位码端口


unsigned char code SMG_Dcode[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //段码表 共阴
unsigned char code SMG_Wcode[]={0xfe,0xfd,0xfb,0xf7};  //位码表        共阴


void Delay(uint x)        // 1ms @12Mhz
{
    uchar a,b,c;
    for(c=x;c>0;c--)
        for(b=142;b>0;b--)
            for(a=2;a>0;a--);
}


uchar TQADC()
{
        uchar DiaoYa = 0;
        WR_0804 = 1;//先使其为高电平
        CS_0804 = 0;//芯片选通使能
        WR_0804 = 0;
        WR_0804 = 1;//相当于给了一个低电平脉冲启动转换
        nop();nop();nop();nop();
        while(INT_0804 == 1);//等待转换结束
        RD_0804 = 0;//读数据
        INT_0804 = 1;
        DiaoYa = ADC_Data;//返回电压寄存器中的值(注意,此时未转换成具体电压)
        RD_0804 = 1;
        return DiaoYa;//返回电压寄存器中的值
}


void DYXS(uchar V_0804)
{
        double Voltage = (double)V_0804;
        uchar Ge    = 0;//用于存取个位数值
        uchar Xiao1 = 0;//用于存取小数点后第一位数值
        uchar Xiao2 = 0;//用于存取小数点后第二位数值
        uchar Xiao3 = 0;//用于存取小数点后第三位数值
    Voltage = (5*(Voltage/255))*1000;//电压值已经转换并且*1000用于提取小数点后三位
       
        //提取每一位的数值
        Ge    = ((uint)Voltage)/1000%10;
        Xiao1 = ((uint)Voltage)/100%10;
        Xiao2 = ((uint)Voltage)/10%10;
        Xiao3 = ((uint)Voltage)%10;


    //显示
        we=1;
        SMG_WData = 0xff;//消隐
        we=0;
        du=1;
        SMG_DData = SMG_Dcode[Ge] | 0x80;
        du=0;
        we=1;
        SMG_WData = SMG_Wcode[0];
        we=0;


        Delay(11);
        we=1;
        SMG_WData = 0xff;//消隐
        we=0;
        du=1;
        SMG_DData = SMG_Dcode[Xiao1];
        du=0;
        we=1;
        SMG_WData = SMG_Wcode[1];
        we=0;
        Delay(11);


        we=1;
        SMG_WData = 0xff;//消隐
        we=0;
        du=1;
        SMG_DData = SMG_Dcode[Xiao2];
        du=0;
        we=1;
        SMG_WData = SMG_Wcode[2];
        we=0;


        Delay(11);
        we=1;
        SMG_WData = 0xff;//消隐
        we=0;
        du=1;
        SMG_DData = SMG_Dcode[Xiao3];
        du=0;
        we=1;
        SMG_WData = SMG_Wcode[3];
        we=0;
        Delay(11);
        we=1;
        SMG_WData = 0xff;  
        we=0;
}


void motor()
{
        uchar a;
        a = TQADC();


        while(1)
        {
                if (a >= 200)
                {
                        up = 1;
                        dn = 0;
                }
                a = TQADC();
                if (a <= 50) break;
        }


        while(1)
        {
                if (a <= 50)
                {
                        dn = 1;
                        up = 0;
                }
                a = TQADC();
                if (a >= 200) break;
        }


        while(1)
        {
                if (a >= 200)
                {
                        up = 1;
                        dn = 0;
                }
                a = TQADC();
                if (a <= 50) break;
        }


        while(1)
        {
                if (a <= 50)
                {
                        up = dn = 1;
                        ok = 0;
                }
        }
}


void main()
{
        while(1)
        {
                DYXS(TQADC());
                motor();


        }


}


回复

使用道具 举报

ID:65643 发表于 2014-12-1 10:18 | 显示全部楼层
经个高人指点,成功了
#include "reg52.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
#define nop() _nop_()

//引脚定义
sbit du = P2^6;
sbit we = P2^7;
sbit up = P2^0;
sbit dn = P2^1;
sbit ok = P2^2;
sbit ng = P2^3;
sbit key = P3^4;
sbit CS_0804  = P3^5;
sbit WR_0804  = P3^6;
sbit INT_0804 = P3^0;
sbit RD_0804  = P3^7;

#define ADC_Data P1          //AD 数据端口
#define SMG_DData P0  //数码管段码端口
#define SMG_WData P0  //数码管位码端口

unsigned char code SMG_Dcode[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //段码表 共阴
unsigned char code SMG_Wcode[]={0xfe,0xfd,0xfb,0xf7};  //位码表        共阴

void Delay(uint x)        // 1ms @12Mhz
{
    uchar a,b,c;
    for(c=x;c>0;c--)
        for(b=142;b>0;b--)
            for(a=2;a>0;a--);
}

uchar TQADC()
{
        uchar DiaoYa = 0;
        WR_0804 = 1;//先使其为高电平
        CS_0804 = 0;//芯片选通使能
        WR_0804 = 0;
        WR_0804 = 1;//相当于给了一个低电平脉冲启动转换
        nop();nop();nop();nop();
        while(INT_0804 == 1);//等待转换结束
        RD_0804 = 0;//读数据
        INT_0804 = 1;
        DiaoYa = ADC_Data;//返回电压寄存器中的值(注意,此时未转换成具体电压)
        RD_0804 = 1;
        return DiaoYa;//返回电压寄存器中的值
}

void DYXS(uchar V_0804)
{
        double Voltage = (double)V_0804;
        uchar Ge    = 0;//用于存取个位数值
        uchar Xiao1 = 0;//用于存取小数点后第一位数值
        uchar Xiao2 = 0;//用于存取小数点后第二位数值
        uchar Xiao3 = 0;//用于存取小数点后第三位数值
    Voltage = (5*(Voltage/255))*1000;//电压值已经转换并且*1000用于提取小数点后三位
       
        //提取每一位的数值
        Ge    = ((uint)Voltage)/1000%10;
        Xiao1 = ((uint)Voltage)/100%10;
        Xiao2 = ((uint)Voltage)/10%10;
        Xiao3 = ((uint)Voltage)%10;

    //显示
        we=1;
        SMG_WData = 0xff;//消隐
        we=0;
        du=1;
        SMG_DData = SMG_Dcode[Ge] | 0x80;
        du=0;
        we=1;
        SMG_WData = SMG_Wcode[0];
        we=0;

        Delay(11);
        we=1;
        SMG_WData = 0xff;//消隐
        we=0;
        du=1;
        SMG_DData = SMG_Dcode[Xiao1];
        du=0;
        we=1;
        SMG_WData = SMG_Wcode[1];
        we=0;
        Delay(11);

        we=1;
        SMG_WData = 0xff;//消隐
        we=0;
        du=1;
        SMG_DData = SMG_Dcode[Xiao2];
        du=0;
        we=1;
        SMG_WData = SMG_Wcode[2];
        we=0;

        Delay(11);
        we=1;
        SMG_WData = 0xff;//消隐
        we=0;
        du=1;
        SMG_DData = SMG_Dcode[Xiao3];
        du=0;
        we=1;
        SMG_WData = SMG_Wcode[3];
        we=0;
        Delay(11);
        we=1;
        SMG_WData = 0xff;  
        we=0;
}

void motor()
{
        uchar a;
        a = TQADC();

        while(1)
        {
                if (a > 50)
                {
                        ok = 1;
                        up = 1;
                        dn = 0;
                }
                a = TQADC();
                DYXS(TQADC());
                if (a <= 50) break;
        }

        while(1)
        {
                if (a <= 50)
                {
                        ok = 1;
                        dn = 1;
                        up = 0;
                }
                a = TQADC();
                DYXS(TQADC());
                if (a >= 200) break;
        }

        while(1)
        {
                if (a >= 200)
                {
                        ok = 1;
                        up = 1;
                        dn = 0;
                }
                a = TQADC();
                DYXS(TQADC());
                if (a <= 50) break;
        }

        while(1)
        {
                if (a <= 50)
                {
                        up = dn = 1;
                        ok = 0;
                }
                DYXS(TQADC());
                if (key == 0) break;
        }
}

void main()
{
    while(1)
    {
        DYXS(TQADC());
        if(key == 0)
        {
                        motor();      
   
        }
    }
}

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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