|
我做一個根據(jù)液體壓力值進行電機相應(yīng)的實驗。
當壓力小于8MPa時電機啟動,啟動3秒后壓力沒有上升就報警。
當壓力大于12MPa時電機停止。
暫時用一個指示燈來模擬電機。用可調(diào)電阻模擬壓力輸入。
程序如下:
#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最右邊的數(shù)碼管顯示
P0=DSY_CODE[d%10];
DelayMS(5);
L1=1;L2=0;L3=1;L4=1; //P2=0xfb; //左邊第三個數(shù)碼管 1111 1011
P0=DSY_CODE[d%100/10];
DelayMS(5);
L1=1;L2=1;L3=0;L4=1; //P2=0xfd; //左邊第二個數(shù)碼管 1111 1101
P0=DSY_CODE[d%1000/100]|0x80; //加小數(shù)點顯示
DelayMS(5);
L1=1;L2=1;L3=1;L4=0; //P2=0xfe; //左邊第一個數(shù)碼管 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對應(yīng)的是C
while(1)
{
ST=0;ST=1;ST=0; //ADC啟動
while(EOC==0); //空循環(huán);轉(zhuǎn)換結(jié)束信號,沒結(jié)束時EOC一直為0,轉(zhuǎn)換結(jié)束為高電平
OE=1; //輸出使能
temp=P3*1.0/255*500; //ADC0808輸出和輸入之間的關(guān)系,P3是輸出值,temp是輸入值0-5V
temp=3.4*temp; //轉(zhuǎn)換為壓力顯示,有可能是4位數(shù)
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;
}
現(xiàn)在的問題是:
1、指示燈接在P1.7可以正常實現(xiàn)效果。但是接在P2.7就不正常,只閃一下或者不停的閃爍。我想應(yīng)該是在數(shù)碼管位選時給的值導(dǎo)致的,如P2=0xfb 實際上把P1.7給置1(熄滅)了。
然后我把位選改成了只給定位選的4個端口,其它不賦值,但是P1.7還是不常亮,即使我在主程序開始給P2.7=0都不行,為什么?
2、啟動3秒后,如果壓力沒有上升就報警。 怎么實現(xiàn)?是不是要用到定時器?(定時器我還不是很理解)
首先要保存電機啟動時的壓力和時間,然后計時3秒,再比較當前壓力和保存的壓力。但是這個計時不能再用delay來實現(xiàn)了吧,delay好像是整個進程都停止的吧?
如果P2剩下的端口我不能用,好像沒有端口用來報警了?
|
|