|
最近在做單片機項目,網上找了許多相似的借鑒,但是C語言程序實在難以看懂全部,想修改程序功能能以下手,希望有大佬可以幫忙看一下下面這段代碼,解釋一下每段代碼、函數是什么意思,達到什么目的
捕獲10.PNG (151.65 KB, 下載次數: 31)
下載附件
2021-5-16 23:11 上傳
#include <REG52.H>
#define uchar unsigned char
#define uint unsigned int
#define qiang_ledon qiang_led=1;
#define qiang_ledoff qiang_led=0;
#define biao_ledon biao_led=1;
#define biao_ledoff biao_led=0;
#define ruo_ledon ruo_led=1;
#define ruo_ledoff ruo_led=0;
#define piao_ledon piao_led=1;
#define piao_ledoff piao_led=0;
#define sgan_ledon sgan_led=1;
#define sgan_ledoff sgan_led=0;
#define jin_ledon jin_led=1;
#define jin_ledoff jin_led=0;
#define pai_ledon pai_led=1;
#define pai_ledoff pai_led=0;
unsigned char code Tab[11]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //數碼管顯示0~9的段碼表
unsigned char int_time; //記錄中斷次數
unsigned char second; //儲存秒
uint t=0,tt=0;
sbit k1=P0^0;
sbit k2=P0^1;
sbit k3=P0^2;
sbit sg=P0^3;
sbit hk1=P0^4;
sbit hk2=P0^5;
sbit ledon=P0^7;
sbit qiang_led=P2^0;
sbit biao_led=P2^1;
sbit ruo_led=P2^2;
sbit piao_led=P2^3;
sbit sgan_led=P2^4;
sbit jin_led=P2^5;
sbit pai_led=P2^6;
sbit p30=P3^0;
sbit p31=P3^1;
sbit beepon=P2^7;
sbit sm1=P3^6;
sbit sm2=P3^7;
void delay2(void)
{
unsigned char m;
for(m=0;m<200;m++)
;
}
void delay1(int s)
{
int i;
for(;s>0;s--)
for(i=0;i<65;i++);
}
void delay(uint i)
{
uchar j;
for(i;i>0;i--)
for(j=255;j>0;j--);
}
void DisplaySecond(unsigned char k)
{
sm1=0; //P2.6引腳輸出低電平, DS6點亮
P1=Tab[k/10]; //顯示十位
delay2();
delay2();
sm1=1;
sm2=0; //P2.7引腳輸出低電平, DS7點亮
P1=Tab[k%10]; //顯示個位
delay2();
delay2();
P3=0xff; //關閉所有數碼管
P1=1; //顯示個位
delay2();
delay2();
}
void beep()
{
p30=0;
p31=0;
t=0;
while(1)
{
beepon^=1;
delay(300);
if(t>=80) break;
}
beepon=0;
biao_led=0;
}
void f_qiang()
{
qiang_ledon;
t=0;
tt=0;
int_time=0;
second=00;
while(1)
{
if(tt>=400) break;
t=0;
while(t<80&&tt<=400)
{
p31=0;
p30=1; //正轉 4s
DisplaySecond(second);
}
t=0; //反轉 4s
while(t<80&&tt<=400)
{
p30=0;
p31=1;
DisplaySecond(second);
}
}
p30=0;
p31=0;
}
void f_biao()
{
qiang_led=0;
biao_led=1;
t=0;
tt=0;
int_time=0;
second=00;
while(1)
{
if(tt>=400) break;
t=0;
while(t<60&&tt<=400)
{
p31=0;
p30=1; //正轉3s
DisplaySecond(second);
}
t=0; //反轉3s
while(t<60&&tt<=400)
{
p30=0;
p31=1;
DisplaySecond(second);
}
}
p30=0;
p31=0;
}
void f_ruo()
{
qiang_led=0;
biao_led=0;
ruo_led=1;
t=0;
tt=0;
int_time=0;
second=00;
while(1)
{
if(tt>=400) break;
t=0;
while(t<40&&tt<=400)
{ p31=0;
p30=1; //正轉2s
DisplaySecond(second);
}
t=0; //反轉 2s
while(t<40&&tt<=400)
{ p30=0;
p31=1;
DisplaySecond(second);
}
}
p30=0;
p31=0;
}
void f_piao()
{
qiang_ledoff;
biao_ledoff;
piao_ledon;
t=0;
tt=0;
int_time=0;
second=00;
while(1)
{
if(tt>=400) break;
t=0;
while(t<40&&tt<=400)
{ p31=0;
p30=1; //正轉2s
DisplaySecond(second);
}
t=0; //反轉2s
while(t<40&&tt<=400)
{ p30=0;
p31=1;
DisplaySecond(second);
}
}
p30=0;
p31=0;
piao_ledoff;
}
void pai_leds()
{
p30=0;
p31=0;
pai_led=1; //排水閥燈亮 等待霍爾開關2
while(hk2);
if(hk2==0) //如果閉合
pai_led=0; //排水燈滅
}
void jin()
{
p30=0;
p31=0;
jin_ledon;
while(hk1);
if(hk1==0)
jin_ledoff;
}
void sgan()
{
sgan_ledon; //甩干燈亮
t=0;
int_time=0;
second=00;
while(t<=400)
{
p31=0;
p30=1;
DisplaySecond(second);
}
sgan_ledoff;
}
void sgan1()
{
sgan_ledon;
t=0;
int_time=0;
second=00;
while(t<=400)
{
p31=0;
p30=1;
DisplaySecond(second);
}
piao_ledoff;
sgan_ledoff;
beep();
t=401;
}
void f_an1()
{
qiang_ledon; //方案1燈亮
jin(); //進入強洗
f_qiang(); //循環20S
delay1(4000);//延時4s
f_biao(); //循環20S
delay1(4000);//延時4s
f_ruo(); //循環20S
ruo_ledoff;
pai_leds();
delay1(1000); //延時1S 進入甩干
sgan(); //甩干20s
sgan_ledoff;
ruo_ledoff;
piao_ledoff;
jin();
delay1(1000); //延時1S 進入漂洗
f_piao(); //循環20S
sgan_ledoff;
piao_ledoff;
pai_leds();
delay1(1000); //延時1S 進入甩干
sgan1();//最終甩干20S
delay(500);//延時
beep();
}
void f_an2()
{
biao_ledon; //方案1燈亮
jin();
f_biao(); //循環20S
delay1(4000); //延時4S
f_ruo(); //循環20S
ruo_ledoff;
pai_leds();
delay1(1000); //延時1S 進入甩干
sgan(); //甩干20s
ruo_ledoff;
piao_ledoff;
jin();
delay1(1000); //延時1S 進入漂洗
f_piao(); //循環20S
sgan_led=0;
pai_leds();
delay1(1000); //延時1S 進入甩干
sgan();//最終甩干20s
delay(500);//延時5s
piao_led=0;
beep();
}
void f_an3()
{
ruo_led=1; //方案1燈亮
jin();
f_ruo(); //循環20S
ruo_ledoff;
pai_leds();
delay1(1000); //延時1S 進入甩干
sgan(); //甩干20S
ruo_ledoff;
piao_ledoff;
jin();
delay1(1000); //延時1S 進入漂洗
f_piao(); //循環20S
sgan_led=0;
pai_leds();
delay1(1000); //延時1S 進入甩干
sgan();//最終甩干20s
delay(500);//延時5s
piao_led=0;
p30=0;
beep();
}
int main(void)
{
TMOD=0x01; //方式1 16位計數器
TH0=-50000/256; //設定初值
TL0=-50000%256;
EA=1; //開總中斷
ET0=1; //開定時器0中斷
TR0=1; //啟動定時器0
P2=0;
int_time=0; //中斷次數初始化
second=00; //秒初始化
while(1)
{
if(k1==0)
{
delay(10);
if(k1==0)
{
f_an1();
}
}
if(k2==0)
{
delay(10);
if(k2==0)
{
f_an2();
}
}
if(k3==0)
{
delay(10);
if(k3==0)
{
f_an3();
}
}
if(sg==0)
{
delay(10);
if(sg==0)
{
sgan1();
}
}
}
return 0;
}
void time0() interrupt 1 using 1
{
int_time ++; //每來一次中斷,中斷次數int_time自加1
if(int_time==20) //夠20次中斷,即1秒鐘進行一次檢測結果采樣
{
int_time=0; //中斷次數清0
second++; //秒加1
}
TH0=-50000/256; //50000 =50ms中斷一次
TL0=-50000%256;
t++;
tt++;
}
|
-
-
洗衣機仿真.zip
2021-5-16 23:15 上傳
點擊文件名下載附件
131.02 KB, 下載次數: 6
|