第一次自己琢磨著寫程序,估計差得比較遠
請大神們指導一下,謝謝
我覺得在架構上有為,倒不是細節的問題,我理解得太淺了
現在感覺最大的問題是,機器如果進入一個狀態,怎么樣能讓它在保持運行狀態的同時循環閃動led,總感覺這兩個沒法各自運行
因為運行狀態是一個賦值就結束了,而led的閃動需要不斷循環改變輸出的,這里總有抓不住的感覺
所以,請大家不吝賜教吧,謝謝
單片機源程序如下:
/*Main.c file generated by New Project wizard
*
* Created: 4 17 2019
* Processor: 89C52
* Compiler: Keil for 89C52
****/
#include <reg52.h>
#include <stdio.h>
#include "main.h"
#include "delay.h"
void machine();
sbit LOW=P2^0; //低壓開關
sbit HIGH=P2^1; //高壓開關
sbit LED1=P1^0; //沖洗指示燈
sbit LED2=P1^1; //水滿指示燈
sbit LED3=P1^2; //缺水指示燈
sbit LED4=P1^3; //故障指示燈
sbit LED5=P1^4; //制水指示燈
sbit run=P1^5; //泵+進水閥
sbit flow=P1^6; //排水閥
sbit dula=P2^6;
sbit wela=P2^7;
void display(uchar,uchar,uchar,uchar);
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar num1,num2,qian,bai,shi,ge,shine,LED,status;
uint num,numx,aa;
void main()
{
TMOD=0X11;
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
TH1=(65536-45872)/256;
TL1=(65536-45872)%256;
EA=1;
ET0=1;
ET1=1;
TR0=1;
num=0;
if(LOW==0) //開機檢測有無自來水
delay_ms(10); //延時去抖
if(LOW==0)
{
status=1; //有水,沖洗
aa=0;
delay_ms(18000); //沖洗延時18秒
}
while(1)
{
display (qian,bai,shi,ge);
machine();
if(HIGH==0&LOW==0) //水桶沒滿,不缺水,則進入制水
{
status=5;
numx=aa;
TR1=1; //這個計時器打開,計算制水運行時間,水滿待機狀態就不計時了--這里后續還得增加濾芯使用時間的計量
//num=0;
if(num==2160) //連續6小時制水進入故障
{
num=0;
status=4;
}
if(numx==2160)//累計6小時制水沖洗一次,或從頭開始執行也可以
{
numx=0;
status=1;
}
}
else if(LOW==1) //缺水狀態
status=3;
else if(HIGH==1) //高壓動作,水滿,同時清零連續制水6小時的計時數據,關閉累計制水的計時器,但是把計時數據保存起來
{
num=0;
aa=numx;
TR1=0;
status=2;
}
}
}
void machine()
{
while(status==1)//沖洗狀態,水泵和排水閥門打開
{
run=0;
flow=0;
if(num1==0)
LED1=~LED1;
}
while(status==2)//水滿,待機狀態,水泵、排水閥門全部關閉
{
run=1;
flow=1;
if(num1==0)
LED2=~LED2;
}
while(status==3)//缺水,待機,水泵和排水閥全部關閉
{
run=1;
flow=1;
if(num1==0)
LED3=~LED3;
}
while(status==4)//故障,就是連續制水沒有水滿狀態,如果中間有過水滿待機,則這個故障計時清零重新計算,后續還會增加一個常開觸點,閉合后也會進入故障待機狀態
{
run=1;
flow=1;
if(num1==0)
LED4=~LED4;
}
while(status==5)//正常制水,水泵打開,排水閥關閉
{
run=0;
flow=1;
if(num1==0)
LED5=~LED5;
}
}
void T0_time() interrupt 1
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
num1++;
if(num1==10)
{
num1=0;
}
}
void T1_time() interrupt 3
{
TH1=(65536-45872)/256;
TL1=(65536-45872)%256;
num2++;
if(num2==200) //每個中斷是50毫秒,200個中斷是10秒
{
num2=0;
numx++;
num++;
qian=numx/1000;
bai=numx%1000/100;
shi=numx%100/10;
ge=numx%10;
}
}
void display(char qian,uchar bai,uchar shi,uchar ge)//這里想監視一下時間的,實際運行時不需要這些顯示
{
dula=1;
P0=table[qian];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay_ms(3);
dula=1;
P0=table[bai];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay_ms(3);
dula=1;
P0=table[shi];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delay_ms(3);
dula=1;
P0=table[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xf7;
wela=0;
delay_ms(3);
}
|