|
本帖最后由 wtm_lxy 于 2019-3-19 08:35 編輯
我做采集模擬電壓控制指示燈的效果:
temp是采集到的模擬電壓值,tv是保存的臨時值。
我想實現的效果是:
當temp<=800時打開計數器1,同時保留當前的temp值;當計時3秒后,比較當前temp值與前面保存值的差值。
從反應效果看,count一直沒有值,好像是終端1沒有執行
是不是優先級導致它沒有執行?
這個該怎么辦?
下面是完整的單片機程序代碼:
#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; //ADC0808的控制端口
sbit ST=P1^2;
sbit EOC=P1^1;
sbit OE=P1^0;
sbit LED=P1^7; //指示燈,電機轉動指示燈亮,不轉時熄滅
sbit L0=P2^0; //數碼管位選,4個數碼管
sbit L1=P2^1;
sbit L2=P2^2;
sbit L3=P2^3;
sbit LED2=P2^7; //報警指示燈
uint count; //定時計數
void DelayMS(uint ms)
{
uchar i;
while(ms--)
for(i=0;i<120;i++);
}
/******************顯示采集的電壓**********************************/
void Display_Result(uint d)
{
P0=0x00;//消隱 加了這句后第一位不閃爍了。!
L3=0;L2=1;L1=1;L0=1; //P2=0xf7; //1111 0111最右邊的數碼管顯示
P0=DSY_CODE[d%10];
DelayMS(5);
L3=1;L2=0;L1=1;L0=1; //P2=0xfb; //左邊第三個數碼管 1111 1011
P0=DSY_CODE[d%100/10];
DelayMS(5);
L3=1;L2=1;L1=0;L0=1; //P2=0xfd; //左邊第二個數碼管 1111 1101
P0=DSY_CODE[d%1000/100]|0x80; //加小數點顯示
DelayMS(5);
L3=1;L2=1;L1=1;L0=0; //P2=0xfe; //左邊第一個數碼管 1111 1110
P0=DSY_CODE[d/1000];
DelayMS(5);
}
void main()
{
uint temp;
uint tv;
EA=1; //開總中斷
TMOD=0x10; //使用定時器T1的模式1
ET1=1; //定時器T1中斷允許
TH1=(65536-1000)/256; //定時器T1的高8位賦初值
TL1=(65536-1000)%256; //定時器T1的高8位賦初值
TR1=0;
TMOD=0x02;
TH0=(65536-3500)/256; //0x14;
TL0=(65536-3500)%256; //0x00;
IE=0x82;
TR0=1;
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是輸入值
temp=3.4*temp; //轉換為壓力顯示,有可能是4位數
Display_Result(temp);
if(temp<=800)
{ LED=0; //電機啟動指示燈
TR1=1; //打開計時器2
tv=temp; //保存啟動時的壓力值
}
if(count==3000)
{
count=0;
TR1=0;
if(temp-tv<=30 && LED==0) //必須加上一個判斷,電機已經轉動并且增量小于30
{
LED2=0; //啟動后3秒,如果壓力沒有上升,就報警
}
}
if(temp>=1200)
{LED=1; LED2=1;}
OE=0; //IF判斷必須加在“使能”的中間,否則P3沒有值了
}
}
void Timer0() interrupt 1
{
CLK=~CLK;
}
void Time1() interrupt 3 using 0 //“interrupt”聲明函數為中斷服務函數
//其后的3為定時器T1的中斷編號;0表示使用第0組工作寄存器
{
count++; //自加1 每次1ms
TH1=(65536-1000)/256; //定時器T1的高8位重新賦初值
TL1=(65536-1000)%256; //定時器T1的高8位重新賦初值
}
|
|