|
20黑幣
第一次自己琢磨著寫程序,估計(jì)差得比較遠(yuǎn)
請(qǐng)大神們指導(dǎo)一下,謝謝
我覺得在架構(gòu)上有為,倒不是細(xì)節(jié)的問題,我理解得太淺了
現(xiàn)在感覺最大的問題是,機(jī)器如果進(jìn)入一個(gè)狀態(tài),怎么樣能讓它在保持運(yùn)行狀態(tài)的同時(shí)循環(huán)閃動(dòng)led,總感覺這兩個(gè)沒法各自運(yùn)行
因?yàn)檫\(yùn)行狀態(tài)是一個(gè)賦值就結(jié)束了,而led的閃動(dòng)需要不斷循環(huán)改變輸出的,這里總有抓不住的感覺
所以,請(qǐng)大家不吝賜教吧,謝謝
單片機(jī)源程序如下:
/*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; //低壓開關(guān)
sbit HIGH=P2^1; //高壓開關(guān)
sbit LED1=P1^0; //沖洗指示燈
sbit LED2=P1^1; //水滿指示燈
sbit LED3=P1^2; //缺水指示燈
sbit LED4=P1^3; //故障指示燈
sbit LED5=P1^4; //制水指示燈
sbit run=P1^5; //泵+進(jìn)水閥
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) //開機(jī)檢測(cè)有無自來水
delay_ms(10); //延時(shí)去抖
if(LOW==0)
{
status=1; //有水,沖洗
aa=0;
delay_ms(18000); //沖洗延時(shí)18秒
}
while(1)
{
display (qian,bai,shi,ge);
machine();
if(HIGH==0&LOW==0) //水桶沒滿,不缺水,則進(jìn)入制水
{
status=5;
numx=aa;
TR1=1; //這個(gè)計(jì)時(shí)器打開,計(jì)算制水運(yùn)行時(shí)間,水滿待機(jī)狀態(tài)就不計(jì)時(shí)了--這里后續(xù)還得增加濾芯使用時(shí)間的計(jì)量
//num=0;
if(num==2160) //連續(xù)6小時(shí)制水進(jìn)入故障
{
num=0;
status=4;
}
if(numx==2160)//累計(jì)6小時(shí)制水沖洗一次,或從頭開始執(zhí)行也可以
{
numx=0;
status=1;
}
}
else if(LOW==1) //缺水狀態(tài)
status=3;
else if(HIGH==1) //高壓動(dòng)作,水滿,同時(shí)清零連續(xù)制水6小時(shí)的計(jì)時(shí)數(shù)據(jù),關(guān)閉累計(jì)制水的計(jì)時(shí)器,但是把計(jì)時(shí)數(shù)據(jù)保存起來
{
num=0;
aa=numx;
TR1=0;
status=2;
}
}
}
void machine()
{
while(status==1)//沖洗狀態(tài),水泵和排水閥門打開
{
run=0;
flow=0;
if(num1==0)
LED1=~LED1;
}
while(status==2)//水滿,待機(jī)狀態(tài),水泵、排水閥門全部關(guān)閉
{
run=1;
flow=1;
if(num1==0)
LED2=~LED2;
}
while(status==3)//缺水,待機(jī),水泵和排水閥全部關(guān)閉
{
run=1;
flow=1;
if(num1==0)
LED3=~LED3;
}
while(status==4)//故障,就是連續(xù)制水沒有水滿狀態(tài),如果中間有過水滿待機(jī),則這個(gè)故障計(jì)時(shí)清零重新計(jì)算,后續(xù)還會(huì)增加一個(gè)常開觸點(diǎn),閉合后也會(huì)進(jìn)入故障待機(jī)狀態(tài)
{
run=1;
flow=1;
if(num1==0)
LED4=~LED4;
}
while(status==5)//正常制水,水泵打開,排水閥關(guān)閉
{
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) //每個(gè)中斷是50毫秒,200個(gè)中斷是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)//這里想監(jiān)視一下時(shí)間的,實(shí)際運(yùn)行時(shí)不需要這些顯示
{
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);
}
|
|