找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 2954|回復: 3
打印 上一主題 下一主題
收起左側(cè)

AD C語言 ,電壓順序 LED 不同變化問題,求大神指點

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:65643 發(fā)表于 2014-11-30 10:26 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
下面程序是別人寫的,我想在此基礎上實現(xiàn)的是,
如按此順序:  當電壓約 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 亮后,再電壓怎么變化也不動作了。 我把程序和仿真?zhèn)魃蟻�,大俠們幫看看,謝謝



#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 數(shù)據(jù)端口
#define SMG_DData P0  //數(shù)碼管段碼端口
#define SMG_WData P0  //數(shù)碼管位碼端口

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;//相當于給了一個低電平脈沖啟動轉(zhuǎn)換
        nop();nop();nop();nop();
        while(INT_0804 == 1);//等待轉(zhuǎn)換結(jié)束
        RD_0804 = 0;//讀數(shù)據(jù)
        INT_0804 = 1;
        DiaoYa = ADC_Data;//返回電壓寄存器中的值(注意,此時未轉(zhuǎn)換成具體電壓)
        RD_0804 = 1;
        return DiaoYa;//返回電壓寄存器中的值
}

void DYXS(uchar V_0804)
{
        double Voltage = (double)V_0804;
        uchar Ge    = 0;//用于存取個位數(shù)值
        uchar Xiao1 = 0;//用于存取小數(shù)點后第一位數(shù)值
        uchar Xiao2 = 0;//用于存取小數(shù)點后第二位數(shù)值
        uchar Xiao3 = 0;//用于存取小數(shù)點后第三位數(shù)值
    Voltage = (5*(Voltage/255))*1000;//電壓值已經(jīng)轉(zhuǎn)換并且*1000用于提取小數(shù)點后三位
       
        //提取每一位的數(shù)值
        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, 下載次數(shù): 2

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:65643 發(fā)表于 2014-11-30 10:29 | 只看該作者
下面程序是別人寫的,我想在此基礎上實現(xiàn)的是,
如按此順序:  當電壓約 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 亮后,再電壓怎么變化也不動作了。 我把程序和仿真?zhèn)魃蟻�,大俠們幫看看,謝謝

仿真 LX.zip

105.75 KB, 下載次數(shù): 2

回復

使用道具 舉報

板凳
ID:65643 發(fā)表于 2014-11-30 21:27 | 只看該作者
我按下面寫的,功能實現(xiàn)了,但數(shù)碼管不顯示了   ,還得請大俠們指點


#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 數(shù)據(jù)端口
#define SMG_DData P0  //數(shù)碼管段碼端口
#define SMG_WData P0  //數(shù)碼管位碼端口


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;//相當于給了一個低電平脈沖啟動轉(zhuǎn)換
        nop();nop();nop();nop();
        while(INT_0804 == 1);//等待轉(zhuǎn)換結(jié)束
        RD_0804 = 0;//讀數(shù)據(jù)
        INT_0804 = 1;
        DiaoYa = ADC_Data;//返回電壓寄存器中的值(注意,此時未轉(zhuǎn)換成具體電壓)
        RD_0804 = 1;
        return DiaoYa;//返回電壓寄存器中的值
}


void DYXS(uchar V_0804)
{
        double Voltage = (double)V_0804;
        uchar Ge    = 0;//用于存取個位數(shù)值
        uchar Xiao1 = 0;//用于存取小數(shù)點后第一位數(shù)值
        uchar Xiao2 = 0;//用于存取小數(shù)點后第二位數(shù)值
        uchar Xiao3 = 0;//用于存取小數(shù)點后第三位數(shù)值
    Voltage = (5*(Voltage/255))*1000;//電壓值已經(jīng)轉(zhuǎn)換并且*1000用于提取小數(shù)點后三位
       
        //提取每一位的數(shù)值
        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 發(fā)表于 2014-12-1 10:18 | 只看該作者
經(jīng)個高人指點,成功了
#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 數(shù)據(jù)端口
#define SMG_DData P0  //數(shù)碼管段碼端口
#define SMG_WData P0  //數(shù)碼管位碼端口

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;//相當于給了一個低電平脈沖啟動轉(zhuǎn)換
        nop();nop();nop();nop();
        while(INT_0804 == 1);//等待轉(zhuǎn)換結(jié)束
        RD_0804 = 0;//讀數(shù)據(jù)
        INT_0804 = 1;
        DiaoYa = ADC_Data;//返回電壓寄存器中的值(注意,此時未轉(zhuǎn)換成具體電壓)
        RD_0804 = 1;
        return DiaoYa;//返回電壓寄存器中的值
}

void DYXS(uchar V_0804)
{
        double Voltage = (double)V_0804;
        uchar Ge    = 0;//用于存取個位數(shù)值
        uchar Xiao1 = 0;//用于存取小數(shù)點后第一位數(shù)值
        uchar Xiao2 = 0;//用于存取小數(shù)點后第二位數(shù)值
        uchar Xiao3 = 0;//用于存取小數(shù)點后第三位數(shù)值
    Voltage = (5*(Voltage/255))*1000;//電壓值已經(jīng)轉(zhuǎn)換并且*1000用于提取小數(shù)點后三位
       
        //提取每一位的數(shù)值
        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();      
   
        }
    }
}

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表