第一次自己琢磨着写程序,估计差得比较远
请大神们指导一下,谢谢
我觉得在架构上有为,倒不是细节的问题,我理解得太浅了
现在感觉最大的问题是,机器如果进入一个状态,怎么样能让它在保持运行状态的同时循环闪动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);
}
|