欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3267|回復: 8
收起左側

請教:單片機數碼管位選問題和3秒后執行判斷的問題

  [復制鏈接]
ID:487930 發表于 2019-3-14 09:59 | 顯示全部樓層 |閱讀模式
我做一個根據液體壓力值進行電機相應的實驗。
當壓力小于8MPa時電機啟動,啟動3秒后壓力沒有上升就報警。
當壓力大于12MPa時電機停止。
暫時用一個指示燈來模擬電機。用可調電阻模擬壓力輸入。
程序如下:

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int

uchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
sbit CLK=P1^3;
sbit ST=P1^2;
sbit EOC=P1^1;
sbit OE=P1^0;
sbit LED=P1^7;    //指示燈

sbit L1=P2^0;
sbit L2=P2^1;
sbit L3=P2^2;
sbit L4=P2^3;

sbit LED2=P2^7;

void DelayMS(uint ms)
{
        uchar i;
        while(ms--)
                for(i=0;i<120;i++);
}
/******************顯示采集的電壓**********************************/
void Display_Result(uint d)
{
        L1=0;L2=1;L3=1;L4=1;   //P2=0xf7;     //1111 0111最右邊的數碼管顯示
        P0=DSY_CODE[d%10];           
        DelayMS(5);
        
        L1=1;L2=0;L3=1;L4=1;    //P2=0xfb;     //左邊第三個數碼管  1111 1011
        P0=DSY_CODE[d%100/10];           
        DelayMS(5);
        
        L1=1;L2=1;L3=0;L4=1;     //P2=0xfd;     //左邊第二個數碼管  1111 1101
        P0=DSY_CODE[d%1000/100]|0x80;   //加小數點顯示
        DelayMS(5);
        
        L1=1;L2=1;L3=1;L4=0;    //P2=0xfe;     //左邊第一個數碼管  1111 1110
        P0=DSY_CODE[d/1000];   
        DelayMS(5);

/*        if(d>=600 && d<=1000)
                { LED2=0;DelayMS(5);}
          else
                   LED2=1;  
*/
}

void main()
{
        uint temp;

        TMOD=0x02;
        TH0=0x14;
        TL0=0x00;
        IE=0x82;
        TR0=1;
        
        P1=0xbf; //通道選擇  ABC=110表示選IN3為輸入端 1011 1111 其中0對應的是C

        while(1)
        {
                ST=0;ST=1;ST=0;    //ADC啟動
                while(EOC==0);       //空循環;轉換結束信號,沒結束時EOC一直為0,轉換結束為高電平
               
                OE=1;                //輸出使能
                temp=P3*1.0/255*500;     //ADC0808輸出和輸入之間的關系,P3是輸出值,temp是輸入值0-5V
                temp=3.4*temp;       //轉換為壓力顯示,有可能是4位數
                Display_Result(temp);

                //如果壓力小于8M,啟動電機,啟動后3秒,如果壓力沒有上升,就報警。如果壓力大于12MPa,電機停止。
                if(temp<=800)
                { LED=0;   
                           //保存啟動時的壓力值
                           //保存啟動時的時間
                }
                if(temp>=1200)
                        LED=1;

                OE=0;       //IF判斷必須加在“使能”的中間,否則P3沒有值了
        }
}

void Timer0_INT() interrupt 1
{
        CLK=~CLK;
}


現在的問題是:
1、指示燈接在P1.7可以正常實現效果。但是接在P2.7就不正常,只閃一下或者不停的閃爍。我想應該是在數碼管位選時給的值導致的,如P2=0xfb  實際上把P1.7給置1(熄滅)了。
然后我把位選改成了只給定位選的4個端口,其它不賦值,但是P1.7還是不常亮,即使我在主程序開始給P2.7=0都不行,為什么?
2、啟動3秒后,如果壓力沒有上升就報警。  怎么實現?是不是要用到定時器?(定時器我還不是很理解)
首先要保存電機啟動時的壓力和時間,然后計時3秒,再比較當前壓力和保存的壓力。但是這個計時不能再用delay來實現了吧,delay好像是整個進程都停止的吧?

如果P2剩下的端口我不能用,好像沒有端口用來報警了?
位選問題.png
回復

使用道具 舉報

ID:96682 發表于 2019-3-14 11:04 | 顯示全部樓層
程序上 P2 端口設置與 LED2 有沖突,位顯用 4 個就行
回復

使用道具 舉報

ID:487930 發表于 2019-3-14 12:14 | 顯示全部樓層
本帖最后由 wtm_lxy 于 2019-3-14 15:44 編輯
wc86110 發表于 2019-3-14 11:04
程序上 P2 端口設置與 LED2 有沖突,位顯用 4 個就行

我把位選改成這樣了:L1=0;L2=1;L3=1;L4=1;   //P2=0xf7;  
但是D2還是 不常亮,不知道為什么?
回復

使用道具 舉報

ID:234075 發表于 2019-3-14 16:23 | 顯示全部樓層
1、你設置了兩個LED,分別是P17和P27,沖突時自己造成的,和數碼管的位選沒有關系,因為你的位選是單獨設置的L1\L2\L3\L4而不是直接對P2的操作,所以P2的其他幾個IO口是可以正常使用的;
2、使用定時器中斷是最好的選擇,主函數中設置定時器中斷(暫不啟動)--循環檢測到壓力小于8MPa時電機啟動,同時啟動定時器開始計時--計時達到3秒且壓力沒有上升,則報警并停止中斷(累加計時變量清零)
。這樣的程序最好自己先畫一個流程圖,然后按照流程圖進行程序的設計。

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:213173 發表于 2019-3-14 17:12 | 顯示全部樓層
/******************顯示采集的電壓**********************************/
//不影響P2高4位狀態的寫法
void Display_Result(uint d)
{
        static uint count=0;
        static uchar i=0;
        if(++count>=500)//不影響其他程序運行的計數延時
        {
                count=0;
                P0=0x00;//消隱
                switch(i)
                {
                        case 0: P2&=0xf0;P2|=0xf7;P0=DSY_CODE[d%10];i++; break;
                        case 1: P2&=0xf0;P2|=0xfb;P0=DSY_CODE[d%100/10];i++; break;
                        case 2: P2&=0xf0;P2|=0xfd;P0=DSY_CODE[d%1000/100]|0x80;i++; break;
                        case 3: P2&=0xf0;P2|=0xfe;P0=DSY_CODE[d/1000];i=0; break;
                }
        }
}
回復

使用道具 舉報

ID:487930 發表于 2019-3-15 08:23 | 顯示全部樓層
zhb2004xp 發表于 2019-3-14 16:23
1、你設置了兩個LED,分別是P17和P27,沖突時自己造成的,和數碼管的位選沒有關系,因為你的位選是單獨設置 ...

1、不好意思,這個沖突應該是沒有的了。我修改了單片機中的程序引用目錄,忘記更新對應關系了,所以修改了程序實際上沒有生效。
2、定時器我試試看,還需要更努力的學習。

非常感謝您的回復。
回復

使用道具 舉報

ID:487930 發表于 2019-3-15 08:47 | 顯示全部樓層
wulin 發表于 2019-3-14 17:12
/******************顯示采集的電壓**********************************/
//不影響P2高4位狀態的寫法
voi ...

非常感謝您的回復。
意思大概看懂了。
每計數500(延時多少?)就顯示一個數字
4個數字顯示完后,再循環。

順便請教一下:
P2&=0xf0;   //P2=P2&0xf0;   邏輯與,高4位不變,低4位清零
P2|=0xf7;    //P2=P2|0xf7;   邏輯或,相加,高4為置1,第4位為7
后面這句還是用邏輯與吧?保持高四位不變,只修改低4位的值
回復

使用道具 舉報

ID:213173 發表于 2019-3-15 09:48 | 顯示全部樓層
wtm_lxy 發表于 2019-3-15 08:47
非常感謝您的回復。
意思大概看懂了。
每計數500(延時多少?)就顯示一個數字

1.《每計數500(延時多少?)就顯示一個數字 》由于顯示程序被主程序調用,主循環周期基本固定,所以每計數500延時多少不確定,這只是看你的程序做的估計,實際調試時以數碼管不閃爍為準。一般在500us~2ms之間為宜。
2.邏輯與:&&,邏輯或:||,按位與:&、按位或:|。
P2&=0xf0;   //P2=P2&0xf0;   xxxx 0000
P2|=0xf7;    //P2=P2|0xf7;   xxxx 0111
回復

使用道具 舉報

ID:491172 發表于 2019-3-15 10:28 | 顯示全部樓層
從圖上可以看出,你p2.7是高電平,你這樣怎么能點亮二極管呢?應該是p2.7是低電平才對.
好好再想一想,重敲一下代碼!
回復

使用道具 舉報

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

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

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